web-dev-qa-db-fra.com

"erreur de vérification: num = 20" lors de la connexion à gateway.sandbox.Push.Apple.com

J'essaie de lancer le didacticiel Ray Wenderlich disponible à l'emplacement Didacticiel Apple Push Notification Services sous iOS 6: partie 1/2 .

J'ai créé un certificat AppID et SSL ainsi que des clés et des fichiers PEM dans un répertoire local. Ensuite, je suis arrivé à l'étape pour vérifier si le certificat fonctionnait et j'ai appelé la commande suivante à partir de ce répertoire local:

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

Cela a produit beaucoup de résultats. Au milieu de la sortie était la suivante:

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

Est-ce une erreur ou est-ce un test d'erreur? Si c'est une erreur, quelle serait la cause ou que suggéreriez-vous pour la résoudre?


Voici la sortie complète (moins les données du certificat):

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)
---

Le didacticiel poursuit en indiquant que "si la connexion aboutit, vous devriez pouvoir saisir quelques caractères. Lorsque vous appuyez sur la touche Entrée, le serveur doit se déconnecter". J'ai pu le faire et le serveur s'est déconnecté.

Mais le didacticiel indique ensuite que vous devrez peut-être parcourir la sortie pour rechercher une erreur. D'où la raison de cette question.

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

Il vous manque un certificat racine, qui doit être spécifié avec -CAfile Ou avec -CApath.

Cependant, vous peut rencontrer une alerte de prise de contact après avoir résolu le problème du certificat racine. Je crois que c'est un problème de certificat client causé par le fait que je n'en ai pas (par conséquent, vous ne pouvez pas en faire l'expérience) 0x14094410 correspond à l'erreur OpenSSL et l'erreur SSL (du protocole TLS) est simplement SSL alert number 40. L'alerte 40 est l'alerte de prise de contact, et il n'y a pas d'informations supplémentaires.

Premier

Déterminez la racine dont vous avez besoin:

$ 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)

Il vous faut donc Autorité de certification Entrust.net (2048). Vous pouvez le télécharger à partir de certificats racine Entrust . Son nom entrust_2048_ca.cer Et il semble être au format PEM.

Seconde

Maintenant, exécutez à nouveau openssl s_client, Mais cette fois avec -CAfile entrust_2048_ca.cer. Notez que cela se termine avec un 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)

Troisième

C'est un peu l'ancienne façon de faire les choses, à l'époque où SSLv3 était encore populaire. C'est-à-dire que le attaque POODLE était inconnu:

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

Vous devriez probablement passer à TLS 1.0 ou supérieur et utiliser Indication du nom du serveur (SNI) . SNI est une fonctionnalité TLS non présente dans SSL. Vous devrez peut-être forcer TLS 1.2 en 2016; et vous pouvez le faire avec -tls1_2.

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

Vous trouverez ci-dessous des informations provenant d'autres commentaires et réponses. Je les rassemble pour plus de commodité. Vous devriez upvoter le commentaire ou répondre comme il convient.

Certificat client

Korbbit fournit des informations supplémentaires ci-dessous. Il s’agit de la déclaration que j’ai faite, "Échec de la prise de contact en alerte ... Je pense que c’est un problème de certificat client causé par le fait que je n’en ai pas". Vous devriez fournir des commentaires à Korbbit si cela vous aide:

si vous regardez à nouveau le didacticiel, vous êtes censé taper ...
-cert PushChatCert.pem -key PushChatKey.pem

Avec les commentaires de Korbbit, la réponse devient:

$ 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

ensemble de certificats ca et -CApath

De Timur Bakeyev, Entrust.net est une autorité de certification racine bien connue. Son certificat est donc inclus dans le groupe de certificats d'autorité de certification commun (ca-certificates Dans Debian). Il est généralement installé, entre autres, dans le répertoire /etc/ssl/certs Et peut également être référencé avec l'option -CApath /etc/ssl/certs/.

Vous pouvez utiliser -CApath À la place de -CAfile Comme suit.

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

Je viens de faire le même tutoriel et la réponse acceptée pourrait ne pas être ce que vous voulez. Si vous regardez à nouveau le tutoriel, vous êtes censé taper:

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

pas seulement:

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

si vous le tapez sur une seule ligne, cela fonctionnera:

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