自建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.cnfdefault_crl_days的值只有30天,需要将这个值改到跟default_days的值一样,尽量大一点,然后重新生成证书即可。

最后更新于