用途:

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:證書的格式,一般為DERPEM。預設為PEM格式。

-key filename:使用的證書私鑰檔案。

-keyform DER|PEM:證書私鑰檔案的格式,一般為DERPEM。預設為PEM格式。

-pass arg:私鑰保護口令來源,比如:-pass file:pwd.txt,將私鑰保護口令存放在一個檔案中,通過此選項來指定,不需要使用者來輸入口令。

-CApath directory:設定信任CA檔案所在路徑,此路徑中的ca檔名採用特殊的形式:xxx.0,其中xxxCA證書持有者的雜湊值,它通過x509 -hash命令獲得。

-CAfile filename:某檔案,裡面是所有你信任的CA的證書的內容。當你要建立client的證書鏈的時候也需要用到這個檔案。

-reconnect:使用同樣的session-id連線同一個server五次,用來測試serversession緩衝功能是否有問題。

-pause:每當讀寫資料時,sleep 1秒。

-showcerts:顯示整條server的證書的CA的證書鏈。否則只顯示server的證書。

-debug:列印所有的除錯資訊。

-msg:用16進位制顯示所有的協議資料。

-state:列印SSL session的狀態, ssl也是一個協議,當然有狀態。

-nbio_test:檢查非阻塞socketI/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 protocolprotocol可以為smtppop3,用於郵件安全傳輸。

-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處理SSLbug

有的時候,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重啟後,我們必須報告。