[譯]OpenSSL Cookbook


  記錄個人學習過程吧,順便翻譯一下。另外,本文並不會包括原連接中的所有內容,僅包括個人在工作中會經常遇到的。

  參考:OpenSSL Cookbook

前言

  由於協議特性和實現的復雜性,有時很難確定安全服務器的確切配置和特性。盡管存在許多用於此目的的工具,但通常很難確切知道它們是如何實現的,這有時會使完全信任它們的結果變得困難。盡管我花了很多年的時間測試安全服務器,並且能夠使用好的工具,但當我真的想了解發生了什么時,我還是求助於使用OpenSSL和Wireshark。我不是說您應該在日常測試中使用OpenSSL;相反,您應該找到一個您信任的自動化工具。但是,當您真的需要確定某些事情時,唯一的方法就是用OpenSSL。

  OpenSSL附帶了一個客戶端工具,您可以使用它連接到安全服務器。該工具類似於telnet或nc,從某種意義上說,它處理SSL/TLS層,但允許您完全控制接下來的層。

幫助信息

  openssl幫助信息很豐富,需要慢慢消化。

# openssl -h
openssl:Error: '-h' is an invalid command.

Standard commands
asn1parse         ca                ciphers           cms               
crl               crl2pkcs7         dgst              dh                
dhparam           dsa               dsaparam          ec                
ecparam           enc               engine            errstr            
gendh             gendsa            genpkey           genrsa            
nseq              ocsp              passwd            pkcs12            
pkcs7             pkcs8             pkey              pkeyparam         
pkeyutl           prime             rand              req               
rsa               rsautl            s_client          s_server          
s_time            sess_id           smime             speed             
spkac             ts                verify            version           
x509              

