https双向认证
目录
一、https
双向认证原理

双向认证流程
- 客户端发起建立
HTTPS
连接请求,将SSL
协议版本的信息发送给服务端; - 服务器端将本机的公钥证书(
server.crt
)发送给客户端; - 客户端读取公钥证书(
server.crt
),取出了服务端公钥; - 客户端将客户端公钥证书(
client.crt
)发送给服务器端; - 服务器端使用根证书(
root.crt
)解密客户端公钥证书,拿到客户端公钥; - 客户端发送自己支持的加密方案给服务器端;
- 服务器端根据自己和客户端的能力,选择一个双方都能接受的加密方案;
- 使用客户端的公钥加密. 后发送给客户端;
- 客户端使用自己的私钥解密加密方案,生成一个随机数
R
,使用服务器公钥加密后传给服务器端; - 服务端用自己的私钥去解密这个密文,得到了密钥
R
; - 服务端和客户端在后续通讯过程中就使用这个密钥R进行通信了。
双向认证的目的主要是使得双方最终可以安全的得到秘钥R
,后面所有传输都是通过秘钥R
加密
HTTPS
双向认证,不仅仅需要用户浏览器校验服务器数字证书,还需要服务器端验证用户是否是可信的。
二、证书生成
如果要把整个双向认证的流程跑通,最终需要8个证书文件:
- 根证书:
root.crt
;
- 服务器端公钥证书:
server.crt
; - 服务器端私钥文件:
server.key
; - 客户端公钥证书:
client.crt
; - 客户端私钥文件:
client.key
; - 客户端集成证书(包括公钥和私钥,用于浏览器访问场景):
client.p12
; - 客户端集成证书(包括公钥和私钥,用于
Spring
客户端访问场景):client.jks
; - 服务端集成证书(包括公钥和私钥,用于
Spring
服务端):localhost.jks
;
既然是双向验证,就需要双方的密钥,我们服务端称为server
,而客户端称为client
。
生成这一些列证书之前,我们需要先生成一个CA
根证书,然后由这个CA
根证书颁发服务器公钥证书和客户端公钥证书。
我们可以全程使用openssl
来生成一些列的自签名证书,自签名证书没有听过证书机构的认证,很多浏览器会认为不安全,但我们用来实验是足够的。需要在本机安装了openssl
后才能继续本章的实验。
2.1 生成根证书root.crt
# 生成根证书私钥
openssl genrsa -out root.key 1024
# 根据私钥创建根证书请求文件,需要输入一些证书的元信息:邮箱、域名等
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
经过上面三个命令行,我们最终可以得到一个签名有效期为10年的根证书root.crt,后面我们可以用这个根证书去颁发服务器证书和客户端证书。
2.2 生成服务端证书server.crt
和server.key
# 创建服务端私钥
openssl genrsa -out server.key 1024
# 根据私钥生成请求文件
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
,证书就部署成功了。
2.3 生成客户端证书client.crt
和client.key
如果需要做双向验证的,也就是服务端要验证客户端证书的情况。那么需要在同一个根证书下再生成一个客户端证书。
# 生成私钥
openssl genrsa -out client.key 1024
# 申请请求文件
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
2.4 生成客户端PKCS12
# 生成客户端集成证书pkcs12格式的文件,方便浏览器或者http客户端访问(密码:123456)
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
2.5 生成JKS
Springboot
项目中我们一般使用jks
格式的文件:
openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server.p12
keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass 123456 -alias server -deststorepass 123456 -destkeypass 123456 -destkeystore localhost.jks
keytool -importkeystore -srckeystore client.p12 -srcstoretype PKCS12 -srcstorepass 123456 -alias server -deststorepass 123456 -destkeypass 123456 -destkeystore client.jks
2.6 注意
根证书的Common Name
填写root
就可以,客户端和服务器端的证书这个字段需要填写域名,一定要注意的是,根证书的这个字段和客户端证书、服务器端证书不能一样。
三、 程序配置
3.1 Springboot
整合双向验证
server:
ssl:
enabled: false
key-store-type: JKS
key-store: localhost.jks
key-store-password: 123456
key-alias: localhost
client-auth: need
trust-store: localhost.jks
trust-store-type: JKS
trust-store-provider: SUN
trust-store-password: 123456
3.2 Nginx
配置
有了上面的一些列证书,我们可以在Nginx
服务器上配置双向认证的HTTPS
服务了,具体配置方式如下:
server {
listen 3001 ssl;
server_name www.yourdomain.com;
ssl on;
ssl_certificate /data/sslKey/server.crt; #server公钥证书
ssl_certificate_key /data/sslKey/server.key; #server私钥
ssl_client_certificate /data/sslKey/root.crt; #根证书,可以验证所有它颁发的客户端证书
ssl_verify_client on; #开启客户端证书验证
location / {
root html;
index index.html index.htm;
}
}
具体就是将服务器端的两个证书文件(server.crt/server.key
)和根证书文件(root.crt
)的路径配置到nginx
的server
节点配置中,并且把ssl_verify_client
这个参数设置为on
。
有一点需要注意的就是,如果客户端证书不是由根证书直接颁发的,配置中还需要加一个配置:ssl_verify_depth 1
.
亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。
日期 | 姓名 | 金额 |
---|---|---|
2023-09-06 | *源 | 19 |
2023-09-11 | *朝科 | 88 |
2023-09-21 | *号 | 5 |
2023-09-16 | *真 | 60 |
2023-10-26 | *通 | 9.9 |
2023-11-04 | *慎 | 0.66 |
2023-11-24 | *恩 | 0.01 |
2023-12-30 | I*B | 1 |
2024-01-28 | *兴 | 20 |
2024-02-01 | QYing | 20 |
2024-02-11 | *督 | 6 |
2024-02-18 | 一*x | 1 |
2024-02-20 | c*l | 18.88 |
2024-01-01 | *I | 5 |
2024-04-08 | *程 | 150 |
2024-04-18 | *超 | 20 |
2024-04-26 | .*V | 30 |
2024-05-08 | D*W | 5 |
2024-05-29 | *辉 | 20 |
2024-05-30 | *雄 | 10 |
2024-06-08 | *: | 10 |
2024-06-23 | 小狮子 | 666 |
2024-06-28 | *s | 6.66 |
2024-06-29 | *炼 | 1 |
2024-06-30 | *! | 1 |
2024-07-08 | *方 | 20 |
2024-07-18 | A*1 | 6.66 |
2024-07-31 | *北 | 12 |
2024-08-13 | *基 | 1 |
2024-08-23 | n*s | 2 |
2024-09-02 | *源 | 50 |
2024-09-04 | *J | 2 |
2024-09-06 | *强 | 8.8 |
2024-09-09 | *波 | 1 |
2024-09-10 | *口 | 1 |
2024-09-10 | *波 | 1 |
2024-09-12 | *波 | 10 |
2024-09-18 | *明 | 1.68 |
2024-09-26 | B*h | 10 |
2024-09-30 | 岁 | 10 |
2024-10-02 | M*i | 1 |
2024-10-14 | *朋 | 10 |
2024-10-22 | *海 | 10 |
2024-10-23 | *南 | 10 |
2024-10-26 | *节 | 6.66 |
2024-10-27 | *o | 5 |
2024-10-28 | W*F | 6.66 |
2024-10-29 | R*n | 6.66 |
2024-11-02 | *球 | 6 |
2024-11-021 | *鑫 | 6.66 |
2024-11-25 | *沙 | 5 |
2024-11-29 | C*n | 2.88 |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了