2016-08-04 70 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:它是最简单的方法。您也可以编写自己的验证回调并直接比较证书。 –

相关问题