之前分享过一篇文章: https://www.clarkhu.net/?p=1250 ,生成证书请求,私钥及证书脚本,这篇文章有一个弊端,因为只生成了自签名的证书,并没有生成CA根证书,所以证书的小绿锁上是有问题的,一直显示不安全,想要生成安全的自签名证书,必须要生成私有的CA根证书,然后用CA根证书生成服务器的证书,这样生成的自签名证书才能在浏览器地址栏,显示成绿色。(只要把CA根证书导入浏览器就可以受信了)
总体流程如下:
1.设置openssl的环境变量,OPENSSL_CONF=openssl.cnf路径(这一步不是必需的,可以后续指定好路径也行),查看openssl.cnf的路径:openssl version -a [/etc/pki/tls]
2.将openssl配置文件中的 req_extensions = v3_req注释取消掉
3.去掉[req_distinguished_name]里0.xxx开头的部分
4.修改[ v3_req ]和[ v3_ca ]内容
[ v3_req ]
extendedKeyUsage=serverAuth(增强型密钥用法,服务端验证)
subjectAltName = @alt_names(使用者备用名称)
[ v3_ca ]
basicConstraints = CA:true(使用基本约束)
5.增加[ alt_names ],里面的内容可以增加多个DNS.X,IP.X,其中IP可以不填,但是DNS一定要和你的网站域名能匹配,比如你的网站是www.my.com,那么你可以设置为DNS.1=*.my.com
[ alt_names ]
DNS.1 = 127.0.0.1
IP.1 = 127.0.0.1
6.要生成一个根证书私钥
- -aes256代表加密算法,还可以选择des3等
- 1024代表加密强度
- -passout pass:123456 这里直接输入密码
openssl genrsa -passout pass:123456 -aes256 -out ca_private.key 2048
7.使用根证书私钥生成csr(证书签名请求)
openssl req -passin pass:123456 -new -key ca_private.key -out ca.csr -subj "/C=CN/ST=ST/L=CITY/O=o/OU=ou/CN=cn"
8.使用根证书私钥和csr生成根证书
- -days后面是天数,尽可能填大一点
- 天数后面是使用的算法,不要选择sha1,谷歌浏览器会认为不安全
- -extensions表示扩展属性
- -extfile表示扩展属性所在的文件
openssl x509 -req -passin pass:123456 -days 18250 -sha256 -signkey ca_private.key -extensions v3_ca -extfile /etc/pki/tls/openssl.cnf -in ca.csr -out ca.cer
上面这空虚ca.cer就是CA的根证书,之后需要导入到浏览器的受信根证书区域的
9.生成服务端证书私钥
openssl genrsa -out server_private.key 2048
10.生成服务端证书签名请求
openssl req -new -key server_private.key -out server.csr -subj "/C=CN/ST=ST/L=CITY/O=o/OU=ou/CN=cn"
11.生成服务端证书
openssl x509 -req -passin pass:123456 -days 18250 -sha256 -extensions v3_req -extfile openssl.cnf -CA ca.cer -CAkey ca_private.key -CAserial ca.srl -CAcreateserial -in server.csr -out server.cer
12.CER转PEM
openssl x509 -in server.cer
最后的效果:
PS: 要把ca.cer导入到受信根证书区域才能看到证书链