Back to Unix_Utilities

See Also OpenSSH公开密钥密码学

OpenSSL

OpenSSL是套开放源代码的软件库包,实现了SSL与TLS协议。其主要库是以C语言所写成,实现了基本的加密功能。OpenSSL囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

OpenSSL可以运行在绝大多数类Unix操作系统上(包括Solaris,Linux,Mac OS X与各种版本的开放源代码BSD操作系统),OpenVMS与 Microsoft Windows。它也提供了一个移植版本,可以在IBM i(OS/400)上运作。

此软件是以Eric Young以及Tim Hudson两人所写的SSLeay为基础所发展的,SSLeay随着两人前往RSA公司任职而停止开发。

虽然此软件是开放源代码的,但其授权书条款与GPL有冲突之处,故GPL软件使用OpenSSL时(如Wget)必须对OpenSSL给予例外。

1. 历史

OpenSSL项目建立于1998年,为了创造出一套能够在互联网上免费使用的加密工具。2014年,全球三分之二的网络服务器都在使用它。OpenSSL项目管理团队是四个欧洲人,整个开发团队11位成员,其中10个志愿者;只有一个全职员工,斯蒂芬•汉森,首席开发人员。

这个项目的预算每年不到100万美元,在一定程度上依赖于捐赠。前军事顾问史蒂夫侯爵在马里兰州开始捐款和咨询合同,获得的赞助主要来自美国国土安全部和美国国防部。

1.1. 发布历史

OpenSSL版本历史

版本

发布时间

备注

0.9.1c

1998年12月23日

0.9.2c

1999年3月22日

* 取代0.9.1c

0.9.3

1999年5月25日

* 取代0.9.2b

0.9.4

1999年8月9日

* 取代0.9.3a

0.9.5

2000年2月28日

* 取代0.9.4

0.9.6

2000年9月25日

* 取代0.9.5a

0.9.7

2002年12月31日

* 取代0.9.6h

0.9.8

2005年7月5日

* 取代0.9.7h

1.0.0

2010年3月29日

* 取代0.9.8x

1.0.1

2012年3月14日

* 取代1.0.0e
* 支持TLS v1.2
* 支持SRP

1.0.2

2015年1月22日

* 取代1.0.1l
* 支持DTLS v1.2

1.1.0

2016年5月3日

* 当前版本
* 取代1.0.2h

➜  ~ brew install openssl@1.1
...
/usr/local/Cellar/openssl@1.1/1.1.0f (6,421 files, 15.5MB)
  Poured from bottle on 2017-06-30 at 20:09:38

1.2. 著名缺陷

https://en.wikipedia.org/wiki/OpenSSL#Notable_vulnerabilities

1.2.1. Heartbleed

heartbeat (CVE-2014-0160)

OpenSSL 1.0.1版本(不含1.0.1g)含有一个严重漏洞,可允许攻击者读取服务器的内存信息。该漏洞影响三分之二的活跃网站。

1.2.2. CCS Injection Vulnerability

CCS Injection Vulnerability (CVE-2014-0224)

v1.0.1及之前版本需要升级

1.2.3. ClientHello sigalgs DoS

This vulnerability (CVE-2015-0291)

仅 v1.0.2 受攻击

1.2.4. Key Recovery Attack on Diffie Hellman small subgroups

This vulnerability (CVE-2016-0701)

仅 v1.0.2 受攻击

2. 算法

OpenSSL支持多种不同的加密算法

加密:

散列函数:

公开密钥加密:

3. 功能

3.1. 基本功能

OpenSSL整个软件包大概可以分成三个主要的功能部分:Manpages for 1.1.0

OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。

作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。

3.2. 辅助功能

BIO机制是OpenSSL提供的一种高层IO接口,该接口封装了几乎所有类型的IO接口,如内存访问、文件访问以及Socket等。这使得代码的重用性大幅度提高,OpenSSL提供API的复杂性也降低了很多。 OpenSSL对于随机数的生成和管理也提供了一整套的解决方法和支持API函数。随机数的好坏是决定一个密钥是否安全的重要前提。

OpenSSL还提供了其它的一些辅助功能,如从口令生成密钥的API,证书签发和管理中的配置文件机制等等。如果你有足够的耐心,将会在深入使用OpenSSL的过程慢慢发现很多这样的小功能,让你不断有新的惊喜。

3.3. 常用命令介绍

3.3.1. gendsa

https://www.openssl.org/docs/man1.1.0/apps/gendsa.html

The gendsa command generates a DSA private key from a DSA parameter file (which will be typically generated by the openssl dsaparam command).

# 指定私钥加密方式,生成过程中输入密码
➜  /tmp openssl genrsa -out ca.key -des3 2048
Generating RSA private key, 2048 bit long modulus
.....+++
................................+++
e is 65537 (0x10001)
Enter pass phrase for ca.key:
Verifying - Enter pass phrase for ca.key:
# 不指定加密算法,不加密私钥
➜  /tmp openssl genrsa -out server.key 2048      
Generating RSA private key, 2048 bit long modulus
.........+++
..............+++
e is 65537 (0x10001)

