Lors de l'utilisation du service APNs, cette implémentation Python génère une erreur de négociatino SSL :
import socket, ssl, json, struct, binascii
identifiant_appareil = 'XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX'
charge_utile = {
'aps': {
'alerte': 'Notification test',
'son': 'defaut',
'badge': 5
},
'donnees': {'valeur': 'exemple'}
}
certificat = 'certificat_apns.pem'
serveur = ('gateway.sandbox.push.apple.com', 2195)
donnees_json = json.dumps(charge_utile)
identifiant_nettoye = identifiant_appareil.replace(' ', '')
token_binaire = binascii.unhexlify(identifiant_nettoye)
format_notification = f'!BH32sH{len(donnees_json)}s'
notification = struct.pack(format_notification, 0, 32, token_binaire, len(donnees_json), donnees_json.encode())
connexion_ssl = ssl.wrap_socket(
socket.socket(socket.AF_INET, socket.SOCK_STREAM),
certfile=certificat
)
connexion_ssl.connect(serveur)
connexion_ssl.write(notification)
connexion_ssl.close()
L'exécution produit cette erreur :
Traceback (most recent call last):
File "apns_test.py", line 22, in <module>
connexion_ssl.connect(serveur)
File "/usr/lib/python2.6/ssl.py", line 309, in connect
self.do_handshake()
File "/usr/lib/python2.6/ssl.py", line 293, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [Errno 1] _ssl.c:480: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
Méthodes de résolution
- Vérifier le certificat : Contrôler la validité et la clé privée via OpenSSL : ```
openssl x509 -noout -text -in certificat_apns.pem
- Permissions du certificat : Appliquer des restrictions d'accès : ```
chmod 600 certificat_apns.pem
- Valider le jeton d'appareil : Examiner le format du token : ```
openssl x509 -noout -text -certopt no_pubkey -in TokenAppareil.pem
- Confirmer les paramètres réseau : Utiliser les bonnes adresses selon l'environnement : ```
serveur = ('gateway.push.apple.com', 2195) # Production
serveur = ('gateway.sandbox.push.apple.com', 2195) # Sandbox
- Contrôle du pare-feu : Autoriser les connexions sortantes vers les ports 2195/2196
- Mise à jour des bibliothèques : Actualiser les dépendances Python : ```
pip install --upgrade pyOpenSSL
- Configuration proxy : Ajouter un support proxy si nécessaire : ```
connexion_ssl = ssl.wrap_socket(
socket.create_connection(('proxy.domaine', 8080)),
certfile=certificat
)