openssl s_server/s_client 测试

本文详细介绍了SSL通信的基本原理,包括无认证、单向认证和双向认证的流程,以及SSL通信的关键步骤。此外,还讲解了OpenSSL证书的生成与使用,包括如何创建私钥、公钥和签发证书。最后,通过`s_server`和`s_client`进行了连接测试,并列举了openssl命令参数的说明。内容涵盖了SSL安全连接的重要概念和技术实现。
摘要由CSDN通过智能技术生成

注: 文中部分内容引用其他博客文章,特此申明!


一、ssl 通信原理


SSL 认证方式:

  • 无认证:双方都不校验对方合法性,通信过程加密。
  • 单向认证:客户端验证服务器的合法性,服务器不验证客户端。
  • 双向认证:客户端验证服务器合法性、服务器也会验证客户端合法性。

SSL 秘钥:

  • 私钥: 不对外开放,持有端用于解密通信内容
  • 公钥:对外开放,对方用公钥加密数据和自己通信
  • CA证书:在公钥的基础上增加签名,由权威机构签发,保证公钥的合法性

SSL 通信流程:

  • 单向验证:
    在这里插入图片描述
  1. 客户端的浏览器向服务器传送客户端SSL协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息。

  2. 服务器向客户端传送SSL协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。

  3. 客户利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的CA是否可靠,发行者证书的公钥能否正确解开服务器证书的"发行者的数字签名",服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,将继续进行第四步。

  4. 用户端随机产生一个用于后面通讯的"对称密码",然后用服务器的公钥(服务器的公钥从步骤②中的服务器的证书中获得)对其加密,然后将加密后的"预主密码"传给服务器。

  5. 如果服务器要求客户的身份认证(在握手过程中为可选),用户可以建立一个随机数然后对其进行数据签名,将这个含有签名的随机数和客户自己的证书以及加密过的"预主密码"一起传给服务器。

  6. 如果服务器要求客户的身份认证,服务器必须检验客户证书和签名随机数的合法性,具体的合法性验证过程包括:客户的证书使用日期是否有效,为客户提供证书的CA是否可靠,发行CA 的公钥能否正确解开客户证书的发行CA的数字签名,检查客户的证书是否在证书废止列表(CRL)中。检验如果没有通过,通讯立刻中断;如果验证通过,服务器将用自己的私钥解开加密的"预主密码 ",然后执行一系列步骤来产生主通讯密码(客户端也将通过同样的方法产生相同的主通讯密码)。

  7. 服务器和客户端用相同的主密码即"通话密码",一个对称密钥用于SSL协议的安全数据通讯的加解密通讯。同时在SSL通讯过程中还要完成数据通讯的完整性,防止数据通讯中的任何变化。

  8. 客户端向服务器端发出信息,指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥,同时通知服务器客户端的握手过程结束。

  9. 服务器向客户端发出信息,指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥,同时通知客户端服务器端的握手过程结束。

  10. SSL的握手部分结束,SSL安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验。

(注: SSL单向认证只要求站点部署了ssl证书就行,任何用户都可以去访问(IP被限制除外等),只是服务端提供了身份认证)

  • 双向认证:
    在这里插入图片描述
  1. 浏览器发送一个连接请求给安全服务器。

  2. 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器。

  3. 客户浏览器检查服务器送过来的证书是否是由自己信赖的CA中心(如沃通CA)所签发的。如果是,就继续执行协议;如果不是,客户浏览器就给客户一个警告消息:警告客户这个证书不是可以信赖的,询问客户是否需要继续。

  4. 接着客户浏览器比较证书里的消息,例如域名和公钥,与服务器刚刚发送的相关消息是否一致,如果是一致的,客户浏览器认可这个服务器的合法身份。

  5. 服务器要求客户发送客户自己的证书。收到后,服务器验证客户的证书,如果没有通过验证,拒绝连接;如果通过验证,服务器获得用户的公钥。

  6. 客户浏览器告诉服务器自己所能够支持的通讯对称密码方案。

  7. 服务器从客户发送过来的密码方案中,选择一种加密程度最高的密码方案,用客户的公钥加过密后通知浏览器。

  8. 浏览器针对这个密码方案,选择一个通话密钥,接着用服务器的公钥加过密后发送给服务器。

  9. 服务器接收到浏览器送过来的消息,用自己的私钥解密,获得通话密钥。

  10. 服务器、浏览器接下来的通讯都是用对称密码方案,对称密钥是加过密的。

(注:双向认证则是需要服务端与客户端提供身份认证,只能是服务端允许的客户能去访问,安全性相对于要高一些。)

二、openssl 证书


  • 生成server 私钥:
openssl genrsa -des3 -out server.key 2048					//des3算法生成私钥
openssl rsa -text -in server.key							//查看私钥内容
  • 创建公钥:
openssl req -new -key server.key -out server.csr			//创建公钥
openssl req -text -in server.csr -noout						//查看公钥

创建公钥时输入内容说明:

