https认证

来源:互联网 发布:网络棋牌赚钱 编辑:程序博客网 时间:2024/05/22 08:22

关于HTTPS

HTTPS是在HTTP基础上实现的一种更安全的身份认证及数据传输协议.百度百科的解释是这样的:

HTTPS (全称:Hyper Text Transfer Protocol over Secure Socket Layer)是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL

上面的定义说明了HTTPS的实现基础是ssl,但在整个认证过程中还有一个重要的权威机构CA(Certificate Authority),先来看看这个CA.

关于CA

电子商务认证授权机构(CA, Certificate Authority),也称为电子商务认证中心,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任.

这个机构主要就是为网络服务器颁发证书,使网络服务器在互联网中可信.建立这种信任关系的是各个机构的根证书,根证书可以对他们签名的所有服务器进行验证.要得到这种证书需要到对应的机提交申请.对于要求不高的情况下可以使用 Let’s encrypt.

SSL协议

SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持.SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装,压缩,加密等基本功能的支持.SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等.

SSL Handshake Protocol握手过程中身份认证和秘钥协商步骤

  1. 客户端(浏览器)发送自己的ssl版本号,支持的算法等信息到服务器
  2. 服务端返回自己的ssl版本号,随机数及服务器的证书
  3. 客户端验证server的证书是否合法,验证不通过给出提示
  4. 验证通过客户端会发送自己的证书给服务器,交由服务器认证
  5. 服务器验证客户端证书,如果验证不同通过,会直接断掉链接
  6. 验证通过,将选好的加密方案通过客户端的公钥加密返回给客户端
  7. 客户端通过私钥解开加密方式,生成随机数,作为对称加密的秘钥,使用服务器的公钥加密发送给服务器
  8. 服务器通过私钥解密出对称机密的秘钥
  9. 开始安全数据传输工作

上面几个步骤成功后之后,就建立了一个双向的认证(单向认证没有上面4和5)的安全的数据传输通道,接下来看一下如何使用openssl来建立自签名的双向认证

openssl自签名双向认证

  1. 获取CA证书

    #生成ca私钥文件,长度为1024加密方式为rsaopenssl genrsa -out ca.key 1024#采用x509标准生成自签名证书openssl req -new -x509 -days 36500 -key ca.key -out ca.crt -subj "/C=CN/ST=SX/L=XA/O=Team/OU=sun"
  2. 获取server端证书

    #生成server秘钥文件openssl genrsa -out server.key 1024#生成证书请求文件openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=SX/L=XA/O=Team/OU=test/CN=aa"#生成server CA自签名证书openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key#验证server端证书docker@myvm2:~$ openssl verify -CAfile ca.crt server.crt server.crt: OK
  3. 获取client端证书

     #阿道夫 openssl genrsa -out client.key 1024 #阿道夫 openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=SX/L=XA/O=Team/OU=test/CN=aa" # openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key 这步会出错: unable to access the ./demoCA/newcerts directory ./demoCA/newcerts:  No such file or directory 解决办法: mkdir -p ./demoCA/newcerts touch demoCA/index.txt touch demoCA/serial echo 01 > demoCA/serial #验证docker@myvm2:~$ openssl verify -CAfile ca.crt client.crt client.crt: OK
  4. 使用openssl 验证

     #开启server端证书验证功能 docker@myvm2:~$ openssl s_server -accept 10086 -key server.key -cert server.crt -Verify 5 verify depth is 5, must return a certificate Using default temp DH parameters ACCEPT #新开一个窗口执行客户端链接命令,带上客户端的证书,否则server会自动断掉链接 docker@myvm2:~$  openssl s_client -connect localhost:10086 -CAfile ca.crt  -cert client.crt -key client_key