Я подключаюсь к службе Apple Push Notification Service (APN) из.NET Framework с использованием SslStream
. Я подключаюсь с использованием Binary Provider API
. В рамках первоначального рукопожатия SslStream
выполняет AuthenticateAsClient
в сетевом потоке. Это код для этого:
_sslStream = new SslStream(_tcpClient.GetStream());
_sslStream.AuthenticateAsClient(_url,
new X509CertificateCollection { _certificate },
SslProtocols.Tls,
true);
Где _url
- имя хоста _certificate
и _certificate
сертификат push приложения. На большинстве машин (работает версия Windows Server) это принято, и связь может продолжаться. Однако на некоторых машинах это не удастся. Это точная ошибка:
The remote certificate is invalid according to the validation procedure.
Код работает как служба Windows в соответствии с привилегиями локальной системы. Когда тот же самый код работает как приложение командной строки под локальным пользователем, рукопожатие принимается, и связь может продолжаться. Запуск того же командного приложения в локальной системе с использованием pexec -i -s
вызывает ту же ошибку. Я проверил, есть ли различия в хранилищах сертификатов между локальным компьютером и текущим пользователем, но их нет.
Также был опробован "обходной путь". В этой измененной форме код, показанный ранее, был адаптирован для полного игнорирования сертификатов. Это делается точно так, как вы ожидали; полученные сертификаты не проверяются, и связь может продолжаться. Вот что это выглядит:
_sslStream = new SslStream(_tcpClient.GetStream(), false, (sender, certificate, chain, errors) => true);
_sslStream.AuthenticateAsClient(_url,
new X509CertificateCollection { _certificate },
SslProtocols.Tls,
false);
Конечно, отключить безопасность - это плохая идея. Что может привести к нарушению рукопожатия?!