|  |  | 
|  | =pod | 
|  |  | 
|  | =head1 NAME | 
|  |  | 
|  | s_client - SSL/TLS client program | 
|  |  | 
|  | =head1 SYNOPSIS | 
|  |  | 
|  | B<openssl> B<s_client> | 
|  | [B<-connect> host:port>] | 
|  | [B<-verify depth>] | 
|  | [B<-cert filename>] | 
|  | [B<-key filename>] | 
|  | [B<-CApath directory>] | 
|  | [B<-CAfile filename>] | 
|  | [B<-reconnect>] | 
|  | [B<-pause>] | 
|  | [B<-showcerts>] | 
|  | [B<-debug>] | 
|  | [B<-nbio_test>] | 
|  | [B<-state>] | 
|  | [B<-nbio>] | 
|  | [B<-crlf>] | 
|  | [B<-ign_eof>] | 
|  | [B<-quiet>] | 
|  | [B<-ssl2>] | 
|  | [B<-ssl3>] | 
|  | [B<-tls1>] | 
|  | [B<-no_ssl2>] | 
|  | [B<-no_ssl3>] | 
|  | [B<-no_tls1>] | 
|  | [B<-bugs>] | 
|  | [B<-cipher cipherlist>] | 
|  | [B<-engine id>] | 
|  |  | 
|  | =head1 DESCRIPTION | 
|  |  | 
|  | The B<s_client> command implements a generic SSL/TLS client which connects | 
|  | to a remote host using SSL/TLS. It is a I<very> useful diagnostic tool for | 
|  | SSL servers. | 
|  |  | 
|  | =head1 OPTIONS | 
|  |  | 
|  | =over 4 | 
|  |  | 
|  | =item B<-connect host:port> | 
|  |  | 
|  | This specifies the host and optional port to connect to. If not specified | 
|  | then an attempt is made to connect to the local host on port 4433. | 
|  |  | 
|  | =item B<-cert certname> | 
|  |  | 
|  | The certificate to use, if one is requested by the server. The default is | 
|  | not to use a certificate. | 
|  |  | 
|  | =item B<-key keyfile> | 
|  |  | 
|  | The private key to use. If not specified then the certificate file will | 
|  | be used. | 
|  |  | 
|  | =item B<-verify depth> | 
|  |  | 
|  | The verify depth to use. This specifies the maximum length of the | 
|  | server certificate chain and turns on server certificate verification. | 
|  | Currently the verify operation continues after errors so all the problems | 
|  | with a certificate chain can be seen. As a side effect the connection | 
|  | will never fail due to a server certificate verify failure. | 
|  |  | 
|  | =item B<-CApath directory> | 
|  |  | 
|  | The directory to use for server certificate verification. This directory | 
|  | must be in "hash format", see B<verify> for more information. These are | 
|  | also used when building the client certificate chain. | 
|  |  | 
|  | =item B<-CAfile file> | 
|  |  | 
|  | A file containing trusted certificates to use during server authentication | 
|  | and to use when attempting to build the client certificate chain. | 
|  |  | 
|  | =item B<-reconnect> | 
|  |  | 
|  | reconnects to the same server 5 times using the same session ID, this can | 
|  | be used as a test that session caching is working. | 
|  |  | 
|  | =item B<-pause> | 
|  |  | 
|  | pauses 1 second between each read and write call. | 
|  |  | 
|  | =item B<-showcerts> | 
|  |  | 
|  | display the whole server certificate chain: normally only the server | 
|  | certificate itself is displayed. | 
|  |  | 
|  | =item B<-prexit> | 
|  |  | 
|  | print session information when the program exits. This will always attempt | 
|  | to print out information even if the connection fails. Normally information | 
|  | will only be printed out once if the connection succeeds. This option is useful | 
|  | because the cipher in use may be renegotiated or the connection may fail | 
|  | because a client certificate is required or is requested only after an | 
|  | attempt is made to access a certain URL. Note: the output produced by this | 
|  | option is not always accurate because a connection might never have been | 
|  | established. | 
|  |  | 
|  | =item B<-state> | 
|  |  | 
|  | prints out the SSL session states. | 
|  |  | 
|  | =item B<-debug> | 
|  |  | 
|  | print extensive debugging information including a hex dump of all traffic. | 
|  |  | 
|  | =item B<-nbio_test> | 
|  |  | 
|  | tests non-blocking I/O | 
|  |  | 
|  | =item B<-nbio> | 
|  |  | 
|  | turns on non-blocking I/O | 
|  |  | 
|  | =item B<-crlf> | 
|  |  | 
|  | this option translated a line feed from the terminal into CR+LF as required | 
|  | by some servers. | 
|  |  | 
|  | =item B<-ign_eof> | 
|  |  | 
|  | inhibit shutting down the connection when end of file is reached in the | 
|  | input. | 
|  |  | 
|  | =item B<-quiet> | 
|  |  | 
|  | inhibit printing of session and certificate information.  This implicitely | 
|  | turns on B<-ign_eof> as well. | 
|  |  | 
|  | =item B<-ssl2>, B<-ssl3>, B<-tls1>, B<-no_ssl2>, B<-no_ssl3>, B<-no_tls1> | 
|  |  | 
|  | these options disable the use of certain SSL or TLS protocols. By default | 
|  | the initial handshake uses a method which should be compatible with all | 
|  | servers and permit them to use SSL v3, SSL v2 or TLS as appropriate. | 
|  |  | 
|  | Unfortunately there are a lot of ancient and broken servers in use which | 
|  | cannot handle this technique and will fail to connect. Some servers only | 
|  | work if TLS is turned off with the B<-no_tls> option others will only | 
|  | support SSL v2 and may need the B<-ssl2> option. | 
|  |  | 
|  | =item B<-bugs> | 
|  |  | 
|  | there are several known bug in SSL and TLS implementations. Adding this | 
|  | option enables various workarounds. | 
|  |  | 
|  | =item B<-cipher cipherlist> | 
|  |  | 
|  | this allows the cipher list sent by the client to be modified. Although | 
|  | the server determines which cipher suite is used it should take the first | 
|  | supported cipher in the list sent by the client. See the B<ciphers> | 
|  | command for more information. | 
|  |  | 
|  | =item B<-engine id> | 
|  |  | 
|  | specifying an engine (by it's unique B<id> string) will cause B<s_client> | 
|  | to attempt to obtain a functional reference to the specified engine, | 
|  | thus initialising it if needed. The engine will then be set as the default | 
|  | for all available algorithms. | 
|  |  | 
|  | =back | 
|  |  | 
|  | =head1 CONNECTED COMMANDS | 
|  |  | 
|  | If a connection is established with an SSL server then any data received | 
|  | from the server is displayed and any key presses will be sent to the | 
|  | server. When used interactively (which means neither B<-quiet> nor B<-ign_eof> | 
|  | have been given), the session will be renegociated if the line begins with an | 
|  | B<R>, and if the line begins with a B<Q> or if end of file is reached, the | 
|  | connection will be closed down. | 
|  |  | 
|  | =head1 NOTES | 
|  |  | 
|  | B<s_client> can be used to debug SSL servers. To connect to an SSL HTTP | 
|  | server the command: | 
|  |  | 
|  | openssl s_client -connect servername:443 | 
|  |  | 
|  | would typically be used (https uses port 443). If the connection succeeds | 
|  | then an HTTP command can be given such as "GET /" to retrieve a web page. | 
|  |  | 
|  | If the handshake fails then there are several possible causes, if it is | 
|  | nothing obvious like no client certificate then the B<-bugs>, B<-ssl2>, | 
|  | B<-ssl3>, B<-tls1>, B<-no_ssl2>, B<-no_ssl3>, B<-no_tls1> can be tried | 
|  | in case it is a buggy server. In particular you should play with these | 
|  | options B<before> submitting a bug report to an OpenSSL mailing list. | 
|  |  | 
|  | A frequent problem when attempting to get client certificates working | 
|  | is that a web client complains it has no certificates or gives an empty | 
|  | list to choose from. This is normally because the server is not sending | 
|  | the clients certificate authority in its "acceptable CA list" when it | 
|  | requests a certificate. By using B<s_client> the CA list can be viewed | 
|  | and checked. However some servers only request client authentication | 
|  | after a specific URL is requested. To obtain the list in this case it | 
|  | is necessary to use the B<-prexit> command and send an HTTP request | 
|  | for an appropriate page. | 
|  |  | 
|  | If a certificate is specified on the command line using the B<-cert> | 
|  | option it will not be used unless the server specifically requests | 
|  | a client certificate. Therefor merely including a client certificate | 
|  | on the command line is no guarantee that the certificate works. | 
|  |  | 
|  | If there are problems verifying a server certificate then the | 
|  | B<-showcerts> option can be used to show the whole chain. | 
|  |  | 
|  | =head1 BUGS | 
|  |  | 
|  | Because this program has a lot of options and also because some of | 
|  | the techniques used are rather old, the C source of s_client is rather | 
|  | hard to read and not a model of how things should be done. A typical | 
|  | SSL client program would be much simpler. | 
|  |  | 
|  | The B<-verify> option should really exit if the server verification | 
|  | fails. | 
|  |  | 
|  | The B<-prexit> option is a bit of a hack. We should really report | 
|  | information whenever a session is renegotiated. | 
|  |  | 
|  | =head1 SEE ALSO | 
|  |  | 
|  | L<sess_id(1)|sess_id(1)>, L<s_server(1)|s_server(1)>, L<ciphers(1)|ciphers(1)> | 
|  |  | 
|  | =cut |