OpenSSL命令---s_client


http://blog.csdn.net/as3luyuan123/article/details/16812071

用途:

s_client為一個SSL/TLS客戶端程序,與s_server對應,它不僅能與s_server進行通信,也能與任何使用ssl協議的其他服務程序進行通信。

用法:

[cpp]  view plain copy
 
  1. openssl s_client [-host host] [-port port] [-connect host:port] [-verify depth] [-cert filename]   
  2. [-certform DER|PEM] [-key filename] [-keyform DER|PEM] [-pass arg] [-CApath directory] [-CAfile filename]   
  3. [-reconnect][-pause] [-showcerts] [-debug] [-msg] [-state] [-nbio_test] [-nbio][-crlf] [-ign_eof] [-no_ign_eof]   
  4. [-quiet] [-ssl2] [-ssl3] [-tls1_1] [-tls1_2] [-tls1] [-dtls1] [-no_ssl2][-no_ssl3] [-no_tls1] [-no_tls1_1]   
  5. [-no_tls1_2] [-bugs] [-cipher cipherlist] [-starttls protocol] [-engine id] [-tlsextdebug] [-no_ticket]   
  6. [-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為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這個選項。

-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重啟后,我們必須報告。

版權聲明:本文為博主原創文章,未經博主允許不得轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM