当前位置: 首页 > news >正文

OpenSSL命令---s_client

用途:


s_client为一个SSL/TLS客户端程序,与s_server对应,它不仅能与s_server进行通信,也能与任何使用ssl协议的其他服务程序进行通信。


用法:


[cpp] view plain copy

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:设置服务端口,默认为443。


-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用“,“,其他系统用“:”。


连接选项:


如果一个确认的连接到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重启后,我们必须报告。


0


相关文章:

  • Wireshark设置interface 时提示“There are no interfaces on which a capture can be done ”
  • MooseFS维护技巧集锦
  • linux 文件管理
  • Java安全——提供者相关的体系架构
  • 服务器TIME_WAIT和CLOSE_WAIT详解和解决办法
  • vijos 1426
  • 百度地图获取应用SHA1
  • Android Design Support Library使用详解——Snackbar
  • linux安全之iptables防火墙详解1
  • Python学习总结13:os模块
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 虚拟机的封装
  • dplyr 数据操作 数据排序 (arrange)
  • jquery分页滑动插件(鼠标可控制上下滑动)
  • 实战hadoop2.6.3+zookeeper3.4.6+hbase1.0.2高可用集群方案
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • flutter的key在widget list的作用以及必要性
  • JavaScript DOM 10 - 滚动
  • Java比较器对数组,集合排序
  • Linux各目录及每个目录的详细介绍
  • MySQL的数据类型
  • Python学习之路16-使用API
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • spring学习第二天
  • Vue 重置组件到初始状态
  • 前嗅ForeSpider采集配置界面介绍
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 延迟脚本的方式
  • 在electron中实现跨域请求,无需更改服务器端设置
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • python最赚钱的4个方向,你最心动的是哪个?
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • $().each和$.each的区别
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (4) PIVOT 和 UPIVOT 的使用
  • (7)STL算法之交换赋值
  • (rabbitmq的高级特性)消息可靠性
  • (笔试题)分解质因式
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (力扣)循环队列的实现与详解(C语言)
  • (原創) 未来三学期想要修的课 (日記)
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转载)hibernate缓存
  • .NET 读取 JSON格式的数据
  • .Net 知识杂记
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .NET学习教程二——.net基础定义+VS常用设置
  • .Net语言中的StringBuilder:入门到精通
  • .so文件(linux系统)