Исключение для 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