分类: 网络与安全
2015-08-21 17:44:07
用途:
s_server是openssl提供的一个SSL服务程序。使用此程序前,需要生成各种证书。本命令可以用来测试ssl客户端,比如各种浏览器的https协议支持。
用法:
选项说明:
-accept port:监听的TCP端口。缺省为4433。
-context id:设置SSL context的id, 可以设置为任何值。SSL context是会话ID的上下文。也可以不设置这个选项,,有缺省的给你用的。
-verify depth、-Verify depth:意义和s_client的这个选项一样,但同时表示必须验证client的证书。不记得server对client的证书验证是可以选的吗?-verify表示向client要求证书,但client还是可以选择不发送证书,-Verify表示一定要client的证书验证,否则握手失败。
-crl_check、-crl_check_all:检查客户端的证书是否在CA的废除列表中。CRL(s)在证书文件中。crl_check_all表示要检查所有的CA证书中的废除列表。
-cert filename:使用的证书文件名。大多数服务器算法套件需要一个证书,还有一些需要证书的公钥类型,例如DSS算法组件需要证书(包含一个DSS(DSA)密钥)。缺省使用 ./server.pem。
-certform DER|PEM:证书的格式,一般为DER或PEM。缺省为PEM。
-key filename:使用的私有密钥文件。如果没有指定,那么证书文件会被使用(使用的是证书公钥值)。
-keyform DER|PEM:私有密钥文件的格式,一般为DER或PEM。缺省为PEM。
-pass arg:私钥保护口令来源。
-dcert filename、-dkey keyfile:指定一个附加的证书文件和私有密钥文件。不同的cipher需要不同的证书和私有密钥文件。这个不同的cipher主要指cipher里面的不对称加密算法不同。比如基于RSA的cipher需要的是RSA的私有密钥文件和证书,而基于DSA的算法则需要的是DSA的私有密钥文件和证书。这个option可以让这样我们的server同时支持俩种算法的cipher成为可能。
-dcertform DER|PEM:附加证书的格式,一般为DER或PEM。缺省为PEM。
-dkeyform DER|PEM:附加的私有密钥文件的格式,一般为DER或PEM。缺省为PEM。
-dpass arg:附加私钥保护口令来源。
-dhparam filename:使用的DH参数文件名。如果没有设置,那么server会试图去从证书文件里面获得这些参数。如果证书里面没有这么参数,一些hard code的参数就被调用。
-name_curve arg:椭圆曲线算法的选择类型。
-nbio_test:检查非阻塞socket的I/O运行情况。
-nbio:使用非阻塞socket。
-crlf:把在终端输入的换行回车转化成/r/n送出去。
-debug:打印所有的调试信息。
-msg:用16进制显示所有的协议数据。
-state:打印SSL session的状态, ssl也是一个协议,当然有状态。
-CApath directory:设置信任CA文件所在路径,此路径中的ca文件名采用特殊的形式:xxx.0,其中xxx为CA证书持有者的哈希值,它通过x509 -hash命令获得。
-CAfile filename:某文件,里面是所有你信任的CA的证书的内容。当你要建立client的证书链的时候也需要用到这个文件。
-nocert:如果server不想使用任何证书,就设置这个选项。目前只有anonymous DH算法有需要这么做。
-cipher cipherlist:由我们自己来决定选用什么加密算法,尽管是由server来决定使用什么算法列表,但它一般都会采用我们送过去的cipher列表里的第一个cipher。
-quiet:禁止打印sessionhe 和证书信息值。
-no_tmp_rsa:现在的接口cipher有时会使用临时RSA密钥。那就是说每次对话的时候临时生成密钥对。本选项就是用来禁止这种情况的。
-ssl2、-ssl3、-tls1_1、-tls1_2、-tls1、-dtls1、-no_ssl2、-no_ssl3、-no_tls1、-no_tls1_1、-no_tls1_2:使用的协议状态值。
-no_dhe:如果这个选项被设置,则没有DH参数提供,即不能够使用关于DH相关的ciphers。
-no_ecdhe:能够使用关于ECDH相关的ciphers。
-bugs:打印所有的调试信息。
-hack:这个选项对更早的Netscape SSL代码提供一个可行的解决方案。
-www:当client连接上来的时候,发回一个网页,内容就是SSL握手的一些内容。
-HTTP、-WWW:用来把具体某个文件当网页发回给client的请求。比如client的URL请求是 ,就把 ./page.html发回给client。-engine id:硬件引擎。
-tlsextdebug:打印TLS协议中服务器端接收到的额外信息值。
-no_ticket:不支持RFC4507bis会话类型。
-id_prefix arg:根据arg的值来产生SSL/TLS中的session IDs的前缀。当有多个服务器的时候,大多数用于测试SSL/TLS代码。
-rand file(s):指定随机数种子文件,多个文件间用分隔符分开,windows用“;”,OpenVMS用“,“,其他系统用“:”。
连接的命令:
没有设置 –www、 -WWW这俩个选项,当一个ssl client连接上来的话它所发过来的任何东西都会显示出来,你在终端输入的任何东西都会发回给client。你可以通过在终端输入的行的第一个字母控制一些行为。
q:
中断当前连接,但不关闭server.
Q
中断当前连接,退出程序。
r
进行renegotiate行为。
R
进行renegotiate行为, 并且要求client的证书。
P
在TCP层直接送一些明文。这会使client认为我们没有按协议的游戏规则进行通信而断开连接。
S
打印出session-cache的状态信息。session-cache在编程章节会详细介绍。
注意:
B<s_server>可以用于调试SSL客户端。为了从一个web浏览器接受连接,命令如下:
openssl s_server -accept 443 -www
可以这样使用。
大多数的web(Netscape 和 MSIE除外)仅仅支持RSA算法套件。因此当使用非RSA格式的证书时,他们不能够连接服务器。
即使指定一个空的CA列表,当请求一个客户端证书时敬爱那个严重的违反协议标准,一些SSL客户端解释说任何CA都可以接受。这个对调试证书用途非常有效。
可以使用B<sess_id>命令来打印出使用的session参数。
BUGs:
因为该项目有很多选项,好多用的是老的技术,c代码的s_client很难去读取为什么会被关闭。一个典型的SSL客户端项目将会更加简单的。
普通的算法输出是个错误:它仅仅给出了OpenSSL确认的客户端支持的算法套件列表。
这是一个方法:打印客户端支持的不知名的算法套件的详细信息值。