https双向认证

目录

前言

一、认证原理

1、单向认证流程

2、 双向认证流程

二、证书准备

1、生成自签名根证书

2、生成自签名客户端证书

3、生成自签名服务器端证书

三、配置修改

 1、nginx配置,完成单向认证

2、nginx配置,完成双向认证

四、测试验证

1、curl测试 

2、浏览器测试

总结



前言

双向认证,顾名思义,客户端和服务器端都需要验证对方的身份,在建立HTTPS连接的过程中,握手的流程比单向认证多了几步。单向认证的过程,客户端从服务器端下载服务器端公钥证书进行验证,然后建立安全通信通道。双向通信流程,客户端除了需要从服务器端下载服务器的公钥证书进行验证外,还需要把客户端的公钥证书上传到服务器端给服务器端进行验证,等双方都认证通过了,才开始建立安全通信通道进行数据传输。


一、认证原理

1、单向认证流程

单向认证流程中,服务器端保存着公钥证书和私钥两个文件,整个握手过程如下:

  1. 客户端发起建立HTTPS连接请求,将SSL协议版本的信息发送给服务器端;

  2. 服务器端将本机的公钥证书(server.crt)发送给客户端;

  3. 客户端读取公钥证书(server.crt),取出了服务端公钥;

  4. 客户端生成一个随机数(密钥R),用刚才得到的服务器公钥去加密这个随机数形成密文,发送给服务端;

  5. 服务端用自己的私钥(server.key)去解密这个密文,得到了密钥R

  6. 服务端和客户端在后续通讯过程中就使用这个密钥R进行通信了。

2、 双向认证流程

 

  1. 客户端发起建立HTTPS连接请求,将SSL协议版本的信息发送给服务端;

  2. 服务器端将本机的公钥证书(server.crt)发送给客户端;

  3. 客户端读取公钥证书(server.crt),取出了服务端公钥;

  4. 客户端将客户端公钥证书(client.crt)发送给服务器端;

  5. 服务器端使用根证书(root.crt)解密客户端公钥证书,拿到客户端公钥;

  6. 客户端发送自己支持的加密方案给服务器端;

  7. 服务器端根据自己和客户端的能力,选择一个双方都能接受的加密方案,使用客户端的公钥加密后发送给客户端;

  8. 客户端使用自己的私钥解密加密方案,生成一个随机数R,使用服务器公钥加密后传给服务器端;

  9. 服务端用自己的私钥去解密这个密文,得到了密钥R

  10. 服务端和客户端在后续通讯过程中就使用这个密钥R进行通信了。

二、证书准备

从上一章内容中,可以总结出来,整个双向认证的流程需要六个证书文件:

  • 服务器端公钥证书:server.crt

  • 服务器端私钥文件:server.key

  • 根证书:root.crt

  • 客户端公钥证书:client.crt

  • 客户端私钥文件:client.key

  • 客户端集成证书(包括公钥和私钥,用于浏览器访问场景):client.p12

所有的这些证书,我们都可以向证书机构去申请签发,一般需要收取一定的证书签发费用,此时我们需要选择大型的证书机构去购买。如果只是企业内部使用,不是给公众使用,也可以自行颁发自签名证书。

1、生成自签名根证书

(1)创建根证书私钥:

openssl genrsa -out root.key 1024

(2)创建根证书请求文件:

openssl req -new -out root.csr -key root.key

 

后续参数需要自行填写,以下为参考示例:

Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:fj
Locality Name (eg, city) [Default City]:fj
Organization Name (eg, company) [Default Company Ltd]:xxx
Organizational Unit Name (eg, section) []:test
Common Name (eg, your name or your servers hostname) []:root
Email Address []:123456@qq.com
A challenge password []:123456
An optional company name []:

(3)创建根证书:

openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650

在创建证书请求文件的时候需要注意三点,下面生成服务器请求文件和客户端请求文件均要注意这三点: 根证书的Common Name填写root就可以,所有客户端和服务器端的证书这个字段需要填写域名,一定要注意的是,根证书的这个字段和客户端证书、服务器端证书不能一样; 其他所有字段的填写,根证书、服务器端证书、客户端证书需保持一致最后的密码可以直接回车跳过或者也可以设置自己想要设置密码,如果有设置密码需要记住这个密码,后续测试会用到。

经过上面三个命令行,最终可以得到一个签名有效期为10年的根证书root.crt,后面我们可以用这个根证书去颁发服务器证书和客户端证书。

2、生成自签名客户端证书

(1)生成客户端证书密钥:

openssl genrsa -out client.key 1024

(2) 生成客户端证书请求文件,过程和注意事项参考根证书:

openssl req -new -out client.csr -key client.key

(3) 生客户端证书

openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650

(4) 生客户端pfx格式证书,需要输入一个密码,选一个好记的,比如123456

openssl pkcs12 -export -out client.pfx -inkey client.key -in   client.crt -certfile root.crt

重复使用上面的命令,我们得到两套客户端证书:

client.key:客户端的私钥文件

client.crt :有效期十年的客户端证书

使用根证书和客户端私钥一起生成 client.pfx,这个证书文件包含客户端的公钥和私钥,主要用来给浏览器访问使用

3、生成自签名服务器端证书

步骤和生成自签名客户端证书一致,命名上注意修改一下即可,由于我这边已经有签发好的服务端证书,本步骤不再详细描述。

三、配置修改

 1、nginx配置,完成单向认证

(1)导入配置所需的服务端pem和key文件

(2)修改nginx的ssl配置

(3)保存后,重启nginx配置

(4) 测试验证,可以正常完成单向认证

2、nginx配置,完成双向认证

 (1)在单项认证的基础上,开启客户端认证

ssl_client_certificate  root.crt;  #此处需要填写客户端证书对应的根证书,用于服务端验证客户端证书的有效性
ssl_verify_client on;

 (3)保存后,重启nginx配置

四、测试验证

1、curl测试 

(1)请求不携带客户端证书,得到400错误状态码

 (2)请求携带客户端证书(client.crt)和私钥(client.key),响应200

curl -v https://www.oufc.top --cert client.crt --key client.key

2、浏览器测试

(1)请求不携带客户端证书,得到400错误状态码


(2)将客户端证书(client.crt)和私钥(client.key)转换为pfx格式的证书

 openssl pkcs12 -export -out client.pfx -inkey client.key -in   client.crt -certfile root.crt

(3)将转换好的pfx格式证书下载到本地后,双击进行安装

 

 此处的密码填写的就是之前设置的密码,例如123456

 

 

(4)再次访问,提示需要选择证书

(5)点击确定后,即可以正常访问

 

总结

以上就是https双向认证的大致原理和测试过程,相比于单向认证,双向认证可以进一步有效的保护网站信息安全,防止信息被不法分子盗用,但同时也会导致整个通信过程较长,客户端验证服务器端的证书,客户端也将自己的证书上传到服务器端进行验证。

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值