web-dev-qa-db-ja.com

gateway.sandbox.Push.Apple.comへの接続時に「verify error:num = 20」

iOS 6チュートリアルのApple Push Notification Services:パート1/2 にあるレイウェンダリッヒチュートリアルを実行しようとしています。

ローカルディレクトリにAppIDおよびSSL証明書とキーおよびPEMファイルを作成しました。その後、証明書が機能するかどうかをテストするステップに進み、このローカルディレクトリから次のコマンドを呼び出しました。

$ openssl s_client -connect gateway.sandbox.Push.Apple.com:2195 
-cert PushChatCert.pem -key PushChatKey.pem

これにより多くの出力が生成されました。出力の中央には次のものがありました。

verify error:num=20:unable to get local issuer certificate
verify return:0

これはエラーですか、それともエラーのテストですか?エラーの場合、原因は何ですか、または解決するために何を提案しますか?


完全な出力を次に示します(証明書データを除く):

Enter pass phrase for PushChatKey.pem:    
CONNECTED(00000003)
depth=1 /C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=US/ST=California/L=Cupertino/O=Apple Inc./OU=iTMS Engineering/CN=gateway.sandbox.Push.Apple.com
   i:/C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
 1 s:/C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
   i:/O=Entrust.net/OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Certification Authority (2048)
---
Server certificate
-----BEGIN CERTIFICATE-----

<Long string of data removed>

-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Cupertino/O=Apple Inc./OU=iTMS Engineering/CN=gateway.sandbox.Push.Apple.com
issuer=/C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
---
No client certificate CA names sent
---
SSL handshake has read 2731 bytes and written 2215 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: <removed>
    Key-Arg   : None
    Start Time: 1398633302
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

チュートリアルでは、「接続が成功した場合、数文字を入力できるはずです。Enterキーを押すと、サーバーが切断されるはずです」と述べています。これを行うことができ、サーバーが切断されました。

しかし、チュートリアルでは、出力を調べてエラーを見つける必要があるかもしれないと述べています。したがって、この質問の理由。

62
JeffB6688
This produced a lot of output. In the middle of the output was the following:

verify error:num=20:unable to get local issuer certificate
verify return:0

ルート証明書がありません。-CAfileまたは-CApathで指定する必要があります。

ただし、ルート証明書の問題を修正すると、mayハンドシェイクアラートが発生する場合があります。私はそれを持っていないことによって引き起こされたクライアント証明書の問題だと思います(したがって、あなたはそれを経験しないかもしれません)。以下では、0x14094410はOpenSSLエラーであり、SSLエラー(TLSプロトコルから)は単にSSL alert number 40です。アラート40はハンドシェイクアラートであり、追加情報はありません。

最初の

必要なルートを決定します。

$ openssl s_client -connect gateway.sandbox.Push.Apple.com:2195
CONNECTED(00000003)
depth=1 C = US, O = "Entrust, Inc.", OU = www.entrust.net/rpa is incorporated by reference, OU = "(c) 2009 Entrust, Inc.", CN = Entrust Certification Authority - L1C
verify error:num=20:unable to get local issuer certificate
verify return:0
140067272132264:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1257:SSL alert number 40
140067272132264:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:177:
---
Certificate chain
 0 s:/C=US/ST=California/L=Cupertino/O=Apple Inc./OU=iTMS Engineering/CN=gateway.sandbox.Push.Apple.com
   i:/C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
 1 s:/C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
   i:/O=Entrust.net/OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Certification Authority (2048)

したがって、Entrust.net証明機関(2048)が必要です。 Entrust Root Certificates からダウンロードできます。その名前はentrust_2048_ca.cerで、PEM形式のようです。

Second

ここで、openssl s_clientを再度実行しますが、今回は-CAfile entrust_2048_ca.cerを使用します。 Verify return code: 0 (ok)で完了することに注意してください。

