SSL与证书相关配置

提到安全套阶层SSL组件,大家可能首先想到的是OpenSSL, 我自己的电脑上缺省装的是LibreSSL, 这是OpenSSL的一个分支版本,在原有基础上,做了很多安全方面的改进,以及代码优化,现在很多操作系统都启用LibreSSL作为系统内置的SSL库,比如MacOSX,OpenBSD, Alpine等,操作上与OpenSSL基本一致。

对于这个版本的openssl, 可通过下面的官方连接:https://www.libressl.org/ 下载使用, 下载完成安全后的LibreSSL主要包含以下几个部分:

  • libcrypto: 加密相关的基础库
  • libssl: TLS库
  • libtls: 新的TLD库
  • 以及相关辅助工具等比如 openssl, nc,ocspcheck等

系统的内置LibreSSL版本如下:

➜  ~ openssl version
LibreSSL 2.8.3

1. 配置web服务

首先CA系统和域名HTTPS配置的主要流程:

  • 本地生成个人密钥对
  • 根据密钥信息及个人信息创建CSR
  • 发送CSR给Root CA签名
  • 获取签名后的证书,配置在web服务器
  • 浏览器内置Root CA证书
  • 浏览器验证证书是否是可信的Root CA签名
  • 验证成功或失败
1.1 生成密钥对

生成密钥对时候,建议使用RSA2048 及以上或者ECDSA256及以上, 比如Google.com和Amazon.com都是使用的RSA2048,淘宝则使用的是ECDSA256位实现

比如我要为我自己的http://zhangmingkai.cn/网站生成一个密钥对文件,生成方式如下, 第一个命令是生成对应的私钥文件。其中aes128指定了密钥生成后加密的方式,导出密钥为网站名称.key文件。

➜ openssl genrsa -aes128 -out zhangmingkai.cn.key 2048

生成后可以查看:

➜ openssl rsa -text -in zhangmingkai.cn.key
Enter pass phrase for zhangmingkai.cn.key: (输入之前创建时候的加密密钥)
Private-Key: (2048 bit)
modulus:
   ...
publicExponent: 65537 (0x10001)
privateExponent:
	 ...
	 
	 

根据私钥生成对应的公钥文件,只需要传递其私钥文件即可。

➜ openssl rsa -in zhangmingkai.cn.key -pubout -out zhangmingkai.cn.public.key
➜ cat zhangmingkai.cn.public.key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyqtv6hnA48dQc/IoXgBB
ljBSTJmaIXIWffWoZ+rlboJUOQdRw3K7CY+JJyY6KLri5JOvJtZOMNbhhPhwMhFt
3MqbeF9p8v1+YXgI/646GpmpC6X7SV/ZIO0nHO63E4Hb7STFF4fiXL6kQRsc6XLM
7fJ2wOu0HhzaSpF+PH9v4fO0ga3E6kcTZ+Om7I2N9J2fadefqixh7Z6kvOiZ1wlV
az41cySfRxIn9bRLiR3Jq/MQw/cJKPv8oRXOHkQtjFkV5xiwvlGLYfsuBHD45Tta
6BPsq4aKCj5gV/QGO1ibtdH3D9M0WR+k3cVurBgtudkTDAFbc0O/Qz3DsoobPL2n
9QIDAQAB
-----END PUBLIC KEY-----
1.2 创建CSR

证书签名申请CSR,就是用于提交给CA认证的相关文件,这个文件里面包含你之前创建的公钥信息,以及申请人的相关信息。

生成CSR的方式如下,创建过程中会要求写入一些个人信息,同时如果想要空的话则输入一个"."即可, 直接回车可能会被设置为缺省值。

➜  ssl openssl req -new -key zhangmingkai.cn.key -out zhangmingkai.cn.csr
Enter pass phrase for zhangmingkai.cn.key:

-----
Country Name (2 letter code) []:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) []:beijing
Organization Name (eg, company) []:zhangmingkai.cn
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []:zhangmingkai.cn
Email Address []:zhangmingkai.1989@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:

