目录
证书生成流程
生成CA
# 生成CA私钥(ca.key)
openssl genrsa -des3 -out ca.key 2048
# 生成CA证书签名请求(ca.csr)
openssl req -new -key ca.key -out ca.csr
# 生成自签名CA证书(ca.cert)
openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt
生成Server证书
# 生成服务端私钥(server.key)
openssl genrsa -des3 -out server.key 2048
# 生成服务端证书签名请求(server.csr)
openssl req -new -key server.key -out server.csr
# 使用ca证书签署服务端csr以生成服务端证书(server.cert)
openssl ca -days 3650 -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
生成Client证书(用于双向认证)
# 生成客户端私钥(client.key)
openssl genrsa -des3 -out client.key 2048
# 生成客户端证书签名请求(client.csr)
openssl req -new -key client.key -out client.csr
# 使用ca证书签署客户端csr以生成客户端证书(client.cert)
openssl ca -days 3650 -in client.csr -out client.crt -cert ca.crt -keyfile ca.key
查看证书内容
openssl x509 -in server.crt -noout -text
生成证书时遇到的问题
问题1:生成证书时的subject具体含义
Subject: C=CN, ST=ln, L=sy, O=mx, OU=tsp2, CN=localhost
C = countryName=国家
S = stateOrProvinceName=省
L = localityName=城市
O = organizationName=公司
OU = organizationalUnitName=部门
CN = commonName=域名
问题2:提示./demoCA/newcerts不存在
在使用ca证书签署server证书时,遇到如下错误:提示./demoCA/newcerts不存在,可按照如下操作在当前工作目录新建demoCA, demoCA/newcerts, demoCA/index.txt, demoCA/serial,并设置serial内容为01+空行
问题3:重复生成同commonName证书后,提示:证书已存在
相同域名重新生成client.csr时会提醒there is already a certificate已经有一个证书了。那就把当前证书撤销,然后再重新运行即可。其中01.pem为demoCA/newcerts下的多个pem文件之一,默认按照创建顺序01, 02, …,需要自行确定pem中commonName为重复的域名后,方可吊销对应pem。
撤销证书命令如下:
openssl ca -keyfile ca.key -cert ca.crt -revoke .\demoCA\newcerts\01.pem
配置Nginx证书
例如按照上述生成CA、生成Server证书的流程,生成localhost的证书(则生成server证书时需要指定commonName为localhost,通常commonName即为服务器对应的域名),生成完成后将本地Nginx上443端口配置生成的server.cert, server.key,配置如下:
# HTTPS server
server {
listen 443 ssl;
server_name localhost;
ssl_certificate D:/work_dir/CA/mqtt/server.crt;
ssl_certificate_key D:/work_dir/CA/mqtt/server.key;
# https双向认证
#ssl_verify_client on;
#ssl_client_certificate ca.crt;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
启动Nginx后,发现443并未好用,查看Nginx错误日志发现如下报错:
2020/08/21 14:36:18 [emerg] 5588#20032:
cannot load certificate key "D:/work_dir/CA/mqtt/server.key": PEM_read_bio_PrivateKey() failed (
SSL: error:2807106B:UI routines:UI_process:processing error:
while reading strings error:0906406D:PEM routines:PEM_def_callback:
problems getting password error:0906A068:
PEM routines:PEM_do_header:bad password read
)
nginx启动的时候需要输入server.key的密码,解决办法是可以使用原key来生成解密后的key,并以解密后的key来代替,如下通过原server.key生成解密后的server_unsecure.key:
openssl rsa -in server.key -out server_unsecure.key
之后修改Nginx配置文件如下:
重新加载nginx后,即可访问该Https证书了
Chrome中自签证书不安全问题
导入自签CA证书到操作系统
关于证书不安全的提示,是由于我们自签名的CA证书不是权威机构,操作系统不承认所导致,可以将我们自己的CA安装到操作系统中
在windows系统可通过运行certmgr.msc来查看本地已安装证书:
在导入ca证书后,浏览器仍提示"不安全"
设置证书"使用者可选名称SAN"
查询相关资料后发现,新的chrome浏览器需要为自签证书设置SAN(使用者可选名称,subject alternative name)
关于openssl设置SAN可以参考:使用openssl为ssl证书增加“使用者备用名称(DNS)”
我在学习ssl阶段使用的openssl命令,后续操作的时候都使用xca(一个生成证书的图形化工具),在xca中设置SAN如下:
重新生成证书、重新加载配置后,可以发现此时浏览器不再报"不安全"了,同时查看证书可以发现"使用者可选名称"已被添加