web-dev-qa-db-ja.com

証明書が不明なCAによって署名されている場合、サーバーの証明書を表示するにはどうすればよいですか?

TLSの問題を引き起こしているサーバーがあり、問題の診断に役立てるために、サーバーが提示している証明書を表示したいと思います。通常、opensslを使用して次のように証明書を表示します。

$ openssl s_client -connect facebook.com:443

ただし、このサーバーの証明書にどのCAが署名したかはわかりません。私thoughtそれは私たちの内部CAでしたが、テストはそうではないことを示唆しています。したがって、opensslの-CAfileまたは-CApathフラグを使用してCAを指定することはできません。

もう1つの制限。サーバーはHTTPサーバーではありません(postgresです)。それ以外の場合は、curl --insecureを使用します。

OpenSSLのドキュメント によると、-verifyフラグを使用してみました。

使用する深さを確認します。これは、サーバー証明書チェーンの最大長を指定し、サーバー証明書の検証をオンにします。現在、検証操作はエラー後も続行されるため、証明書チェーンに関するすべての問題を確認できます。副作用として、サーバー証明書の検証の失敗が原因で接続が失敗することはありません。

すべての問題が見られるように、すべてのエラーの後で続行すると主張しています。しかし、私が得るのは:

1737:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:

これは、-verifyの有無にかかわらず表示されるエラーメッセージです。

では、サーバーから提示された証明書を表示するにはどうすればよいですか?

2
tytk

証明書が不明なCAによって署名されている場合、サーバーの証明書を表示するにはどうすればよいですか?

それは簡単です(そしてCAは物事を考慮しません)... _s_client_オプションを使用した入力として_x509_出力を_-text -noout_にパイプします。以下のコマンドは、SNIとTLS1.0も参加させます。

_$ openssl s_client -connect facebook.com:443 -servername facebook.com -tls1 | openssl x509 -text -noout
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA
verify error:num=20:unable to get local issuer certificate
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            0e:cb:09:39:b2:b1:01:54:b8:95:70:c7:b2:2b:7a:47
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA
        Validity
            Not Before: Aug 28 00:00:00 2014 GMT
            Not After : Dec 30 12:00:00 2016 GMT
        Subject: C = US, ST = CA, L = Menlo Park, O = "Facebook, Inc.", CN = *.facebook.com
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:d8:d1:dd:35:bd:e2:59:b6:fb:9b:1f:54:15:8c:
                    db:bf:4e:58:bd:47:be:b8:10:fc:22:e9:d2:9e:98:
                    f8:49:2a:25:fb:94:46:e4:42:99:84:50:1c:5f:01:
                    fd:14:25:31:5c:4e:d9:64:fd:c5:0c:b3:46:d2:a1:
                    bc:70:b4:87:8e
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        X509v3 extensions:
            X509v3 Authority Key Identifier: 
                keyid:51:68:FF:90:AF:02:07:75:3C:CC:D9:65:64:62:A2:12:B8:59:72:3B

            X509v3 Subject Key Identifier: 
                43:09:93:40:FA:11:4B:30:33:EC:F2:87:6E:8D:71:18:CF:8A:BC:8E
            X509v3 Subject Alternative Name: 
                DNS:*.facebook.com, DNS:*.facebook.net, DNS:*.fb.com, DNS:*.fbcdn.net, DNS:*.fbsbx.com, DNS:*.m.facebook.com, DNS:*.messenger.com, DNS:*.xx.fbcdn.net, DNS:*.xy.fbcdn.net, DNS:*.xz.fbcdn.net, DNS:facebook.com, DNS:fb.com, DNS:messenger.com
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 CRL Distribution Points: 

                Full Name:
                  URI:http://crl3.digicert.com/sha2-ha-server-g5.crl

                Full Name:
                  URI:http://crl4.digicert.com/sha2-ha-server-g5.crl

            X509v3 Certificate Policies: 
                Policy: 2.16.840.1.114412.1.1
                  CPS: https://www.digicert.com/CPS
                Policy: 2.23.140.1.2.2

            Authority Information Access: 
                OCSP - URI:http://ocsp.digicert.com
                CA Issuers - URI:http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt

            X509v3 Basic Constraints: critical
                CA:FALSE
            CT Precertificate SCTs: 
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : A4:B9:09:90:B4:18:58:14:87:BB:13:A2:CC:67:70:0A:
                                3C:35:98:04:F9:1B:DF:B8:E3:77:CD:0E:C8:0D:DC:10
                    Timestamp : Dec 16 15:50:03.515 2015 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:44:02:20:28:C8:7D:86:5D:F1:14:32:9D:3A:50:3E:
                                2F:C2:99:80:EC:13:C8:F9:1F:5D:9F:8A:0A:81:FB:F9:
                                EA:02:8C:F5:02:20:28:6F:7F:97:B3:27:01:66:BB:89:
                                4D:C5:A8:53:3A:34:CE:F6:AB:46:AE:F1:70:BD:B8:27:
                                2D:C2:03:28:F6:2C
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : 68:F6:98:F8:1F:64:82:BE:3A:8C:EE:B9:28:1D:4C:FC:
                                71:51:5D:67:93:D4:44:D1:0A:67:AC:BB:4F:4F:FB:C4
                    Timestamp : Dec 16 15:50:03.453 2015 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:45:02:21:00:FB:7B:CE:FA:1D:74:6B:EB:76:20:77:
                                16:E3:C0:58:72:B3:21:35:9A:C0:43:2D:A8:90:77:E1:
                                B7:9A:DA:5F:6D:02:20:04:AA:8B:42:D2:AC:CA:D1:87:
                                DF:70:54:C7:1E:22:20:53:36:DF:93:5B:B8:1F:5B:FC:
                                80:05:D1:9A:5A:AB:B0
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : 56:14:06:9A:2F:D7:C2:EC:D3:F5:E1:BD:44:B2:3E:C7:
                                46:76:B9:BC:99:11:5C:C0:EF:94:98:55:D6:89:D0:DD
                    Timestamp : Dec 16 15:50:03.663 2015 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:45:02:21:00:FE:2C:B6:D4:EF:95:FF:FC:CD:78:71:
                                81:88:AD:3A:B3:A3:12:0C:82:B2:D8:B5:4C:E6:F1:66:
                                FE:D4:7E:34:A5:02:20:2D:2B:D5:D5:13:84:9C:99:D9:
                                16:65:15:08:DC:59:65:C5:C0:2C:6A:95:E7:E9:83:9F:
                                AF:26:8B:39:10:26:28
    Signature Algorithm: sha256WithRSAEncryption
         aa:91:ae:52:01:8c:60:f6:02:b6:94:eb:af:6e:eb:dd:3c:c8:
         e1:6f:17:ab:b8:28:80:ec:dc:54:82:56:24:c1:16:08:e1:c2:
         c8:3e:3c:0f:53:18:40:7f:df:41:36:93:95:5f:b1:d9:35:43:
         5e:94:60:f9:d6:a7:83:6a:7d:c7:b4:f6:0b:90:76:f8:b4:0a:
         c1:31:0d:16:18:b5:cb:71:5c:f9:93:02:21:aa:bb:40:fd:ee:
         0a:1b:a9:f2:c3:0e:25:13:63:67:a2:42:eb:79:ea:5f:8f:fb:
         d8:bb:76:8c:5f:61:ca:2c:be:01:44:09:af:36:1e:a9:f7:40:
         1c:a4:b3:65:78:42:68:04:f0:4b:0c:7f:1f:d9:13:f6:0a:3b:
         35:79:73:69:c7:3c:70:e5:5d:06:98:ea:88:d5:dd:6b:e6:66:
         62:57:cf:af:d0:fb:67:9b:e0:c8:20:3a:b9:b6:4f:39:7a:5f:
         c4:fd:a0:46:8c:bc:c7:44:a7:b3:ab:52:49:db:86:97:ed:2e:
         bc:80:56:95:9f:d2:63:84:57:e7:92:15:32:e4:75:c5:81:52:
         cb:3b:26:e1:5d:4b:fd:e0:39:5e:81:06:af:cc:7e:77:d1:9d:
         9a:06:6f:ef:f7:fc:e2:86:5a:16:5a:c2:04:de:80:e3:78:1f:
         0f:fc:7f:df
