Не удалось отправить push-уведомление Apple: не удалось аутентифицировать поток SSL в качестве клиента

Я пытаюсь отправить push-уведомление на устройства Apple с помощью библиотеки Pushsharp в проекте ASP.NET MVC, размещенном на IIS.

Мой код:

 public static void SendAppleNotification()
        {
            // Configuration (NOTE: .pfx can also be used here)
            byte[] arr = File.ReadAllBytes("D:\\MySoftware\\pa_Dev.pem");

            var config = new ApnsConfiguration(ApnsConfiguration.ApnsServerEnvironment.Sandbox,
     arr, "1234");

            // Create a new broker
            var apnsBroker = new ApnsServiceBroker(config);

            // Wire up events
            apnsBroker.OnNotificationFailed += (notification, aggregateEx) => {

                aggregateEx.Handle(ex => {

                    // See what kind of exception it was to further diagnose
                    if (ex is ApnsNotificationException)
                    {
                        var notificationException = (ApnsNotificationException)ex;

                        // Deal with the failed notification
                        var apnsNotification = notificationException.Notification;
                        var statusCode = notificationException.ErrorStatusCode;

                        Console.WriteLine($"Apple Notification Failed: ID={apnsNotification.Identifier}, Code={statusCode}");

                    }
                    else
                    {
                        // Inner exception might hold more useful information like an ApnsConnectionException           
                        Console.WriteLine($"Apple Notification Failed for some unknown reason : {ex.InnerException}");
                    }

                    // Mark it as handled
                    return true;
                });
            };

            apnsBroker.OnNotificationSucceeded += (notification) => {
                Console.WriteLine("Apple Notification Sent!");
            };

            // Start the broker
            apnsBroker.Start();


                // Queue a notification to send
                apnsBroker.QueueNotification(new ApnsNotification
                {
                    DeviceToken = "660E4433785EFF2B2AA29D5076B039C969F1AADD839D79261328F40B08D26497",
                    Payload = JObject.Parse("{\"aps\":{\"badge\":7}}")
                });


            // Stop the broker, wait for it to finish   
            // This isn't done after every message, but after you're
            // done with the broker
            apnsBroker.Stop();


        }

Примечания: 1. Попытался изменить расширение pem на p12, но проблема все еще возникала. 2- Я пытался отправить push-уведомление с помощью https://pushtry.com/ и он работает нормально, поэтому выдача не из файла сертификата или пароля.

Проблема внутри pushsharp или отсутствуют конфигурации должны быть сделаны на моей машине, кто-нибудь есть идеи?

2 ответа

Решение

Проблема устранена путем генерации файла p12 из pem с помощью приведенной ниже команды, а не путем переименования расширения файла.

openssl pkcs12 -export -inkey sofwareKey.pem -in software_Prod.pem -out cert_key.p12

узнать больше

https://www.paypal.com/us/selfhelp/article/how-do-i-convert-my-pem-format-certificate-to-pkcs12-as-required-by-the-java-and-.net-sdks-ts1020

Это случилось со мной 23 июля 2019 года. Похоже, Apple теперь применяет TLS 1.2 для сервера push-уведомлений VoIP в песочнице на

gateway.sandbox.push.apple.com - port 2195
feedback.sandbox.push.apple.com - port 2196

Я обнаружил, что мне нужно проверить последний код из https://github.com/Redth/PushSharp (главная ветка), собрать его, а затем вручную добавить ссылку на встроенные библиотеки DLL в моем проекте.

Раньше я использовал пакет NuGet PushSharp, которому уже 3 года и который не обновлялся. Если вы посмотрите на последние коммиты в основной ветке, там есть некоторые изменения, связанные с Apple и TLS, поэтому я уверен, что это исправило.

Я думаю, что проблема связана с Push Sharp, поэтому, пожалуйста, попробуйте это решение, изменив SSl3 на Tls в классе под названием ApplePushChannel.cs, и вот изменение

  The orginal code in the file is 
  stream.AuthenticateAsClient(this.appleSettings.Host, this.certificates, System.Security.Authentication.SslProtocols.Ssl3, false);

 replace it with 

 stream.AuthenticateAsClient(this.appleSettings.Host, this.certificates, System.Security.Authentication.SslProtocols.Tls, false);                   

Надеюсь, это поможет тебе

Другие вопросы по тегам