Message Digest commands (see the `dgst' command for more details)
md2               md4               md5               rmd160            
sha               sha1              

Cipher commands (see the `enc' command for more details)
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb       
aes-256-cbc       aes-256-ecb       base64            bf                
bf-cbc            bf-cfb            bf-ecb            bf-ofb            
camellia-128-cbc  camellia-128-ecb  camellia-192-cbc  camellia-192-ecb  
camellia-256-cbc  camellia-256-ecb  cast              cast-cbc          
cast5-cbc         cast5-cfb         cast5-ecb         cast5-ofb         
des               des-cbc           des-cfb           des-ecb           
des-ede           des-ede-cbc       des-ede-cfb       des-ede-ofb       
des-ede3          des-ede3-cbc      des-ede3-cfb      des-ede3-ofb      
des-ofb           des3              desx              idea              
idea-cbc          idea-cfb          idea-ecb          idea-ofb          
rc2               rc2-40-cbc        rc2-64-cbc        rc2-cbc           
rc2-cfb           rc2-ecb           rc2-ofb           rc4               
rc4-40            rc5               rc5-cbc           rc5-cfb           
rc5-ecb           rc5-ofb           seed              seed-cbc          
seed-cfb          seed-ecb          seed-ofb          zlib 

連接測試

  要連接到服務器,需要提供主機名和端口。例如:

# openssl s_client -connect www.baidu.com:443

  輸出信息:

# openssl s_client -connect www.baidu.com:443
CONNECTED(00000003)
depth=2 C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Organization Validation CA - SHA256 - G2
verify return:1
depth=0 C = CN, ST = beijing, L = beijing, OU = service operation department, O = "Beijing Baidu Netcom Science Technology Co., Ltd", CN = baidu.com
verify return:1
---
Certificate chain
 0 s:/C=CN/ST=beijing/L=beijing/OU=service operation department/O=Beijing Baidu Netcom Science Technology Co., Ltd/CN=baidu.com
   i:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - SHA256 - G2
 1 s:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - SHA256 - G2
   i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIJrzCCCJegAwIBAgIMLO4ZPBiCeOo+Q3VzMA0GCSqGSIb3DQEBCwUAMGYxCzAJ
BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTwwOgYDVQQDEzNH
bG9iYWxTaWduIE9yZ2FuaXphdGlvbiBWYWxpZGF0aW9uIENBIC0gU0hBMjU2IC0g
RzIwHhcNMTkwNTA5MDEyMjAyWhcNMjAwNjI1MDUzMTAyWjCBpzELMAkGA1UEBhMC
Q04xEDAOBgNVBAgTB2JlaWppbmcxEDAOBgNVBAcTB2JlaWppbmcxJTAjBgNVBAsT
HHNlcnZpY2Ugb3BlcmF0aW9uIGRlcGFydG1lbnQxOTA3BgNVBAoTMEJlaWppbmcg
QmFpZHUgTmV0Y29tIFNjaWVuY2UgVGVjaG5vbG9neSBDby4sIEx0ZDESMBAGA1UE
AxMJYmFpZHUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtMa/
2lMgD+pA87hSF2Y7NgGNErSZDdObbBhTsRkIsPpzRz4NOnlieGEuVDxJfFbawL5h
VdVCcGoQvvW9jWSWIQCTYwmHtxm6DiA+SchT7QKPRgHroQeTc7vt8bPJ4vvd8Dkq
g630QZi8huq6dKim49DlxY6zC7LSrJF0Dv+AECM2YmUItIf1VwwlxwDY9ahduDNB
pypf2/pwniG7rkIWZgdp/hwmKoEPq3Pj1lIgpG2obNRmSKRv8mgKxWWhTr8EekBD
HNN1+3WsGdZKNQVuz9Vl0UTKawxYBMSFTx++LDLR8cYo+/kmNrVt+suWoqDQvPhR
3wdEvY9vZ8DUr9nNwwIDAQABo4IGGTCCBhUwDgYDVR0PAQH/BAQDAgWgMIGgBggr
BgEFBQcBAQSBkzCBkDBNBggrBgEFBQcwAoZBaHR0cDovL3NlY3VyZS5nbG9iYWxz
aWduLmNvbS9jYWNlcnQvZ3Nvcmdhbml6YXRpb252YWxzaGEyZzJyMS5jcnQwPwYI
KwYBBQUHMAGGM2h0dHA6Ly9vY3NwMi5nbG9iYWxzaWduLmNvbS9nc29yZ2FuaXph
dGlvbnZhbHNoYTJnMjBWBgNVHSAETzBNMEEGCSsGAQQBoDIBFDA0MDIGCCsGAQUF
BwIBFiZodHRwczovL3d3dy5nbG9iYWxzaWduLmNvbS9yZXBvc2l0b3J5LzAIBgZn
gQwBAgIwCQYDVR0TBAIwADBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmds
b2JhbHNpZ24uY29tL2dzL2dzb3JnYW5pemF0aW9udmFsc2hhMmcyLmNybDCCA0kG
A1UdEQSCA0AwggM8ggliYWlkdS5jb22CEmNsaWNrLmhtLmJhaWR1LmNvbYIQY20u
cG9zLmJhaWR1LmNvbYIQbG9nLmhtLmJhaWR1LmNvbYIUdXBkYXRlLnBhbi5iYWlk
dS5jb22CEHduLnBvcy5iYWlkdS5jb22CCCouOTEuY29tggsqLmFpcGFnZS5jboIM
Ki5haXBhZ2UuY29tgg0qLmFwb2xsby5hdXRvggsqLmJhaWR1LmNvbYIOKi5iYWlk
dWJjZS5jb22CEiouYmFpZHVjb250ZW50LmNvbYIOKi5iYWlkdXBjcy5jb22CESou
YmFpZHVzdGF0aWMuY29tggwqLmJhaWZhZS5jb22CDiouYmFpZnViYW8uY29tgg8q
LmJjZS5iYWlkdS5jb22CDSouYmNlaG9zdC5jb22CCyouYmRpbWcuY29tgg4qLmJk
c3RhdGljLmNvbYINKi5iZHRqcmN2LmNvbYIRKi5iai5iYWlkdWJjZS5jb22CDSou
Y2h1YW5rZS5jb22CCyouZGxuZWwuY29tggsqLmRsbmVsLm9yZ4ISKi5kdWVyb3Mu
YmFpZHUuY29tghAqLmV5dW4uYmFpZHUuY29tghEqLmZhbnlpLmJhaWR1LmNvbYIR
Ki5nei5iYWlkdWJjZS5jb22CEiouaGFvMTIzLmJhaWR1LmNvbYIMKi5oYW8xMjMu
Y29tggwqLmhhbzIyMi5jb22CDiouaW0uYmFpZHUuY29tgg8qLm1hcC5iYWlkdS5j
b22CDyoubWJkLmJhaWR1LmNvbYIMKi5taXBjZG4uY29tghAqLm5ld3MuYmFpZHUu
Y29tggsqLm51b21pLmNvbYIQKi5zYWZlLmJhaWR1LmNvbYIOKi5zbWFydGFwcHMu
Y26CESouc3NsMi5kdWFwcHMuY29tgg4qLnN1LmJhaWR1LmNvbYINKi50cnVzdGdv
LmNvbYISKi54dWVzaHUuYmFpZHUuY29tggthcG9sbG8uYXV0b4IKYmFpZmFlLmNv
bYIMYmFpZnViYW8uY29tggZkd3ouY26CD21jdC55Lm51b21pLmNvbYIMd3d3LmJh
aWR1LmNughB3d3cuYmFpZHUuY29tLmNuMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr
BgEFBQcDAjAdBgNVHQ4EFgQUdrXm1kn4+DbqdaltXk1VWzdc/ccwHwYDVR0jBBgw
FoAUlt5h8b0cFilTHMDMfTuDAEDmGnwwggEEBgorBgEEAdZ5AgQCBIH1BIHyAPAA
dgC72d+8H4pxtZOUI5eqkntHOFeVCqtS6BqQlmQ2jh7RhQAAAWqaLuGaAAAEAwBH
MEUCICx7TcD5hUeKLQrAeTvWtLVm+Kr7glitIzb+Frymg5khAiEAwC/NnJkgy32R
X9KLxhMQc7XBVAMzQZ+masUUk89pK2sAdgBvU3asMfAxGdiZAKRRFf93FRwR2QLB
ACkGjbIImjfZEwAAAWqaLt5PAAAEAwBHMEUCIAMyaJ450OtfGWHbpxJpbyhEgQKl
PMKjE9V+mCZfIBqgAiEAp4tis7C0RDLiEf9FjVURLDarKZNEyDRcznw1VzGuqxIw
DQYJKoZIhvcNAQELBQADggEBAKq5zVKO3DZdR9SL8zIXBkaDYKMnBUkpsRtGbjj+
k/4JQ2zSoVgkEkK3q0H4Rwp9ZLV13FpFFLKkGGuctzuPs37SvcBySzUFrg0tGR9Q
c3Ja35cYO9sq895EzmQtwR6EzHYkPjBnIyboT/cL9uxp139RqaBvuMQU4sBKSsQA
XVdqyUHEJSsyGKpiqB5JgXMcgV9e+uSUMsNQbY6qzGxMUwz6j040eZ+lYMD4UHW4
oZ0B5qslIww7JAJAWCT/NAKLlGEQaC+2gOPQX0oKpwLSwJg+HegCyCdxJrKoh7bb
nRBHS8ITYjTG0Dw5CTklj/6i9PP735snPfzQKOht3N0X0x8=
-----END CERTIFICATE-----
subject=/C=CN/ST=beijing/L=beijing/OU=service operation department/O=Beijing Baidu Netcom Science Technology Co., Ltd/CN=baidu.com
issuer=/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - SHA256 - G2
---
No client certificate CA names sent
Peer signing digest: SHA256
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 4265 bytes and written 415 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: 2328E4C2957DA5FBAEEE5B3E6F6B0D2211E5F5DD16F13264B8DDF89F4A1E6D3E
    Session-ID-ctx: 
    Master-Key: AB4C95789327147E8CA120FD72263C1CDD317F73D485C6BC6D80A0A282F7579FC8DCDBBCCA69C0089279899E7EE8F771
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket:
    0000 - 75 c7 57 c0 16 bd 32 33-cd fc 26 e2 0d 46 75 09   u.W...23..&..Fu.
    0010 - c8 7d d0 f1 04 be a8 46-da 3f 2c c5 ce 3a 8a c0   .}.....F.?,..:..
    0020 - 7f 06 fe d8 2c 03 30 c3-3c 78 92 8c da 5c dd 73   ....,.0.<x...\.s
    0030 - 61 69 a2 16 32 ad aa f1-8e 27 43 63 33 55 df de   ai..2....'Cc3U..
    0040 - b6 23 15 96 ec 39 17 66-c6 ee 88 8a 7a 9b b5 bb   .#...9.f....z...
    0050 - 85 03 eb a8 a3 27 eb 0b-c3 e9 ef 64 5c 28 9a 3f   .....'.....d\(.?
    0060 - fe 74 f3 31 13 fd a2 dd-df 4c 72 b0 9b d6 f5 b6   .t.1.....Lr.....
    0070 - 99 de dc 0d a1 d8 af 71-59 a3 b9 16 dd 99 54 1f   .......qY.....T.
    0080 - 0f 9a 74 29 e9 94 89 40-4a f2 fd cd 99 d1 6e 8a   ..t)...@J.....n.
    0090 - 70 21 46 0f b7 a9 17 e3-8d 14 d6 31 48 15 1a 56   p!F........1H..V

    Start Time: 1561509736
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
...  
# 等待輸入
View Code

  一旦您輸入命令,您將看到大量的診斷輸出(稍后會了解更多信息),然后有機會輸入您想要的任何類型。

