2016-08-04 131 views
1

我想在與IO::Socket::SSL客戶端連接時使用服務器證書。IO :: Socket :: SSL客戶端檢查服務器證書

我所做的是首先提取證書,

openssl s_client -showcerts -connect 127.0.0.1:443 </dev/null 2>/dev/null|openssl x509 -outform PEM >/tmp/localhost.crt 

-----BEGIN CERTIFICATE----- 
MIID1jCCAr6gAwIBAgICBH8wDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAi0t 
MRIwEAYDVQQIDAlTb21lU3RhdGUxETAPBgNVBAcMCFNvbWVDaXR5MRkwFwYDVQQK 
DBBTb21lT3JnYW5pemF0aW9uMR8wHQYDVQQLDBZTb21lT3JnYW5pemF0aW9uYWxV 
bml0MRAwDgYDVQQDDAdiaWdnZXIyMRswGQYJKoZIhvcNAQkBFgxyb290QGJpZ2dl 
cjIwHhcNMTYwODA0MDUyMTA5WhcNMTcwODA0MDUyMTA5WjCBnzELMAkGA1UEBhMC 
LS0xEjAQBgNVBAgMCVNvbWVTdGF0ZTERMA8GA1UEBwwIU29tZUNpdHkxGTAXBgNV 
BAoMEFNvbWVPcmdhbml6YXRpb24xHzAdBgNVBAsMFlNvbWVPcmdhbml6YXRpb25h 
bFVuaXQxEDAOBgNVBAMMB2JpZ2dlcjIxGzAZBgkqhkiG9w0BCQEWDHJvb3RAYmln 
Z2VyMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALSJplghG5oD5FhU 
1v9IkE8z0k/7g1W29GhUXwf7IKzzjplIgpsZ+Ya/OtDbIctSYZ3gNEMyj+LdlvEW 
6rCDCSTULPWwdjuSdHmUiFyeJm+QBtnMIp9I3P7zPCd+W9Cyhue911tXCHiQMg+E 
ZNi2WlqnBGf/5l6VFRVMxQTEbTRiTPaH9VFnuyCKcJTk9ephZmZRgfeNmXT7BRjG 
nmsYa0jG2rh2UmJGQrJhZOZYmghbq1BL66m7yCxfknsjTHGfy7PS/c+K83fPVI0p 
bcBgl0VCA7d8TX6xj4BwMec7nwdi95ISVAG3jjL11+lrlcg6UGs+bd+NVpd1PbVY 
XwVcWu8CAwEAAaMaMBgwCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAwDQYJKoZIhvcN 
AQELBQADggEBAFkWi/C8UlEqXPO0aDrn78teYzh3D0BIuhB4vawDSUuz68Clq41u 
bMLIbdWZS244NFLeWAYJf4k0WDk7/nz5pxWLqlDg4LumZxNOUeSWUSbantRn6NnQ 
rJrWZi6gJFgeC/34t3k+XvtmbDl5a2L213TxOtnSZJty/ZxUr3v3Z3Dp5+kfTAyR 
xlD/gOlAEHgrOjwv1XofVb5pALPjzGj9gAfe/bpMEG4GORgtJzFz/teugL4yZ4Mk 
sk6BhIBd1hTWJXUfvH6GPaoieug46CAkolmvc0q2nfMiU+hZOkDE1rtyqS5XMF5t 
O2nma+wuMF6z/naEXFPq65sFOHI8vz+oEaQ= 
-----END CERTIFICATE----- 

,然後使用ssl_client.pl從實例文件夾連接起來,

ssl_client.pl -d10 --ca /tmp/localhost.crt localhost:443 
DEBUG: .../IO/Socket/SSL.pm:2757: new ctx 17132992 
DEBUG: .../IO/Socket/SSL.pm:643: socket not yet connected 
DEBUG: .../IO/Socket/SSL.pm:645: socket connected 
DEBUG: .../IO/Socket/SSL.pm:667: ssl handshake not started 
DEBUG: .../IO/Socket/SSL.pm:700: using SNI with hostname localhost 
DEBUG: .../IO/Socket/SSL.pm:735: request OCSP stapling 
DEBUG: .../IO/Socket/SSL.pm:769: call Net::SSLeay::connect 
DEBUG: .../IO/Socket/SSL.pm:2658: did not get stapled OCSP response 
DEBUG: .../IO/Socket/SSL.pm:2611: ok=0 [0] /C=--/ST=SomeState/L=SomeCity/O=SomeOrganization/OU=SomeOrganizationalUnit/CN=bigger2/[email protected]/C=--/ST=SomeState/L=SomeCity/O=SomeOrganization/OU=SomeOrganizationalUnit/CN=bigger2/[email protected] 
DEBUG: .../IO/Socket/SSL.pm:772: done Net::SSLeay::connect -> -1 
DEBUG: .../IO/Socket/SSL.pm:775: SSL connect attempt failed 

DEBUG: .../IO/Socket/SSL.pm:775: local error: SSL connect attempt failed error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 
DEBUG: .../IO/Socket/SSL.pm:778: fatal SSL error: SSL connect attempt failed error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 
DEBUG: ...inux/IO/Socket.pm:49: ignoring less severe local error 'IO::Socket::INET configuration failed', keep 'SSL connect attempt failed error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed' 
DEBUG: .../IO/Socket/SSL.pm:2779: free ctx 17132992 open=17132992 
DEBUG: .../IO/Socket/SSL.pm:2784: free ctx 17132992 callback 
DEBUG: .../IO/Socket/SSL.pm:2791: OK free ctx 17132992 
failed to connect to localhost:443: ,SSL connect attempt failed error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed at ./ssl_client.pl line 52. 

這不起作用如預期的那樣,請提出建議使用本地存儲的證書正確驗證服務器

+0

@SteffenUllrich我相信你已經知道這是什麼問題。 ':)' –

+1

他聽不到你;) – simbabque

+0

我懷疑'localhost'的證書。您需要使用適當的域名。 – ikegami

回答

3

雖然你的證書是自簽名(即簽署本身)它不是一個CA:

X509v3 extensions: 
     X509v3 Basic Constraints: 
      CA:FALSE 

因爲它是不是不允許用作證書的發佈CA並因此理論上甚至不能用於自己的標誌。

這至少是在OpenSSL中實現的邏輯(因此Net :: SSLeay,IO :: Socket :: SSL)。像NSS這樣的其他實現似乎適用於這種證書,可能是因爲它們檢查服務器證書本身是否被明確信任。這種檢查不同於僅檢查是否使用通過使用IO :: Socket :: SSL中的SSL_ca *選項(或,-CApath參數openssl s_client)中的SSL_ca *選項完成的受信任的CA簽名。

通過使用SSL_fingerprint選項,無論是自簽名,過期,撤消還是可以在IO :: Socket :: SSL中完成的任何操作,都明確信任特定的證書。

請注意,在這種情況下調試IO :: Socket :: SSL並沒有多大幫助,因爲這種情況下的邏輯是在OpenSSL中實現的。有一些小的指標,它出錯了:

DEBUG: ... ok=0 [0] .../CN=bigger2/[email protected] .../CN=bigger2/[email protected] 

這個調試語句是從驗證回調中調用的。 ok=0 [0]表示此回調在012級別證書級別0處用ok=0調用,即OpenSSL的內置驗證沒有將此證書視爲有效。

+0

好的,所以SSL_fingerprint是驗證此類服務器的唯一方法嗎? –

+1

@Сухой27:它是最簡單的方法。您也可以編寫自己的驗證回調並直接比較證書。 –

相關問題