Résolution des erreurs SSL avec APNs en Python

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 )

Étiquettes: APNs Python ssl certificats Notifications_push

Publié le 15 juillet à 04h10