openssl 是目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。
以下为测试正式生成过程而做的实验,基本模拟了整个证书的生成过程。
第一步,为服务器端和客户端准备公钥、私钥
生成服务器端私钥
命令:
openssl genrsa -out server_pri.key 1024
// 生成服务器端公钥
命令:
openssl rsa -in server_pri.key -pubout -out server_pub.pem
第二步,生成 CA 证书
// 生成 CA 私钥
命令:
openssl genrsa -out ca.key 1024
命令:
openssl req -new -key ca.key -out ca.csr
//会出来一个填写资料的界面,Common Name这一项,是最后可以访问的域名
命令:
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
第三步,生成服务器端证书
// 服务器端需要向 CA 机构申请签名证书,在申请签名证书之前依然是创建自己的 CSR 文件
命令:
openssl req -new -key server_pri.key -out server.csr
// 向自己的 CA 机构申请证书,签名过程需要 CA 的证书和私钥参与,最终颁发一个带有 CA 签名的证书
命令:
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
同样会有信息填写,照旧写就好了
第四步,生成cer文件
//使用openssl 进行转换
命令:
openssl x509 -in server.crt -out server.cer -outform der
如果完成,就会得到这么9个文件
第五步 配置到服务器端nginx
server {
listen 80;
server_name www.cc.com;
rewrite ^(.*)$ https://www.bb.com $1 permanent;
}
server {
listen 80;
server_name www.bb.com;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
server {
listen 443;
server_name www.test.com;
ssl on;
ssl_certificate /data/csr/server.crt;
ssl_certificate_key /data/csr/server_pri.key;
location / {
root /data/bb;
index index.html index.htm;
}
}
解决证书链问题
证书链可以有任意环节的长度,所以在三节的链中,信任锚证书CA 环节可以对中间证书签名;中间证书的所有者可以用自己的私钥对另一个证书签名。CertPath API 可以用来遍历证书链以验证有效性,也可以用来构造这些信任链。
Web 浏览器已预先配置了一组浏览器自动信任的根 CA 证书。来自其他证书授权机构的所有证书都必须附带证书链,以检验这些证书的有效性。证书链是由一系列 CA 证书发出的证书序列,最终以根 CA 证书结束。
我们一般会有三种证书: RootCA.crt(rCA,被信任的根证书)、IntermediateCA.crt(mCA,某些厂商有多个中间证书)、server.crt(sCA,通过CSR签下来的证书)
为了让浏览器能够信任我们的证书,我们需要配置一条完整的证书链,证书链由sCA和mCA构成就好,rCA是浏览器内置,不需要服务器给提供。
nginx配置证书链的时候,就是指定一个证书文件,这个文件中含有我们整个证书链的所有证书就好,证书合并的时候,正确的合并方法是把 mCA 合并到 sCA 中。当有多个 mCA 文件时,mCA 从下级到上级(根证书为最上级)依次合并到 sCA 中。
-----BEGIN CERTIFICATE-----
...... sCA ......
------END CERTIFICATE------
-----BEGIN CERTIFICATE-----
...... mCA (lower) ......
------END CERTIFICATE------
-----BEGIN CERTIFICATE-----
...... mCA (upper) ......
------END CERTIFICATE------
-----BEGIN CERTIFICATE-----
[ROOT CERTIFICATE]
-----END CERTIFICATE-----