HTTP請求

  因為我們正在與HTTP服務器通信,所以最明智的做法是提交一個HTTP請求。在下面的示例中,我使用head請求,因為它指示服務器不要發送響應主體:

--- HEAD / HTTP/1.0 Host: www.baidu.com 
HTTP/1.0 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Content-Length: 277
Content-Type: text/html
Date: Wed, 26 Jun 2019 00:45:21 GMT
Etag: "575e1f8a-115"
Last-Modified: Mon, 13 Jun 2016 02:50:50 GMT
Pragma: no-cache
Server: bfe/1.0.8.18

closed

  現在我們知道了TLS通信層正在工作:我們通過HTTP服務器,提交了一個請求,並收到了一個響應。

服務器端證書

  讓我們回到診斷輸出。前幾行將顯示有關服務器證書的信息:

CONNECTED(00000003)
depth=2 C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Organization Validation CA - SHA256 - G2
verify return:1
depth=0 C = CN, ST = beijing, L = beijing, OU = service operation department, O = "Beijing Baidu Netcom Science Technology Co., Ltd", CN = baidu.com
verify return:1
---

  在我的系統上(可能在您的系統上),s_client不會獲取默認的可信證書;它會抱怨證書鏈中存在自簽名證書。在大多數情況下,您不關心證書驗證;但如果這樣做,則需要將s_client指向受信任的證書,如下所示:

  此處就不展示了...

  輸出中的下一部分列出了服務器按交付順序提供的所有證書:  

