自建CA证书实现SSL证书-双向认证
#nginx
双向认证的实现逻辑
生成一个CA证书,用于颁发服务器证书、用户证书 nginx配置服务端证书和私钥,然后加上CA证书(CA证书用于验证证书的有效性)
先生成CA证书,hostname建议设置为主体名,方便识别,然后利用CA证书生成服务端证书,hostname配置为[[Centos7源码安装Tengine|nginx]] SSL证书的域名。最后生成用户证书,hostname配置为用户名称,方便识别。
具体实现
查看/etc/pki/tls/openssl.cnf中dir的位置,默认为 /etc/pki/CA/,可以根据自己的需求修改或直接使用默认,这里以不修改路径为例,切换到/etc/pki/CA/目录下,下面的操作都以该目录为基础目录进行操作 修改/etc/pki/tls/openssl.cnf中的这两个天数,尽量改大一点,不然生成的证书默认只有30天有效期
...
default_days = 3650 # how long to certify for
default_crl_days= 3650 # how long before next CRL
...touch index.txt
echo 01 > serial
echo 01 > crlnumber
mkdir private newcerts crl
# 创建CA证书
## 创建CA私钥
openssl genrsa -out private/cakey.pem 2048
## 用CA私钥生成请求文件
openssl req -days 3650 -new -key private/cakey.pem -out private/cacsr.pem
## CA签署证书
openssl x509 -req -days 3650 -in private/cacsr.pem -signkey private/cakey.pem -out cacert.pem
# 创建服务证书(用于nginx上配置)
## 创建服务端用的私钥文件
openssl genrsa -out newcerts/server-key.pem 2048
## 用服务端私钥文件生成请求文件server-csr.pem
## 生成服务器证书(openssl) hostname配置为nginx SSL证书的域名。
openssl req -days 3650 -new -out newcerts/server-csr.pem -key newcerts/server-key.pem
## 签署服务端用的证书文件server-cert.pem
openssl x509 -req -in newcerts/server-csr.pem -out newcerts/server-cert.pem -CA cacert.pem -CAkey private/cakey.pem -CAcreateserial -days 3650
## 为用户创建证书,过程跟服务端一样,只是多了一步将证书文件转换格式为p12方便导入。
openssl genrsa -out newcerts/liqiao-key.pem 2048
## 生成客户端证书 hostname配置为用户名称,方便识别,每个用户一个。
openssl req -new -out newcerts/liqiao-csr.pem -key newcerts/liqiao-key.pem
openssl x509 -req -in newcerts/liqiao-csr.pem -out newcerts/liqiao-cert.pem -CA cacert.pem -CAkey private/cakey.pem -CAcreateserial -days 3650
## 转换格式为p12方便电脑导入
openssl pkcs12 -export -in newcerts/liqiao-cert.pem -inkey newcerts/liqiao-key.pem -out newcerts/liqiao.p12
# 同步吊销信息到ca.crl文件,nginx用ca.crl这个文件的内容来判断用户的证书是否有效。
openssl ca -gencrl -out crl/ca.crl
# 吊销用户证书
openssl ca -revoke newcerts/liqiao-cert.pem
# 每次吊销完证书后需要执行同步,更新ca.crl文件信息。
openssl ca -gencrl -out crl/ca.crl
nginx配置
http {
...
server {
listen 80;
listen 443;
ssl on;
server_name open.domain.com;
# 单向SSL证书基本配置
ssl_certificate cert/server-cert.pem;
ssl_certificate_key cert/server-key.pem;
# 双向要添加的部分
# CA证书
ssl_client_certificate cert/ca.crt;
# 开启
ssl_verify_client on;
# 证书吊销验证文件
ssl_crl cert/ca.crl;
...
}
}错误处理记录
Nginx SSL 双向认证突然就不能访问了报错400 :The SSL certificate error
有可能是证书到期,双向认证用到ca.crt , server.key , server.crt 还有客户端的client.crt 、client.p12,其中客户端证书client.crt/client.p12和server.crt 有效期还有11个月,但是:CA跟证书只有一个月的有效期。是因为默认 /etc/pki/tls/openssl.cnf中default_crl_days的值只有30天,需要将这个值改到跟default_days的值一样,尽量大一点,然后重新生成证书即可。
最后更新于