OpenSSL s_client

用途:

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

用法:

[cpp] view plaincopy

 

  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命令獲得。比如:openssl  x509 -hash  -in ./GlobalSignRootCA.crt

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章