Производство 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 и добавьте сертификат на веб-сайт. Обратите внимание на отпечаток.
Затем добавьте параметр 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/