3.3.2. req

https://www.openssl.org/docs/man1.1.0/apps/req.html

The req command primarily creates and processes certificate requests in PKCS#10 format. It can additionally create self signed certificates for use as root CAs for example.

## -x509 跳过生成certificate request,直接生成自签名证书
➜  /tmp openssl req -x509 -new -key ca.key -out ca.crt -days 730 -subj /CN="li3huo.com"
Enter pass phrase for ca.key:
## 生成certificate request,为x509、ca命令做准备
➜  /tmp server_name=172.16.60.41
➜  /tmp openssl req -new -out server.req -key server.key -subj /CN=$server_name

3.3.3. x509

https://www.openssl.org/docs/man1.1.0/apps/x509.html

The x509 command is a multi purpose certificate utility. It can be used to display certificate information, convert certificates to various forms, sign certificate requests like a "mini CA" or edit certificate trust settings.

# 用CA的私钥签名的证书
➜  /tmp openssl x509 -req -in server.req -out server.crt -CAkey ca.key -CA ca.crt -days 365 -CAcreateserial -CAserial serial
Signature ok
subject=/CN=172.16.60.41
Getting CA Private Key
Enter pass phrase for ca.key:
# 用服务器私钥签名的证书
➜  /tmp openssl x509 -req -in server.req -out server1.crt -signkey server.key -days 365
Signature ok
subject=/CN=172.16.60.41
Getting Private key

3.3.4. version cmd

https://www.openssl.org/docs/man1.1.0/apps/version.html

➜  ota_ios openssl version
OpenSSL 1.1.0f  25 May 2017
➜  ota_ios openssl version -a 
...
all information, this is the same as setting all the other flags.

4. Command Samples

4.1. Self-signed SSL Certificate

## Create Host Key
➜  tmp  openssl genrsa -out li3huo.com.key 2048
Generating RSA private key, 2048 bit long modulus
......+++
...........................................................+++
e is 65537 (0x10001)
## Create Certificate Request
➜  tmp  openssl req -new -key li3huo.com.key -out li3huo.com.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:li3huo.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
## Create SSL Certificate
➜  tmp  openssl x509 -req -days 365 -in li3huo.com.csr -signkey li3huo.com.key -out li3huo.com.crt
Signature ok
subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=li3huo.com
Getting Private key

4.2. Nginx HTTPS Self-signed

开启HTTPS的第一步,就是需要先生成ssl证书

➜  ssl server_name=172.16.60.41
# 1. 生成服务器的私钥
➜  ssl openssl genrsa -out server.key 2048
# 2. 生成服务器签署申请(Common Name必须为服务器的ip或域名)
➜  ssl openssl req -new -key server.key -out server.csr \
-subj "/C=CN/ST=BeiJing/L=BeiJing/O=Example Inc./OU=Web Security/CN=$server_name/emailAddress=admin@li3huo.com"
# 3. 生成CA私钥
➜  ssl openssl genrsa  -out ca.key 2048
# 4. 用CA的私钥产生CA的自签署证书
➜  ssl openssl req -new -x509 -days 1095 -key ca.key -out ca.crt \
-subj "/C=CN/ST=BeiJing/L=BeiJing/O=Example Inc./OU=Web Security/CN=$server_name/emailAddress=admin@li3huo.com"
# 5. 用CA证书创建服务器证书
➜  ssl mkdir -p demoCA/newcerts; touch demoCA/index.txt; echo 01 > demoCA/serial
➜  ssl openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key

然后在Nginx中就可以这样配置了

ssl_certificate     /etc/ssl/server.crt;
ssl_certificate_key /etc/ssl/server.key;

浏览器中安装ca.crt

4.3. 生成SSL数字安全证书

PKCS#10 X.509 Certificate Signing Request (CSR) ManagementRequest / pkcs10 / req

config file: 168.cnf

[req]
distinguished_name = test
req_extensions     = v3_ca

[test]
countryName = Country Name (2 letter code)
countryName_default = CN
countryName_min = 2
countryName_max = 2

localityName = BJ city
organizationalUnitName = li3huo.com

commonName = li3huo
commonName_max = 64

emailAddress = admin@li3huo.com
emailAddress_max = 40

[v3_ca]
# vi /usr/local/etc/openssl/openssl.cnf
subjectAltName = IP:172.16.100.186

➜  ~  openssl req \
        -newkey rsa:4096 -nodes -sha256 -keyout 168.key \
        -x509 -days 365 -config 168.cnf -out 168.crt

5. Reference


CategoryTool

MainWiki: OpenSSL (last edited 2017-08-23 23:47:36 by twotwo)