http://blog.csdn.net/as3luyuan123/article/details/16812071算法
用途:windows
s_client为一个SSL/TLS客户端程序,与s_server对应,它不只能与s_server进行通讯,也能与任何使用ssl协议的其余服务程序进行通讯。安全
用法:服务器
选项说明:session
-host host:设置服务地址。socket
-port port:设置服务端口,默认为4433。测试
-connect host:port:设置服务器地址和端口号。若是没有设置,则默认为本地主机以及端口号4433。ui
-verify depth:设置证书的验证深度。记得CA也是分层次的吧?若是对方的证书的签名CA不是Root CA,那么你能够再去验证给该CA的证书签名的CA,一直到Root CA. 目前的验证操做即便这条CA链上的某一个证书验证有问题也不会影响对更深层的CA的身份的验证。因此整个CA链上的问题均可以检查出来。固然CA的验证出问题并不会直接形成链接立刻断开,好的应用程序可让你根据验证结果决定下一步怎么走。加密
-cert filename:使用的证书文件。若是server不要求要证书,这个能够省略。.net
-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这个选项。
-ssl二、-ssl三、-tls1_一、-tls1_二、-tls一、-dtls一、-no_ssl二、-no_ssl三、-no_tls一、-no_tls1_一、-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:
由于该项目有不少选项,好多用的是老的技术,c代码的s_client很难去读取为何会被关闭。一个典型的SSL客户端项目将会更加简单的。
若是服务器验证失败,B<-verify>将会退出。
B<-prexit>选项是一个很小的空间。当一个session重启后,咱们必须报告。