http://blog.csdn.net/as3luyuan123/article/details/16812071算法
用途:windows
s_client爲一個SSL/TLS客戶端程序,與s_server對應,它不只能與s_server進行通訊,也能與任何使用ssl協議的其餘服務程序進行通訊。安全
用法:服務器
選項說明:session
-host host:設置服務地址。socket
-port port:設置服務端口,默認爲4433。測試
-connect host:port:設置服務器地址和端口號。若是沒有設置,則默認爲本地主機以及端口號4433。ui
-verify depth:設置證書的驗證深度。記得CA也是分層次的吧?若是對方的證書的簽名CA不是Root CA,那麼你能夠再去驗證給該CA的證書籤名的CA,一直到Root CA. 目前的驗證操做即便這條CA鏈上的某一個證書驗證有問題也不會影響對更深層的CA的身份的驗證。因此整個CA鏈上的問題均可以檢查出來。固然CA的驗證出問題並不會直接形成鏈接立刻斷開,好的應用程序可讓你根據驗證結果決定下一步怎麼走。加密
-cert filename:使用的證書文件。若是server不要求要證書,這個能夠省略。.net
-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這個選項。
-ssl二、-ssl三、-tls1_一、-tls1_二、-tls一、-dtls一、-no_ssl二、-no_ssl三、-no_tls一、-no_tls1_一、-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重啓後,咱們必須報告。