SslStream.AuthenticateAsClient 引发异常(消息格式错误)

5
我有一个奇怪的问题。我正在尝试通过TCP/SSL连接到苹果服务器。我使用苹果提供的客户端证书进行推送通知。我已将证书安装在服务器(Win2k3)的本地受信任根证书和本地个人证书文件夹中。
现在我有一个处理此连接的类库,当我从运行于服务器的控制台应用程序中调用此类库时,它完全正常工作。但是,当我从asp.net页面或asmx Web服务中调用该类库时,我会收到以下异常。
“调用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中添加一些内容或某种安全策略。还要指出的是,我在本地开发机器上使用控制台和网站都可以正常连接。

有任何想法吗?


1
嗨,我现在也遇到了同样的问题。你是如何解决这个问题的?请帮忙。 - ramesh
4个回答

2

您是否已在系统上安装证书?如果您正在运行Windows操作系统,则应该在管理控制台(运行->mmc)的本地计算机/个人或受信任文件夹下找到它。


1
ASP.NET 运行在不同的账户下,因此您需要使用 WinHttpCertCfg.exe 工具来允许以下账户访问证书,您应该将其安装在本地计算机的个人/可信文件夹中。
  • ASPNET
  • 网络服务
  • 已验证用户

例如:

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

其中证书名称是您证书的友好名称。您可以从这里获取工具和信息。


0

我曾经遇到过同样的问题 - 添加ASP.NET DefaultAppPool/Network Service用户并没有帮助我。

最终我发现,当证书位于受信任的根证书文件夹中时(即使控制台应用程序可以),ASP.NET Web服务无法访问该证书。我将其拖回个人证书文件夹中,现在可以从控制台和Web应用程序中调用该方法了。


-2
将 X509Certificate 更改为 X509Certificate2,并将 X509CertificateCollection 更改为 X509Certificate2Collection。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接