Certificate chain
 0 s:/C=CN/ST=beijing/L=beijing/OU=service operation department/O=Beijing Baidu Netcom Science Technology Co., Ltd/CN=baidu.com
   i:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - SHA256 - G2
 1 s:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - SHA256 - G2
   i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
---
Server certificate
...                 # 詳細內容請查看上述折疊的部分

  對於每個證書,第一行顯示主題,第二行顯示頒發者信息。

  當您需要確切地查看發送的證書時,此部分非常有用;瀏覽器證書查看器通常會顯示重建的證書鏈,這些證書鏈與顯示的證書鏈幾乎完全不同。要確定鏈是否名義上正確,您可能希望驗證主題和發行者是否匹配。您從頂部的葉子(Web服務器)證書開始,然后沿着列表向下走,將當前證書的頒發者與下一個證書的主題匹配。您看到的最后一個頒發者可以指向不在鏈中的某個根證書,或者如果包含自簽名根,則可以指向自身。

  輸出中的下一項是服務器證書;它包含大量文本,但為了簡潔起見,我將刪除其中的大部分內容:(詳細請查看上述折疊的部分)

Server certificate
-----BEGIN CERTIFICATE-----
MIIJrzCCCJegAwIBAgIMLO4ZPBiCeOo+Q3VzMA0GCSqGSIb3DQEBCwUAMGYxCzAJ
BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTwwOgYDVQQDEzNH
...
nRBHS8ITYjTG0Dw5CTklj/6i9PP735snPfzQKOht3N0X0x8=
-----END CERTIFICATE-----
subject=/C=CN/ST=beijing/L=beijing/OU=service operation department/O=Beijing Baidu Netcom Science Technology Co., Ltd/CN=baidu.com
issuer=/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - SHA256 - G2
---

