OpenSSL命令---s_client
用途:
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:證書的格式,一般為DER和PEM。預設為PEM格式。
-key filename:使用的證書私鑰檔案。
-keyform DER|PEM:證書私鑰檔案的格式,一般為DER和PEM。預設為PEM格式。
-pass arg:私鑰保護口令來源,比如:-pass file:pwd.txt,將私鑰保護口令存放在一個檔案中,通過此選項來指定,不需要使用者來輸入口令。
-CApath directory:設定信任CA檔案所在路徑,此路徑中的ca檔名採用特殊的形式:xxx.0,其中xxx
-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重啟後,我們必須報告。