检查CSR文件的方式, 里面可以看到一些之前输入的信息是否准确, 同时除了交互式生成外,还可以直接使用配置文件进行生成,这种配置文件的方式更容易进行远程管理和维护。

[req]
default_bits = 2048
distinguished_name = dn
prompt             = no
input_password     = PASSWORD

[dn]
C="CN"
ST="BJ"
L="beijing"
O="zhangmingkai.cn"
emailAddress="zhangmingkai.1989@gmail.com"
CN="zhangmingkai.cn"

[req_ext]
subjectAltName = DNS:zhangmingkai.cn, DNS:*.zhangmingkai.cn

根据配置文件生成csr命令:

➜   openssl req -new -config csr.config -key zhangmingkai.cn.key -out zhangmingkai.cn.v2.csr

查看请求文件信息的命令:

➜   openssl req -text -in zhangmingkai.cn.v2.csr -noout
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=CN, ST=BJ, L=beijing, O=zhangmingkai.cn, CN=zhangmingkai.cn/emailAddress=zhangmingkai.1989@gmail.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
...

        Attributes:
        Requested Extensions:
            X509v3 Subject Alternative Name:
                DNS:zhangmingkai.cn, DNS:*.zhangmingkai.cn

上面的配置中我们创建的证书,可以允许我们认证除了zhangmingkai.cn以及*.zhangmingkai.cn子域名,这在扩展字段中的DNS定义完成。这里如果不存在扩展信息的话,则使用上面的CN字段完成合法域名校验。

1.3 创建自签名证书

如果系统仅用于内部使用,可以生成自签名证书,该证书可以不用去外部的CA去获取签名信息,自己直接完成。只不过浏览器在第一次访问被该证书签名的网站的时候会告警,配置例外即可。

➜ openssl x509 -req -days 365 -in zhangmingkai.cn.csr -signkey zhangmingkai.cn.key -out zhangmingkai.cn.crt
Signature ok
subject=/C=CN/ST=BJ/L=beijing/O=zhangmingkai.cn/CN=zhangmingkai.cn/emailAddress=zhangmingkai.1989@gmail.com
Getting Private key
Enter pass phrase for zhangmingkai.cn.key:

2. 创建和使用根CA证书

有时候我们需要在内部部署一套安全的可信任环境,而且不想借助于外部的CA机构,这时候我们可以考虑搭建一套内部环境独立的CA系统。独立的CA系统相对于自签名证书,还可以实现服务器与客户端的相互认证,实现双向的安全验证。针对根CA的安全性,如果可以的话尽量离线保存根服务器的CA证书。

➜  openssl genrsa -aes128 -out myCA.key 2048

➜  openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem
Enter pass phrase for myCA.key:
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) []:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) []:ZhangMingkai
Organizational Unit Name (eg, section) []:ZhangMingkai
Common Name (eg, fully qualified host name) []:zhangmingkai.cn
Email Address []:zhangmingkai.1989@gmail.com

这里我们创建了一个根密钥以及对应的证书文件myCA.pem, 为了让该证书可以被操作系统和浏览器接收我们还需要进行一些安装操作

Mac 系统直接双击安装即可,对于Linux系统安装证书需要如下的操作

sudo mkdir /usr/local/share/ca-certificates/extra
sudo cp myCA.pem /usr/local/share/ca-certificates/extra/root.cert.crt
sudo update-ca-certificates

3. 签名证书

创建完成和分发根证书后,既可以用该证书来完成其他证书的签名工作,比如我们创建的个人web证书

➜ openssl x509 -req -in zhangmingkai.cn.v2.csr -CA ./root/myCA.pem -CAkey ./root/myCA.key -CAcreateserial -out zhangmingkai.cn.crt -days 365 -sha256
Signature ok
subject=/C=CN/ST=BJ/L=beijing/O=zhangmingkai.cn/emailAddress=zhangmingkai.1989@gmail.com/CN=zhangmingkai.cn
Getting CA Private Key
Enter pass phrase for ./root/myCA.key:

