目录
SSL/TLS client/server 交互过程浅析
握手阶段
server 下发证书给 client, 证书中包含 server 的公钥(public key), 但证书是使用第三方私钥加密的(这里的私钥不是 server 的私钥,通常为 CA 机构的私钥,不做特殊说明,本文默认证书是 CA 机构签发的证书),client 拥有 CA 机构的公钥,因此可以解密证书,获取 server 下发的公钥。
client 获取到 server 的公钥之后使用该公钥加密 premaster secret 发送给 server, server 使用自己的私钥解密 premaster secret.
client 和 server 使用相同的算法将 premaster secret 转换成 master secret, 该密钥用于通信阶段。
通信阶段
client 和 server 使用握手阶段协商的 master secret 加密数据。
综上,非对称加密、证书用于握手阶段,对称加密用于通信阶段。
向 CA 机构申请 SSL/TLS 证书
由上文可知,证书中包含了 server 的公钥,因此,向 CA 机构申请证书时需要提交 server 的公钥, CA 机构用自己的私钥加密该公钥及其他信息生成证书。
以天威诚信为例:
使用 AutoCSR 工具生成私钥(server.key)和证书请求文件(certreq.csr, 其中包含了 server 的公钥及其他相关信息), server.key 需要自己保管,certreq.csr 需要提交给天威诚信,天威诚信会返回如下信息:
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
其中包含了三个证书,我们将其保存为 server.crt.
配置 Nginx
将 server.key 和 server.crt 放到 nginx 配置文件目录下,nginx 配置文件内容如下:
server {
listen 2107 ssl;
server_name www.example.com;
# Enable all protocols except SSL 2 and SSL 3, which are obsolete and insecure.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# Have the server decide what suites to use.
ssl_prefer_server_ciphers on;
# This cipher suite configuration uses only suites that provide forward security, in the order that provides the best performance.
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
# Server private key.
ssl_certificate_key server.key;
# Certificates; server certificate first, followed by all required intermediate certificates, but excluding the root.
ssl_certificate server.crt;
# ...
}