Подтвердить что ты не робот

Производство PushSharp APNS: учетные данные, предоставленные в пакет, не были признаны (хотя разработка работает нормально)

Мое приложение только что готово к продаже в App Store, но ни одно из моих производственных устройств (устройств, которые установили приложение из App Store) не получает push-уведомления. Когда я пытаюсь отправить push-уведомление на производственное устройство, я получаю эту ошибку:

"The credentials supplied to the package were not recognized" 
(System.ComponentModel.Win32Exception)

Это исключение внутренне бросается и попадает в бесконечный цикл:

enter image description here

Он вызывается в строке 539 файла ApplePushChannel.cs:

    try
{
    stream.AuthenticateAsClient(this.appleSettings.Host, this.certificates, 
        System.Security.Authentication.SslProtocols.Ssl3, false);
    //stream.AuthenticateAsClient(this.appleSettings.Host);
}
catch (System.Security.Authentication.AuthenticationException ex)
{
    throw new ConnectionFailureException("SSL Stream Failed to Authenticate as Client", ex);
}

Это результат работы приложения на выходе Visual Studio:

...
A first chance exception of type 'System.ComponentModel.Win32Exception' occurred in System.dll
A first chance exception of type 'System.ObjectDisposedException' occurred in System.dll
A first chance exception of type 'System.ComponentModel.Win32Exception' occurred in System.dll
A first chance exception of type 'System.ObjectDisposedException' occurred in System.dll
A first chance exception of type 'System.ComponentModel.Win32Exception' occurred in System.dll
A first chance exception of type 'System.ObjectDisposedException' occurred in System.dll
A first chance exception of type 'System.ComponentModel.Win32Exception' occurred in System.dll
A first chance exception of type 'System.ObjectDisposedException' occurred in System.dll
A first chance exception of type 'System.ComponentModel.Win32Exception' occurred in System.dll
...(it keeps getting thrown until I stop it manually)

Вот что я пробовал:

  • Двойной проверял, что идентификатор устройства, который я пытаюсь, зарегистрирован с маркером производственного устройства.
  • Отменил и обновил сертификат APNS Production, экспортировал его с закрытым ключом в новый файл .p12 и снова попытался с новым сертификатом. (У меня была такая же проблема с уведомлениями о продвижении по службе, и это решило мою проблему)
  • Изменен протокол SSL от Ssl3 до Tls. (несколько дней назад возникла проблема с версией протокола, и она временно устранила проблему. Для этого не должно быть необходимости, но ошибка, которую я получаю, такая же, как и та, которую я получал, перед которой это исправлено)
  • Проверено, что я на самом деле пытаюсь подключиться к производственному серверу с производственным сертификатом вместо сервера/сертификата разработки.
  • Проверено, что я могу напрямую получить доступ к серверу APNS (мое приложение ASP.NET живет внутри Parallels VM Windows 8.1 на моем Mac, вот вывод с моего Mac, чтобы избежать путаницы:

(вывод терминала) Изменить: я пинговал сервер песочницы, я пинговал производственный сервер, я подтверждаю, что могу подключиться к нему тоже, так что это не проблема.

can$ sudo nmap -p 2195 gateway.sandbox.push.apple.com
Starting Nmap 6.40-2 ( http://nmap.org ) at 2014-04-28 00:06 EEST
Nmap scan report for gateway.sandbox.push.apple.com (17.149.34.189)
Host is up (0.49s latency).
Other addresses for gateway.sandbox.push.apple.com (not scanned): 17.149.34.187 17.149.34.188
PORT     STATE SERVICE
2195/tcp open  unknown

Почему PushSharp не будет вести переговоры с серверами APNS?

4b9b3361

Ответ 1

Я понял проблему. Я снова отозвал и снова восстановил сертификат, и на этот раз я только экспортировал закрытый ключ (без сертификата). В доступе Keychain я экспортировал как .p12 и использовал новый файл, и он работал. По какой-то причине PushSharp не играл хорошо с .p12, когда в файле присутствуют как сертификат, так и закрытый ключ.

Ответ 2

"Учетные данные, предоставленные в пакет, не были распознаны". Исключение обычно указывает, что пользователь, выполняющий код, не имеет достаточных разрешений.

Если вы отправляете push-уведомления из веб-приложения Azure или webjob, не загружайте сертификат APNS из строки в файле или base64. Перейдите на Azure Portal и вместо этого добавьте сертификат на веб-сайт. Обратите внимание на отпечаток.

сертификат в Azure Portal

Затем добавьте параметр WEBSITE_LOAD_CERTIFICATES и установите его на * (звездочка).

Теперь сертификат APNS можно использовать из кода С#:

string thumbprint = "YOUR THUMBPRINT";
var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
var certificate = store.Certificates.Find(
    X509FindType.FindByThumbprint, thumbprint, validOnly: false)
    .Cast<X509Certificate2>().SingleOrDefault();
var apnsConfig = new ApnsConfiguration(
    ApnsConfiguration.ApnsServerEnvironment.Production, certificate);

Ссылки

Ответ 3

Я получал такое же исключение, и в моем случае мне пришлось добавить разрешение для моего сертификата IOS Push Services.

Щелкните правой кнопкой мыши по сертификату в mmc → All Tasks → Manage Private Keys... Я добавил NETWORK SERVICE, потому что пул приложений iis для моего веб-приложения использовал эту учетную запись.

Подробнее см. http://blog.falafel.com/apple-push-notifications-certificates-and-iis/

Ответ 4

Ни один из ответов не работал у меня. В конце концов, что я закончил делать, это импортировать Cert и Private Key в хранилище сертификатов Windows, а затем экспортировать как .pfx.

Ответ 5

Я тестировал его снова и снова.

Преобразуйте файл p12 в формат pem, и он будет работать с ограниченным пользователем IIS и, возможно, с Azure....

Ответ 6

При использовании хранилища сертификатов Windows (imho - самый простой способ управления сертификатами на рабочем сервере), обязательно установите правильные разрешения для закрытого ключа.