ssl双向认证自签证书及配置流程
正式证书共分为三种:根证书、服务器证书、客户端证书
用根证书来签发服务器证书和客户端证书,也是由根证书来校验其它两个证书。
因为自签的证书不像证书签发机构签发的证书那样被浏览器信任,所以要把根证书分发到客户端中,并导入到系统进行信任。这样当用户访问由根证书签发了服务器证书的网站时才不会在浏览器中提示不安全。
这三个证书可以由nginx进行配置,下面是一个小片段:
服务器证书 ssl_certificate /etc/ssl/server_cert/text_cert/server.crt; 服务器私钥 ssl_certificate_key /etc/ssl/server_cert/zt_cert/server.key; 根证书 ssl_client_certificate /etc/ssl/root_cert/cacert.pem;
看到这个文章的标题带有“双向认证”,它的作用是客户端用客户端证书认证服务器证书、网站用服务器证书验证客户端证书。这就是为什么要用根证书来对它俩进行正确的签发,然后将根证书和客户端证书一起分发到用户电脑中进行导入。
开启双向认证也很简单,将下面这一行加入到配置文件中即可,同样也是由nginx的配置进行举例:
ssl_verify_client on;
零、分别创建不同的文件夹
以ubuntu创建证书为例子:
进入ssl证书存放目录下:
cd /etc/ssl
分别创建根证书、服务器证书、客户端证书的存放目录
sudo mkdir ca_cert server_cert client_cert
一、根证书生成
- 创建根证书私钥
sudo openssl genrsa -out ca_cert/cakey.pem 2048
- 创建根证书请求文件
sudo openssl req -x509 -new -key ca_cert/cakey.pem -out ca_cert/cacert.pem -days 365
二、 服务器证书生成
- 生成服务器证书密钥
openssl genrsa -out server_cert/server.key 2048
- 生成服务器证书请求文件(这里如果如果想想签署多个应用时,在
Common Name
填写*.test.com
)
openssl req -new -key server_cert/server.key -out server_cert/server.csr
-
将服务器证书请求文件发送给根证书,进行服务器证书签署
-
如果直接签署的话,后面chrome浏览器会提示证书不安全,没有指定主题备用名称,所以要在签署的时候用到添加一个扩展文件,只需要根据自己的需要修改
[ SubjectAlternativeName ]
即可。[root@CA /root/ssl/]# vim http.ext keyUsage = nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth, clientAuth subjectAltName=@SubjectAlternativeName [ SubjectAlternativeName ] DNS.1=www.test.com
-
签署证书
openssl x509 -req -in server_cert/server.csr -CA ca_cert/cacert.pem -CAkey ca_cert/cakey.pem -CAcreateserial -out server_cert/server.crt -days 365 -sha256 -extfile http.ext
注:-days 365 为有效期365天,不可再多,要不然chrome浏览器会提示不安全
-
注意:如果后续需要新增网站的话,只要符合*.test.com这个规则,那么只需要重复步骤3即可:
-
在3.1的http.ext文件中新增该网站,如:
abc.text.com
,那么更改后的ext文件为:keyUsage = nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth, clientAuth subjectAltName=@SubjectAlternativeName [ SubjectAlternativeName ] DNS.1=www.test.com DNS.2=abc.test.com
-
运行3.2
三、客户端证书生成
- 生成客户端证书密钥文件
openssl genrsa -out client_cert/client-key.key 2048
- 生成客户端请求文件
openssl req -new -out client_cert/client-req.csr -key client_cert/client-key.key
- 生成客户端证书
openssl x509 -req -in client_cert/client-req.csr -out client_cert/client-cert.cer -signkey client_cert/client-key.key -CA ca_cert/cacert.pem -CAkey ./ca_cert/cakey.pem -CAcreateserial -days 365
- 生成客户端p12格式根证书
openssl pkcs12 -export -clcerts -in client_cert/client-cert.cer -inkey client_cert/client-key.key -out client/cpw.p12
四、 吊销证书
- 进入 /etc/ssl目录下
- sudo openssl ca -revoke client_cert/name_path/client-cert.cer -cert ./root_cert/cacert.pem -keyfile ./root_cert/cakey.pem
- sudo openssl ca -gencrl -out ./root_cert/ca.crl
- 可通过sudo openssl verify -CAfile root_cert/cacert.pem client_cert/name_path/client-cert.cer 验证是否被吊销
五、证书的配置方法
对于个人来说,需要用到的证书文件分别为:
-
以pem为扩展名的根证书,比如该证书文件名为cacert.pem;
-
以p12为扩展名的个人证书(该证书既包含公钥也包含私钥),比如该证书文件名为movi.p12
证书的配置方式如下:
MAC系统:
a. 分别双击打开两个证书文件,其中打开p12证书时会提示需要密码,
b. 在启动台中打开钥匙串访问,左侧选择“登录“,然后在右边选择“证书”,如图所示
c. 在此时打开的窗口内会有 “movi”和“cacert"的证书,分别将两个证书文件双击打开,可以看到信任/细节等被折叠的内容,展开信任在第一个下拉框中选择“始终信任”,然后退出即可,另外一个证书也是同样流程,具体位置如下图所示
Windows:
此处以chrome浏览器为例,打开chrome浏览器后,点击右上角三个点,然后点击打开菜单中的“设置”。
c. 选择左侧的“隐私设置和安全性”,然后再选择右侧的“安全”
d. 选择“管理证书”
此时会打开另外一个证书窗口,然后选择“受信任的根证书颁发机构”,点击左下角“导入”按钮,将以扩展名“pem”结尾的根证书导入进去即可。