[注]每當您在主題中看到一個由數字組成的長字符串而不是名稱時,這意味着OpenSSL不知道所討論的對象標識符(OID)。OID是全局唯一且不含糊的標識符,用於引用“事物”。例如,在先前的輸出中,OID 1.3.6.1.4.1.311.60.2.1.3應替換為司法管轄區FindCorporationCountryName,后者用於擴展驗證(EV)證書。

  如果您想更好地查看證書,首先需要從輸出中復制它,並將其存儲在單獨的文件中。我將在下一節討論這個問題。

TLS連接信息

  以下是有關TLS連接的大量信息,其中大部分都是不言而喻的:

---
No client certificate CA names sent
Peer signing digest: SHA256
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 4265 bytes and written 415 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: 61D5849D3ADE5DD8CD2B4C4083EEAE7BE55FD3014AA295B163863D088065F4E2
    Session-ID-ctx: 
    Master-Key: BB2F16BADCE13227EA40E8F2B23C25B49A7EBF32ACA6B020E8FA9BD7A2CE48733A590CAF0527861A5A78540B09185865
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket:
    0000 - 75 c7 57 c0 16 bd 32 33-cd fc 26 e2 0d 46 75 09   u.W...23..&..Fu.
    0010 - f9 29 96 be 01 ff 90 23-59 28 6e 40 c2 b1 1e 6c   .).....#Y(n@...l
    0020 - 33 d1 e2 5d f6 58 44 c9-a1 9c 3a 9e 82 56 16 06   3..].XD...:..V..
    0030 - 32 a2 dc 28 e4 7d 33 9c-9c 38 d9 a2 a3 cf b2 1d   2..(.}3..8......
    0040 - fe 7f 93 da 9d 10 ba 35-c8 09 43 22 3e a6 bc 18   .......5..C">...
    0050 - 44 76 34 a0 fa 33 52 a2-bb 40 c2 03 f8 06 78 08   Dv4..3R..@....x.
    0060 - dd aa 00 26 d8 71 1a ad-86 33 ec 06 13 46 39 a6   ...&.q...3...F9.
    0070 - 1b f1 31 39 6a f7 e0 3c-5f cc 5a dd ee d8 64 3d   ..19j..<_.Z...d=
    0080 - 8e 8f ac 7d 1b 15 df d8-ff 99 8b 4c 91 d0 db 75   ...}.......L...u
    0090 - 5d 39 46 b8 6d 6c 72 25-9b cc f4 97 87 81 b1 ab   ]9F.mlr%........

    Start Time: 1561509914
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

  這里最重要的信息是協議版本(TLSv1.2)和使用的密碼套件(ECDHE-RSA-AES128-GCM-SHA256)。您還可以確定服務器已向您頒發了會話ID和TLS會話票證(一種在不保持服務器維護狀態的情況下恢復會話的方法),並且支持安全重新協商。一旦理解了所有這些輸出包含的內容,您將很少看到它。

測試升級到SSL的協議

  當使用HTTP時,TLS包裹住明文通信信道就成了HTTPS。有些協議開始是明文的,但隨后升級到加密。如果你想測試這樣一個協議,你必須告訴告訴Openssl是哪個協議,這樣才能代你升級。提供使用啟動開關-starttls。如:

# openssl s_client -connect gmail-smtp-in.l.google.com:25 -starttls smtp

  目前支持的協議有:smtp、pop3、imap、ftp和xmpp。

使用不同的握手格式

  有時,當您嘗試使用openssl測試服務器時,即使您知道服務器支持TLS,您嘗試與服務器通信也可能失敗(例如,當您嘗試使用瀏覽器時,您可以看到TLS正在工作)。出現這種情況的一個可能原因是服務器不支持舊的ssl 2握手。

  因為openssl嘗試協商它理解的所有協議,並且因為ssl 2只能使用舊的ssl2握手進行協商,所以它使用這個握手作為默認值。盡管它與一個非常老且不安全的協議版本相關聯,但舊的握手格式在技術上並不是不安全的。它支持升級,這意味着可以協商更好的協議。但是,這種握手格式不支持在ssl 2之后設計的許多連接協商功能。

  因此,如果某些東西不起作用,並且您不確定它到底是什么,那么您可以嘗試強制OpenSSL使用新的握手格式。您可以通過禁用ssl 2來做到這一點:

