«Проверьте ошибку: num = 20» при подключении к gateway.sandbox.push.apple.com

Я пытаюсь запустить учебник Ray Wenderlich, найденный в Apple Push Notification Services в iOS 6 Tutorial: Part 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-----  -----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:  Key-Arg : None Start Time: 1398633302 Timeout : 300 (sec) Verify return code: 0 (ok) --- 

В руководстве далее говорится, что «Если соединение будет успешным, вы должны будете ввести несколько символов. Когда вы нажимаете enter, сервер должен отключиться». Я смог сделать это, и сервер отключился.

Однако в учебнике говорится, что вам может понадобиться просмотреть результат, чтобы найти ошибку. Отсюда и причина этого вопроса.

 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 .

Однако после исправления проблемы с корневым сертификатом вы можете столкнуться с подтверждением рукопожатия. Я считаю, что проблема с сертификатом клиента вызвана тем, что у меня его нет (следовательно, вы можете не испытывать этого). Ниже 0x14094410 является ошибкой OpenSSL, а ошибка SSL (из протокола TLS) – это просто SSL alert number 40 . Alert 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 . Его имя entrust_2048_ca.cer и похоже, что оно находится в формате PEM.

второй

Теперь запустите openssl s_client раз, но на этот раз с -CAfile entrust_2048_ca.cer . Обратите внимание, что Verify return code: 0 (ok) завершен с 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) 

В третьих

Это своего рода старый способ делать вещи, когда SSLv3 все еще был популярен. То есть атака POODLE была неизвестна:

 $ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -CAfile entrust_2048_ca.cer 

Вероятно, вам следует переключиться на TLS 1.0 или выше и использовать Server Name Indicication (SNI) . SNI – это функция TLS, отсутствующая в SSL. Возможно, вам потребуется задействовать TLS 1.2 в 2016 году; и вы можете сделать это с помощью -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, если она вам полезна:

если вы снова посмотрите на учебник, вы должны набрать …
-cert PushChatCert.pem -key PushChatKey.pem

С обратной связью Корббита ответ становится:

 $ 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-сертификатов и -CApath

От Тимура Бакеева Entrust.net является известным корневым центром сертификации, поэтому он поставляется в комплекте общих сертификатов CA ( ca-certificates в Debian). Обычно он устанавливается, среди прочих, в каталог /etc/ssl/certs и, альтернативно, может быть передан с параметром -CApath /etc/ssl/certs/ .

Вы можете использовать -CApath вместо -CAfile как -CAfile ниже.

 $ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -CApath /etc/ssl/certs/ 

Я просто сделал то же учебное пособие, и принятый ответ может быть не таким, каким вы хотите. если вы снова посмотрите на учебник, вы должны ввести:

 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 

если вы наберете его как одну строку, он будет работать:

 openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem 
  • Как указать список шифров SSL / TLS, предлагаемый конкретным сайтом?
  • Firefox: это соединение не доверено + За корпоративным брандмауэром
  • Последствия безопасности отключения CURLOPT_SSL_VERIFYHOST (libcurl / openssl)
  • Как сохранить сертификат SSL удаленного сервера локально как файл
  • Правильное переключение между HTTP и HTTPS с использованием .htaccess
  • Как включить SSL 3 в Java
  • ограничение отладки java ssl debug
  • HTTPS GET (SSL) с Android и самозаверяющим сертификатом сервера
  • Как установить разрешение на чтение файла закрытого ключа сертификата X.509 из .NET.
  • Java SSL подключиться, добавить серверный сертификат в хранилище ключей программно
  • Динамические изображения, переданные через HTTPS, отображают сломанное изображение в слове при открытии HTTP-документа
  • Давайте будем гением компьютера.