生成的签名证书:zhangmingkai.cn.crt, 这时候我们可以通过openssl命令完成认证:

➜  ssl openssl verify -CAfile root/myCA.pem zhangmingkai.cn.crt
zhangmingkai.cn.crt: OK

附录

1. OpenSSL的性能测试

可以考虑使用-multi来设置多核心支持,另外该命令还可以用来比较不同版本的测试新能

➜  openssl speed rc4 aes rsa ecdh sha

LibreSSL 2.8.3
built on: date not available
options:bn(64,64) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: information not available
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
sha1             85636.61k   246906.53k   534083.87k   737987.11k   894517.71k
rc4             751454.46k   788549.14k   634355.56k   607278.34k   599918.59k
aes-128 cbc     157320.20k   174059.98k   178689.21k   180313.98k   181015.24k
aes-192 cbc     133500.17k   145786.24k   149016.92k   149480.37k   150578.50k
aes-256 cbc     116261.82k   125276.06k   127486.61k   128036.35k   128724.84k
sha256           72276.59k   154409.04k   258984.91k   309180.78k   335351.56k
sha512           55687.69k   221247.44k   328161.67k   447902.69k   515695.58k
                  sign    verify    sign/s verify/s
rsa  512 bits 0.000043s 0.000006s  22998.3 181487.2
rsa 1024 bits 0.000152s 0.000014s   6583.0  70253.2
rsa 2048 bits 0.000877s 0.000048s   1140.7  20889.3
rsa 4096 bits 0.006652s 0.000180s    150.3   5553.6
                              op      op/s
 160 bit ecdh (secp160r1)   0.0002s   4452.7
 192 bit ecdh (nistp192)   0.0003s   3776.6
 224 bit ecdh (nistp224)   0.0004s   2677.5
 256 bit ecdh (nistp256)   0.0004s   2363.9
 384 bit ecdh (nistp384)   0.0009s   1072.4
 521 bit ecdh (nistp521)   0.0022s    462.8
 163 bit ecdh (nistk163)   0.0012s    862.2
 233 bit ecdh (nistk233)   0.0024s    412.6
 283 bit ecdh (nistk283)   0.0038s    263.3
 409 bit ecdh (nistk409)   0.0091s    109.9
 571 bit ecdh (nistk571)   0.0199s     50.1
 163 bit ecdh (nistb163)   0.0012s    850.6
 233 bit ecdh (nistb233)   0.0024s    409.6
 283 bit ecdh (nistb283)   0.0038s    264.3
 409 bit ecdh (nistb409)   0.0091s    110.3
 571 bit ecdh (nistb571)   0.0199s     50.3
2. 客户端SSL请求

下面的请求将打印整个的证书链,并允许用户去输入需要的URL和HTTP版本号等。

➜  ssl  openssl s_client -connect www.bing.com:443
CONNECTED(00000006)
depth=2 C = IE, O = Baltimore, OU = CyberTrust, CN = Baltimore CyberTrust Root
verify return:1
depth=1 C = US, ST = Washington, L = Redmond, O = Microsoft Corporation, OU = Microsoft IT, CN = Microsoft IT TLS CA 2
verify return:1
depth=0 CN = www.bing.com
verify return:1
---
...
3. 一些针对HTTPS服务器的优化措施

当前客户端需要三个往返的时间才能完成整个HTTPS的验证,其中包含1.5次的TCP三次握手,以及四次TLS握手交换,导致整个的传输延迟时间较大。为了降低短连接下的服务器性能,至少可以从几个方面考虑:

  • TCP拥塞窗口设置
  • 禁用TCP慢启动
  • 长连接(同时需要考虑不同浏览器的超时时间设置)
  • SPDY, HTTP 2.0
  • TCP FastOpen技术
  • Quic技术(基于UDP的可靠连接技术)
  • 减少证书大小
  • 选择更快的加密组件传输

发表评论

邮箱地址不会被公开。 必填项已用*标注