Country Name (2 letter code) []:CN                        	// 输入国家代码,中国填写 CN
State or Province Name (full name) []:HangZhou            	// 输入省份,这里填写 HangZhou
Locality Name (eg, city) []:HangZhou                      	// 输入城市,我们这里也填写 HangZhou
Organization Name (eg, company) []:tbj                    	// 输入组织机构(或公司名,我这里随便写个tbj)
Organizational Unit Name (eg, section) []:tbj             	// 输入机构部门
Common Name (eg, fully qualified host name) []:*.abc.com  	// 输入域名,我这边是 (*.abc.com)  
Email Address []:tugenhua0707@qq.com                      	// 你的邮箱地址

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456                            	// 你的证书密码,如果不想设置密码,可以直接回车
  • 签发自己证书
openssl x509 -req -days 36500 -in server.csr -signkey server.key -out server.crt

三、连接测试


1.s_server

  • 服务器启动
openssl s_server -accept 913 -key server.key -cert server.crt -debug

在这里插入图片描述
在这里插入图片描述

2.s_client

  • 单向验证测试
openssl s_client -connect localhost:913  -CAfile server.crt -showcerts -debug 		//单向验证


四、openssl 参数说明


命令格式:

openssl s_client [-host host] [-port port] [-connect host:port] [-verify depth] [-cert filename] 
[-certform DER|PEM] [-key filename] [-keyform DER|PEM] [-pass arg] [-CApath directory] [-CAfile filename] 
[-reconnect][-pause] [-showcerts] [-debug] [-msg] [-state] [-nbio_test] [-nbio][-crlf] [-ign_eof] [-no_ign_eof] 
[-quiet] [-ssl2] [-ssl3] [-tls1_1] [-tls1_2] [-tls1] [-dtls1] [-no_ssl2][-no_ssl3] [-no_tls1] [-no_tls1_1] 
[-no_tls1_2] [-bugs] [-cipher cipherlist] [-starttls protocol] [-engine id] [-tlsextdebug] [-no_ticket] 
[-sess_out filename] [-sess_in filename] [-rand file(s)]   

参数说明:

  • host host:设置服务地址。

  • port port:设置服务端口,默认为4433。

  • connect host:port:设置服务器地址和端口号。如果没有设置,则默认为本地主机以及端口号4433。

  • verify depth:设置证书的验证深度。记得CA也是分层次的吧?如果对方的证书的签名CA不是Root CA,那么你可以再去验证给该CA的证书签名的CA,一直到Root CA. 目前的验证操作即使这条CA链上的某一个证书验证有问题也不会影响对更深层的CA的身份的验证。所以整个CA链上的问题都可以检查出来。当然CA的验证出问题并不会直接造成连接马上断开,好的应用程序可以让你根据验证结果决定下一步怎么走。

  • cert filename:使用的证书文件。如果server不要求要证书,这个可以省略。

  • certform DER|PEM:证书的格式,一般为DER和PEM。默认为PEM格式。

  • key filename:使用的证书私钥文件。

  • keyform DER|PEM:证书私钥文件的格式,一般为DER和PEM。默认为PEM格式。

  • pass arg:私钥保护口令来源,比如:-pass file:pwd.txt,将私钥保护口令存放在一个文件中,通过此选项来指定,不需要用户来输入口令。

  • CApath directory:设置信任CA文件所在路径,此路径中的ca文件名采用特殊的形式:xxx.0,其中xxx为CA证书持有者的哈希值,它通过x509 -hash命令获得。

  • CAfile filename:某文件,里面是所有你信任的CA的证书的内容。当你要建立client的证书链的时候也需要用到这个文件。

  • reconnect:使用同样的session-id连接同一个server五次,用来测试server的session缓冲功能是否有问题。

  • pause:每当读写数据时,sleep 1秒。

  • showcerts:显示整条server的证书的CA的证书链。否则只显示server的证书。

  • debug:打印所有的调试信息。

  • msg:用16进制显示所有的协议数据。

  • state:打印SSL session的状态, ssl也是一个协议,当然有状态。

  • nbio_test:检查非阻塞socket的I/O运行情况。

  • nbio:使用非阻塞socket。

  • crlf:把在终端输入的换行回车转化成/r/n送出去。

  • ign_eof:当输入文件到达文件尾的时候并不断开连接。

  • no_ign_eof:当输入文件到达文件尾的时候断开连接。

  • quiet:不打印出session和证书的信息。同时会打开-ign_eof这个选项。

  • ssl2、-ssl3、-tls1_1、-tls1_2、-tls1、-dtls1、-no_ssl2、-no_ssl3、-no_tls1、-no_tls1_1、-no_tls1_2:使用的协议状态值。

  • bugs:兼容老版本服务端的中的bug。

  • cipher cipherlist:由我们自己来决定选用什么加密算法,尽管是由server来决定使用什么算法列表,但它一般都会采用我们送过去的cipher列表里的第一个cipher。

  • starttls protocol:protocol可以为smtp或pop3,用于邮件安全传输。

  • engine id:硬件引擎。

  • tlsextdebug:打印TLS协议中服务器端接收到的额外信息值。

  • no_ticket:不支持RFC4507bis会话类型。

  • sess_out filename:输出SSL会话信息值到filename中。

  • sess_in filename:从filename中获取SSL Session值。

  • rand file(s):指定随机数种子文件,多个文件间用分隔符分开,windows用“;”,OpenVMS用“,“,其他系统用“:”。

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值