# openssl  s_client -connect www.baidu.com:443 -no_ssl2

  實現相同效果的另一種方法是在命令行上指定所需的服務器名稱:

# openssl s_client -connect ww.baidu.com:443 -servername www.baidu.com

  為了指定服務器名稱,OpenSSL需要使用更新握手格式的功能(該功能稱為服務器名稱指示[sni]),這將強制它放棄舊格式。

測試協議支持

  默認情況下,s_client將嘗試使用最佳協議與遠程服務器對話,並在輸出中報告協商的版本。

Protocol  : TLSv1.2

  如果您需要測試對特定協議版本的支持,您有兩個選項。通過提供-ssl2、-ssl3、-tls1、-tls1_1或-tls1_2開關之一,可以顯式選擇要測試的協議。或者,您可以使用以下一個或多個選項來選擇不想測試的協議:-無ssl2、-無ssl3、-無tls1、-無tls1_1或-無tls1_2。

[注]並非所有OpenSSL版本都支持所有協議版本。例如,舊版本的openssl將不支持tls 1.1和tls 1.2,新版本可能不支持舊協議,如ssl 2。

openssl支持的協議如下:
-ssl3         - just use SSLv3
-tls1_2       - just use TLSv1.2
-tls1_1       - just use TLSv1.1
-tls1         - just use TLSv1
-dtls1        - just use DTLSv1

  例如,以下是測試不支持特定協議版本的服務器時可能得到的輸出:

$ openssl s_client -connect www.example.com:443 -tls1_2
CONNECTED(00000003)
140455015261856:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:s3↩
_pkt.c:340:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 5 bytes and written 7 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1339231204
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---

測試加密套件支持

  如果您希望使用openssl來確定遠程服務器是否支持特定的密碼套件,則需要一些技巧。密碼配置字符串用於選擇要使用的套件,但如果僅指定一個套件並成功與服務器握手,則表明服務器支持該套件。如果握手失敗,您知道不存在支持。

  例如,要測試服務器是否支持RC4-SHA,請鍵入:

# openssl s_client -connect www.baidu.com:443 -cipher RC4-SHA

  如果要確定特定服務器支持的所有套件,請首先調用openssl ciphers all以獲取您的openssl版本支持的所有套件的列表。然后一個接一個地將它們提交到服務器,單獨測試它們。我不是建議你手動操作;在這種情況下,一點點的自動化會有很長的路要走。實際上,在這種情況下,四處尋找一個好的工具可能是合適的。

  然而,這種測試方式有一個缺點。您只能測試OpenSSL支持的套件。這曾經是一個更大的問題;在1.0版本之前,OpenSSL支持的套件數量要少得多(例如,在我的服務器上,0.9.8K版本為32個)。使用1.0.1分支的版本,您可以測試100多個套件,可能還可以測試大多數相關的套件。

  沒有單一的SSL/TLS庫支持所有密碼套件,這使得綜合測試變得困難。對於SSL實驗室,我使用部分握手來實現這一目的,使用一個定制的客戶機來假裝支持任意套件。實際上,它甚至不能協商一個套件,但是僅僅建議協商就足以讓服務器告訴您它們是否支持一個套件。不僅可以用這種方式測試所有套件,而且還可以非常有效地進行測試。

a.查看所有的密碼套件:
# openssl ciphers -v
b.所有openssl密碼的詳細列表,包括空密碼:
# openssl ciphers -v 'ALL:eNULL'
c.包括除空和匿名dh之外的所有密碼,然后按強度排序:
# openssl ciphers -v 'ALL:!ADH:@STRENGTH'
d.僅包括3DES密碼,然后將RSA密碼放在最后:
# openssl ciphers -v 'ALL:!ADH:@STRENGTH'

測試會話重用

  當與-reconnect開關結合使用時,可以使用s_client命令來測試會話重用。在此模式下,s_client將連接到目標服務器六次;它將在第一個連接上創建一個新會話,然后在隨后的五個連接中嘗試重用同一會話:

