2016-08-04 17 views
1

IO::Socket::SSLクライアントと接続するときにサーバー証明書を使用します。IO ::ソケット:: SSLクライアントのサーバー証明書のチェック

私がやったことは

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. 

これは動作しません、最初の証明書を抽出することである

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

、その後、例フォルダからssl_client.plを使用して接続


-----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----- 
期待どおりにローカルに保存された証明書を使用してサーバーを正しく検証する

+0

@SteffenUllrich私はあなたがすでに何が間違っているかを知っていると信じています。 ':)' –

+1

彼はあなたのことを聞くことができません;) – simbabque

+0

私はcertが 'localhost'のためだと思っています。適切なドメインを使用する必要があります。 – ikegami

答えて

3

証明書は自己署名(すなわち、それ自体が署名した)、それはCAではないですが:それは証明書の発行者として使用することが許可されていないCAではありませんので

X509v3 extensions: 
     X509v3 Basic Constraints: 
      CA:FALSE 

と理論的にはそれ自体に署名するために使用されることさえできない。

これは少なくともOpenSSLで実装されているロジックです(したがってNet :: SSLeay、IO :: Socket :: SSL)。 NSSのような他の実装は、サーバ証明書自体が明示的に信頼されているかどうかをチェックするため、おそらくそのような証明書で動作するようです。このようなチェックは、IO :: Socket :: SSL(または-CAfile-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]は、このコールバックがレベル証明書レベル0でok=0でコールされたことを示します。つまり、OpenSSLのビルトイン検証ではこの証明書が有効であるとはみなされませんでした。

+0

さて、SSL_fingerprintはそのようなサーバーを確認する唯一の方法ですか? –

+1

@Сухой27:その最も簡単な方法。独自の検証コールバックを作成し、直接証明書を比較することもできます。 –

関連する問題