Исключение для SslStream.AuthenticateAsClient (сообщение было плохо отформатировано)

У меня странная проблема. Я пытаюсь подключиться к серверу Apple через TCP/SSL. Я использую сертификат клиента, предоставленный Apple, для push-уведомлений. Я установил сертификат на своем сервере (Win2k3) как в папке "Локальные доверенные корневые сертификаты", так и в папке "Личные личные сертификаты".

Теперь у меня есть библиотека классов, которая имеет дело с этим соединением, когда я вызываю эту библиотеку классов из консольного приложения, запущенного с сервера, она работает абсолютно нормально, но когда я вызываю эту библиотеку классов со страницы asp.net или веб-службы asmx, я получаю следующее исключение.

Сбой вызова SSPI, см. Внутреннее исключение. Полученное сообщение было неожиданным или плохо отформатированным.

Это мой код:

X509Certificate cert = new X509Certificate(certificateLocation, certificatePassword);                       
X509CertificateCollection certCollection = new X509CertificateCollection(new X509Certificate[1] { cert });
// OPEN the new SSL Stream
SslStream ssl = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);                       
ssl.AuthenticateAsClient(ipAddress, certCollection, SslProtocols.Default, false);

ssl.AuthenticateAsClient это где ошибка генерируется.

Это сводит меня с ума. Если консольное приложение может нормально подключаться, должна быть какая-то проблема с безопасностью сетевого уровня asp.net, которая не проходит аутентификацию... не уверен, возможно, нужно добавить что-то или какую-то политику безопасности в web.config. Также хочу отметить, что на локальной машине для разработки я могу нормально подключаться как к консоли, так и к веб-сайту.

У кого-нибудь есть идеи?

4 ответа

Вы установили сертификат в вашей системе? Если вы используете Windows, он должен находиться в локальном компьютере / личных или доверенных папках в Консоли управления (Выполнить -> mmc).

ASP.NET работает под другой учетной записью, поэтому вы должны использовать WinHttpCertCfg.exe инструмент, позволяющий следующей учетной записи получить доступ к сертификату, который необходимо установить в папки "Локальный компьютер Личные / Доверенные"

  • ASPNET
  • Сетевой сервис
  • Аутентифицированные пользователи

например

winhttpcertcfg -g -c LOCAL_MACHINE\MY -s "CertificateName" -a "ASPNET"

где имя сертификата - это дружественное имя вашего сертификата. Вы можете получить инструмент и информацию здесь.

У меня была такая же проблема - добавление пользователя ASP.NET DefaultAppPool/Network Service мне не помогло.

Наконец, я понял, что веб-сервис ASP.NET не может получить доступ к сертификату, когда он находится в папке "Доверенные корневые сертификаты" (хотя консольное приложение может). Я перетащил его обратно в папку "Персональные сертификаты" и теперь могу вызывать метод как из консоли, так и из веб-приложений.

Измените X509Certificate на X509Certificate2, а также X509CertificateCollection на X509Certificate2Collection

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