APNS_CERTIFICATE - Push-уведомление не отправляется в производство

У меня была эта проблема в течение приблизительно 2 недель, когда я внезапно прекратил отправлять уведомления в производство. Я использую библиотеку django-push-notifications и администратором django я могу отправить тестовое сообщение, но оно не отправляет сообщения через систему.

На моем локальном компьютере все работает без нареканий. Я обнаружил команду для проверки сертификата:

openssl s_client -connect gateway.push.apple.com:2195 -cert apns-cert.pem

С этим у меня было возвращение: Тайм-аут: 7200 (сек) Проверьте код возврата: 20 (невозможно получить сертификат локального эмитента) Расширенный главный секрет: да

Итак, проведя много исследований, я обнаружил, что мне нужно указать путь "CA":

openssl s_client -CApath /etc/ssl/certs/ -connect gateway.push.apple.com:2195 -cert apns-cert.pem

Кто отвез меня: Проверить код возврата: 0 (хорошо)

Однако для использования в библиотеке мне нужно было указать полный путь к файлу.pem. Затем я нашел эту команду:

ls /etc/ssl/certs/Entrust*

Я проверил все файлы.pem, которые были там, пока я не достиг того, что, казалось, работало отлично:

openssl s_client -CAfile /etc/ssl/certs/Entrust.net_Premium_2048_Secure_Server_CA.pem -connect gateway.push.apple.com:2195 -cert apns-cert.pem

Вскоре я отформатировал мои PUSH_NOTIFICATIONS_SETTINGS:

PUSH_NOTIFICATIONS_SETTINGS = {
     "GCM_API_KEY": "xxxx",
    "APNS_CERTIFICATE": os.path.join(BASE_DIR, "apns-cert.pem"),
    "APNS_CA_CERTIFICATES": "/etc/ssl/certs/Entrust.net_Premium_2048_Secure_Server_CA.pem",
    "APNS_ERROR_TIMEOUT": 3,
}


IOS_VERIFY_RECEIPT_API = 'https://buy.itunes.apple.com/verifyReceipt'
ANDROID_VERIFY_RECEIPT_API = 'https://www.googleapis.com/androidpublisher/v2/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}' 

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

PS: Помня об этом, отправив тестовый текст через django admin: ОК. Отправка через песочницу (отладка): ОК.

1 ответ

Решение

На самом деле это была не проблема SSL, а ошибка массовой загрузки библиотеки.

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

 def send_push(self):
    errors = []

    # IOS
    queryset_ios = APNSDevice.objects.filter(user=self.authentication)
    for device in queryset_ios:
        try:
            device.send_message(self.subject, badge=1, sound=self.kind.sound)
        except APNSServerError as e:
            errors.append(APNS_ERROR_MESSAGES[e.status])
        except Exception:
            pass

    # ANDROID
    queryset_android = GCMDevice.objects.filter(user=self.authentication)
    extra = {'notification': self.pk, 'kind': self.kind.kind, 'sound': self.kind.sound}

    for device in queryset_android:
        try:
            queryset_android.send_message(self.subject, badge=1, extra=extra)
        except GCMError as e:
            errors.append(str(e))
        except Exception:
            pass

    if errors:
        send_mail("Push Error",
                  "Push: %s \n User: %s \n\n Errors: %s" % (self.subject, self.authentication.full_name, errors),
                  settings.DEFAULT_FROM_EMAIL, ["my@mail.com"])
Другие вопросы по тегам