_

このサーバーの証明書に署名したCAがわかりません。それは私たちの内部CAだと思いましたが、テストはそうではないことを示唆しています。したがって、opensslの-CAfileまたは-CApathフラグを使用してCAを指定することはできません。

ここで何を得ているのかわかりません。私は疑わしいあなたの内部CAがFacebookの証明書に署名しました。また、PKIXでは1つの発行者のみが許可されるため、証明書に2つ以上のCAの署名を含めることはできません。 。これは、1つの発行者、1つの権限キー識別子などのプロビジョニングしかないためです。許可されていませんが、このユースケースでは多くの意味; PKIXメーリングリストの 複数の署名者がいる証明書? も参照してください。

If_openssl s_client_をVerify return code: 0 (ok)次に、DigiCertのCAでCAfileを使用します。 "DigiCert High Assurance EV Root CA" という名前が必要であり、それをPEMに変換する必要があります。

DigiCert High Assurance EVルートCAを取得

_$ wget https://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt
--2016-10-13 16:34:12--  https://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt
Resolving www.digicert.com (www.digicert.com)... 64.78.193.234
Connecting to www.digicert.com (www.digicert.com)|64.78.193.234|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 969 [application/x-x509-ca-cert]
Saving to: ‘DigiCertHighAssuranceEVRootCA.crt’

DigiCertHighAssuran 100%[===================>]     969  --.-KB/s    in 0s      

2016-10-13 16:34:13 (11.6 MB/s) - ‘DigiCertHighAssuranceEVRootCA.crt’ saved [969/969]
$
_

証明書をPEMに変換

_$ openssl x509 -in DigiCertHighAssuranceEVRootCA.crt -inform DER \
  -out DigiCertHighAssuranceEVRootCA.pem -outform PEM
$
_

接続して確認

_$ openssl s_client -connect facebook.com:443 -servername facebook.com \
  -tls1 -CAfile DigiCertHighAssuranceEVRootCA.pem 
CONNECTED(00000005)
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA
verify return:1
depth=0 C = US, ST = CA, L = Menlo Park, O = "Facebook, Inc.", CN = *.facebook.com
verify return:1
Server did acknowledge servername extension.
---
Certificate chain
 0 s:/C=US/ST=CA/L=Menlo Park/O=Facebook, Inc./CN=*.facebook.com
   i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
 1 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
   i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV Root CA
---
...

    Start Time: 1476391066
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
_

しかし、私が得るのは:

_1737:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:
_

推測ですが... SNI(_-servername_オプション)とTLS 1.0以降(_-tls1_オプションはTLS 1.0用)を使用してみてください。

1
jww