$ openssl s_client -connect gateway.sandbox.Push.Apple.com:2195 -CAfile entrust_2048_ca.cer 
CONNECTED(00000003)
depth=2 O = Entrust.net, OU = www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU = (c) 1999 Entrust.net Limited, CN = Entrust.net Certification Authority (2048)
verify return:1
depth=1 C = US, O = "Entrust, Inc.", OU = www.entrust.net/rpa is incorporated by reference, OU = "(c) 2009 Entrust, Inc.", CN = Entrust Certification Authority - L1C
verify return:1
depth=0 C = US, ST = California, L = Cupertino, O = Apple Inc., OU = iTMS Engineering, CN = gateway.sandbox.Push.Apple.com
verify return:1
140642906502824:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1257:SSL alert number 40
140642906502824:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:177:
---
Certificate chain
 0 s:/C=US/ST=California/L=Cupertino/O=Apple Inc./OU=iTMS Engineering/CN=gateway.sandbox.Push.Apple.com
   i:/C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
 1 s:/C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
   i:/O=Entrust.net/OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Certification Authority (2048)
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFGzCCBAOgAwIBAgIETBz90jANBgkqhkiG9w0BAQUFADCBsTELMAkGA1UEBhMC
VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
Lm5ldC9ycGEgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
KGMpIDIwMDkgRW50cnVzdCwgSW5jLjEuMCwGA1UEAxMlRW50cnVzdCBDZXJ0aWZp
Y2F0aW9uIEF1dGhvcml0eSAtIEwxQzAeFw0xMjA1MjUyMzM3NDZaFw0xNDA1MzEw
NTA4NDhaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTESMBAG
A1UEBxMJQ3VwZXJ0aW5vMRMwEQYDVQQKEwpBcHBsZSBJbmMuMRkwFwYDVQQLExBp
VE1TIEVuZ2luZWVyaW5nMScwJQYDVQQDEx5nYXRld2F5LnNhbmRib3gucHVzaC5h
cHBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC/r1z4BRFu
DIU9/vOboVmd7OwaPPLRtcZiZLWxSyG/6KeRPpaeaC6DScvSDRoJuIeTDBup0bg4
08K0Gzh+lfKRlJOC2sma5Wgvk7oP4sty83My3YCZQv4QvgDhx+seONNs6XiA8Cl4
ingDymWGlzb0sTdfBIE/nWiEOtXQZcg6GKePOWXKSYgWyi/08538UihKK4JZIOL2
eIeBwjEwlaXFFpMlStc36uS/8oy+KMjwvuu3HazNMidvbGK2Z68rBnqnOAaDBtuT
K7rwAa5+i8GYY+sJA0DywMViZxgG/xWWyr4DvhtpHfUjyQgg1ixM8q651LNgdRVf
4sB0PfANitq7AgMBAAGjggFZMIIBVTALBgNVHQ8EBAMCBaAwHQYDVR0lBBYwFAYI
KwYBBQUHAwEGCCsGAQUFBwMCMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwu
ZW50cnVzdC5uZXQvbGV2ZWwxYy5jcmwwZQYIKwYBBQUHAQEEWTBXMCMGCCsGAQUF
BzABhhdodHRwOi8vb2NzcC5lbnRydXN0Lm5ldDAwBggrBgEFBQcwAoYkaHR0cDov
L2FpYS5lbnRydXN0Lm5ldC9sMWMtY2hhaW4uY2VyMEAGA1UdIAQ5MDcwNQYJKoZI
hvZ9B0sCMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5uZXQvcnBh
MB8GA1UdIwQYMBaAFB7xq4kG+EkPATN37hR67hl8kyhNMB0GA1UdDgQWBBSgNiNR
qtTShi8PuJ7UNUEbeE71STAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBBQUAA4IBAQAS
EDkUyBHVdRJnCLHY8w9ec92NWqBYqKiSGP0uVCvgpsJIWDBkCGIw1Olks6mQuS9+
R7VRJJFg7EhtufmoRIvjgntKpTe49sB/lrmiZVQGnhjd6YdyYm9+OBUWRvwketLM
v0S+nxZD0qLLJ9foVUB8zP8LtutqFJ5IZw1xb9eSNzhpKkQ9ylj8MCd4tpXZxICL
Gt327poTXwmjQ+31fz7HCQCowMHccP8kiKM5SeYC9q+nkmdaozHVvw4e1RsP+EWO
vPtcH1x1BCkTJajmrO7JuRPLuBEnZGSPUVFRKWP9jy0a28VnJek+oA7rRMRD8irU
fMGbLqkGn8YogdPqe5T1
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Cupertino/O=Apple Inc./OU=iTMS Engineering/CN=gateway.sandbox.Push.Apple.com
issuer=/C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
---
No client certificate CA names sent
---
SSL handshake has read 2683 bytes and written 338 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: A2F375CC440179ADF831179C32A35AF4...
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1398721005
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)

Third

これは、SSLv3がまだ一般的に使用されていた昔のやり方です。つまり、 POODLE攻撃 は不明でした:

$ openssl s_client -connect gateway.sandbox.Push.Apple.com:2195 -CAfile entrust_2048_ca.cer 

おそらくTLS 1.0以上に切り替えて、 サーバー名表示(SNI) を使用する必要があります。 SNIは、SSLにはないTLS機能です。 2016年にTLS 1.2を強制する必要があるかもしれません。そして、あなたは-tls1_2でそうすることができます。

$ openssl s_client -connect gateway.sandbox.Push.Apple.com:2195 \
  -tls1 -servername gateway.sandbox.Push.Apple.com -CAfile entrust_2048_ca.cer

以下は他のコメントと回答からの情報です。便宜上それらを集めています。必要に応じて、コメントまたは回答に投票してください。

クライアント証明書

Korbbitは以下の追加情報を提供します。これは、私が作成したステートメント「アラートハンドシェイクの失敗...アドレスを持っていないことによるクライアント証明書の問題」に対処します。役立つ場合は、Korbbitにフィードバックを提供する必要があります。

チュートリアルをもう一度見ると、タイプするつもりです...
-cert PushChatCert.pem -key PushChatKey.pem

Korbbitのフィードバックにより、答えは次のようになります。

$ openssl s_client -connect gateway.sandbox.Push.Apple.com:2195 \
  -tls1 -servername gateway.sandbox.Push.Apple.com \
  -cert PushChatCert.pem -key PushChatKey.pem -CAfile entrust_2048_ca.cer

ca-certificates bundleおよび-CApath

Timur Bakeyevから、Entrust.netは有名なルート認証局であるため、その証明書は共通のCA証明書バンドル(Debianのca-certificates)に入っています。通常、/etc/ssl/certsディレクトリにインストールされますが、-CApath /etc/ssl/certs/オプションを使用して参照することもできます。

次のように、-CApathの代わりに-CAfileを使用できます。

$ openssl s_client -connect gateway.sandbox.Push.Apple.com:2195 -CApath /etc/ssl/certs/
91
jww

私は同じチュートリアルをやっただけで、受け入れられた答えはあなたが望むものではないかもしれません。チュートリアルをもう一度見ると、次のように入力することになります。

openssl s_client -connect gateway.sandbox.Push.Apple.com:2195 
    -cert PushChatCert.pem -key PushChatKey.pem

だけでなく:

openssl s_client -connect gateway.sandbox.Push.Apple.com:2195

1行で入力すると動作します:

openssl s_client -connect gateway.sandbox.Push.Apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem
4
Korbbit