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

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

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

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

Брошено по линии 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 Output:

...
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, экспортировал его с закрытым ключом в новый .p12 файл, и попробовал еще раз с новым сертификатом. (У меня была такая же проблема с push-уведомлениями разработки, и это решило мою проблему)
  • Изменен протокол SSL с Ssl3 в Tls, (Несколько дней назад была проблема с версией протокола, и она временно исправила проблему. В этом не должно быть необходимости, но ошибка, которую я получаю, такая же, как и та, которую я получал до того, как это исправили)
  • Проверено, что я на самом деле пытаюсь подключиться к производственному серверу с производственным сертификатом вместо сервера разработки / сертификата.
  • Проверено, что я могу получить доступ к серверу APNS напрямую (мое приложение ASP.NET живет в виртуальной машине Parallels 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?

6 ответов

Решение

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

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

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

сертификат на портале Azure

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

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

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);

Рекомендации

Я проверял это снова и снова.

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

Ни один из ответов не сработал для меня. В конечном итоге я импортировал сертификат и закрытый ключ в хранилище сертификатов Windows, а затем экспортировал как .pfx,

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

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

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

Смотрите более подробную информацию: http://blog.falafel.com/apple-push-notifications-certificates-and-iis/

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