OpenSSL命令---s_client
⽤途:
s_client为⼀个SSL/TLS客户端程序,与s_server对应,它不仅能与s_server进⾏通信,也能与任何使⽤ssl协议的其他服务程序进⾏通信。
⽤法:
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 ,将私钥保护⼝令存放在⼀个⽂件中,通过此选项来指定,不需要⽤户来输⼊⼝令。
-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:打印所有的调试信息。
cipher命令-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⽤“,“,其他系统⽤“:”。
连接选项:
如果⼀个确认的连接到SSL服务器,并显⽰了从服务器端接收到了的数据,任何操作都被发送到服务器。当交互(这意味着没有给出B<-quiet> 、B<-ign_eof>这两个选项)的时候,如果命令⾏B<R>,被设置则session有可能会被重启。如果设置的是命令⾏B<Q>或到达了⽂件的结尾,连接将会被断开。
注意:
S_client可⽤于调试SSL服务器端。为了连接⼀个SSL HTTP服务器,命令如下:
openssl s_client -connect servername:443
⼀旦和某个SSL server建⽴连接之后,所有从server得到的数据都会被打印出来,所有你在终端上输⼊的东西也会被送给server. 这是⼈机交互式的。这时候不能设置-quiet和 -ign_eof这俩个选项。如果输⼊的某⾏开头字母是R,那么在这⾥session会重启, 如果输⼊的某⾏开头
是Q,那么连接会被断开。你完成整个输⼊之后连接也会被断开。
如果连接成功,你可以⽤HTTP的指令,⽐如"GET /"什么的去获得⽹页了。
如果握⼿失败,原因可能有以下⼏种:
1.server需要验证你的证书,但你没有证书。
2. 如果肯定不是原因1,那么就慢慢⼀个⼀个set以下⼏个选项:-bugs, -ssl2, -ssl3, -tls1,-no_ssl2,-no_ssl3, -no_dtls。
3. 这可能是因为对⽅的server处理SSL有bug。
有的时候,client会报错:没有证书可以使⽤,或者供选择的证书列表是空的。这⼀般是因为Server没有把给你签名的CA的名字列进它⾃⼰认为可以信任的CA列表,你可以⽤检查⼀下server的信任CA列表。有的http server只在 client给出了⼀个URL之后才验证client的证书,这中情况下要设置 -prexit这个选项,并且送给server⼀个页⾯请求。
即使使⽤-cert指明使⽤的证书,如果server不要求验证client的证书,那么该证书也不会被验证。所以不要以为在命令⾏⾥加了-cert 的参数⼜连接成功就代表你的证书没有问题。
如果验证server的证书有问题,就可以设置-showcerts来看看server的证书的CA链了。
⾃从SSLv23客户端hello不能够包含压缩⽅法或扩展仅仅会被⽀持。
BUGs:
代码的s_client很难去读取为什么会被关闭。⼀个典型的SSL客户端项⽬将会更加简单的。如果服务器验证失败,B<-verify>将会退出。
B<-prexit>选项是⼀个很⼩的空间。当⼀个session重启后,我们必须报告。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论