HTTPS双向认证配置

参考: https://zhuanlan.zhihu.com/p/269817944

基本生成步骤:
1、生成CA根证书
2、生成服务端证书
3、生成客户端证书(如果需要做双向认证的话)

1.生成根证书
# 生成root私钥
openssl genrsa -out root.key 1024

# 根据私钥创建根证书请求文件,需要输入一些证书的元信息:邮箱、域名等
# 注意: Common Name随意填写且不能跟服务端、客户端的Common Name相同,密码为空
openssl req -new -out root.csr -key root.key

# 结合私钥和请求文件,创建根证书,有效期10年
openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650

2.生成服务端证书
# 创建服务端私钥
openssl genrsa -out server.key 1024

# 根据私钥生成请求文件
# 注意: Common Name为域名或IP,密码为空
openssl req -new -out server.csr -key server.key

# 结合私钥和请求文件创建服务端证书,有效期10年
openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650

如果需要只需要部署服务端证书端话,就可以结束了。拿着server.crt公钥和server.key私钥部署在服务器上,然后解析域名到改服务器指向到IP,证书就部署成功了。

3.生成客户端证书
如果需要做双向验证的,也就是服务端要验证客户端证书的情况。那么需要在同一个根证书下再生成一个客户端证书

# 生成私钥
openssl genrsa -out client.key 1024

# 申请请求文件
# 注意: Common Name为域名或IP,密码为空
openssl req -new -out client.csr -key client.key

# 生成证书
openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650

# 生成客户端集成证书pkcs12格式的文件,方便浏览器或者http客户端访问(密码:123456)
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12

4、Nginx配置

server
{
    listen 80;
    listen 443 ssl http2;

    server_name 域名;

    index index.php index.html;

    root /www/wwwroot/web1;

    ssl_certificate  /www/server/nginx/conf/keys/server.crt; # server公钥路径
    ssl_certificate_key  /www/server/nginx/conf/keys/server.key; # server私钥路径
    ssl_client_certificate  /www/server/nginx/conf/keys/root.crt; # 根级证书公钥路径,用于验证各个二级client
    ssl_verify_client on;

    access_log  /www/wwwlogs/web1.access.log;
    error_log  /www/wwwlogs/web1.error.log;
}

5、测试验证
url –cert client.crt –key client.key -H ‘Host: 域名’ https://IP地址 -v –insecure

6、Wireshark配置与测试
1、配置SSL key的日志记录,如curl、firefox的请求https的交换密钥都会记录在里面
1、将下面的内容下入文件 ~/.bash_profile
export SSLKEYLOGFILE=/path/tls_key.log
2、生效 source ~/.bash_profile
2、配置Wireshark
情况A: 当我们使用RSA进行秘钥交互的时候, 就对RSA keys list项进行配置, 导入server端的私钥.
情况B: 当我们使用DH进行秘钥交互的时候, 就对Master Secret log filename进行配置, 导入单次会话的主密钥. 因为DH的秘钥交互过程是明文交互的, 所以只配这个,也能解开全部的密文.

此条目发表在 http, nginx 分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*


*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>