# echo | openssl s_client -connect example.com:443 -reconnect

  前面的命令將產生大量的輸出,其中大部分您不關心。關鍵部分是關於新會話和重用會話的信息。開始時應該只有一個新會話,由以下行指示:

New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384

  接下來是五個會話重用,用如下行表示:

Reused, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384

  大多數情況下,您不希望看到所有輸出,並希望快速得到答案。您可以使用以下命令行獲得它:

# echo | openssl s_client -connect example.com:443 -reconnect -no_ssl2 2> /dev/null | grep 'New\|Reuse'
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Reused, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Reused, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Reused, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Reused, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Reused, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384

  命令解釋如下:

-reconnect開關激活會話重用模式。
-no_sl2開關表示我們不希望嘗試ssl2連接,這會將第一個連接的握手更改為ssl 3或更好的連接。舊的ssl 2握手格式不支持tls擴展,並且會干擾支持會話票證的服務器上的會話重用機制。
2>/dev/null部分隱藏stderr輸出,這是您不關心的。
piped grep命令過濾掉其余輸出,只顯示您關系的部分。

測試重協商

  S_client工具有幾個功能,可以幫助您手動測試重新協商。首先,當您連接時,該工具將報告遠程服務器是否支持安全重新協商。這是因為支持安全重新協商的服務器通過握手階段交換的特殊TLS擴展來表示對它的支持。當支持可用時,輸出可能如下所示:  

---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported

  如果不支持安全重新協商,則輸出將略有不同:

Secure Renegotiation IS NOT supported

  即使服務器指示支持安全重新協商,您也可能希望測試它是否允許客戶端啟動重新協商。客戶端發起的重新協商是一種在實踐中不需要的協議功能(因為服務器總是可以在需要時啟動重新協商),並使服務器更容易受到拒絕服務攻擊。

  要啟動重新協商,您可以在一行上單獨鍵入R字符。

---
R
RENEGOTIATING
depth=0 C = UK, O = OpenSSL Group, OU = FOR TESTING PURPOSES ONLY, CN = Test Server Cert
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 C = UK, O = OpenSSL Group, OU = FOR TESTING PURPOSES ONLY, CN = Test Server Cert
verify error:num=21:unable to verify the first certificate
verify return:1

  表示重協商成功。

  重新協商時,服務器將再次向客戶端發送其證書。您可以在輸出中看到證書鏈的驗證。之后的下一行繼續使用主機請求頭。查看Web服務器的響應可以證明支持重新協商。由於在不同版本的ssl/tls庫中處理重新協商問題的方式不同,不支持重新協商的服務器可能會中斷連接或保持連接打開,但拒絕繼續進行協商(這通常會導致超時)。

  不支持重新協商的服務器將直接拒絕連接上的第二次握手:

---
R
RENEGOTIATING
140643029268384:error:14094153:SSL routines:ssl3_read_bytes:no renegotiation:s3_pkt.c:1481:

測試BEAST漏洞

  Beast攻擊利用了所有版本的ssl和tls 1.1之前的tls協議中存在的弱點。弱點影響到所有CBC套件以及客戶機和服務器數據流;但是,Beast攻擊僅針對客戶機。大多數現代瀏覽器使用所謂的1/N-1分割作為一種解決方案來防止利用,但一些服務器繼續在其端部署緩解措施,特別是如果它們的用戶群依賴於較舊(和未修補)的瀏覽器。

  因此,測試是否存在該漏洞僅需測試是否支持ssl協議和tls 1版本的加密協議即可。如下:

# openssl s_client -connect example.com:443 -ssl3
CONNECTED(00000003)
...
SSL-Session:
    Protocol  : SSLv3
...
# openssl s_client -connect example.com:443 -tls1
CONNECTED(00000003)
...
SSL-Session:
    Protocol  : TLSv1
    Cipher    : ECDHE-RSA-AES256-SHA
...

  可以看到是存在該漏洞的。

測試心臟滴血

  暫未找到測試環境,后續補充。

確定Diffie-Hellman參數的強度

  暫未找到測試環境,后續補充。


免責聲明!

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



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