我在我的智慧结束,我希望你能帮助我。我正在尝试使用自签名证书,使用WIF从Web应用程序到Web服务进行主动WS-Trust身份验证。
我已经尝试过以下内容:
1)在受信任的根证书颁发机构,个人和受信任的人员下的计算机证书存储中安装证书
2)确保“Everyone”拥有对Crypto / RSA / MachineKeys文件夹的完全访问权限
3)将ServicePointManager.ServerCertificateValidationCallback
的证书验证覆盖到只返回true
的方法。我可以调试这个方法并观察它返回true。
我 STILL 在System.ServiceModel跟踪中看到了这个:
[0832] SecureChannel#66940002 - 证书名称不匹配。
[0832] SecureChannel#66940002 - 用户验证远程证书无效。
应用程序爆炸了: 底层连接已关闭:无法为SSL / TLS安全通道建立信任关系。
答案 0 :(得分:0)
这是因为ServerCertificateValidationCallback仅执行证书验证的SSL相关部分。
因此,如果它仍然被破坏,这意味着不仅 SSL在这里发挥作用。
事实上,WS-Trust构建于WS-Security之上,WS-Security会对您的消息标题进行签名。并且 ServerCertificateValidationCallback 不会影响该签名的验证。
您肯定有第二个证书签署了邮件的WS安全标头。
有一段不同的代码可以验证证书的名称是否与端点设置的标识节点中的值匹配,如下所示:
<endpoint address="..."
<identity>
<dns value="PUT CN OF THE MESSAGE SIGNATURE CERTIFICATE HERE" />
</identity>
</endpoint>
如果此外消息签名证书未验证,您可以通过修改“behavior / endpointBehaviors / behavior / clientCredentials / serviceCertificate / authentication”来禁用它的验证。 您将certificateValidationMode属性设置为“None”。
或者您将其设置为Custom,然后将实现您自己的验证器,该验证器派生自System.IdentityModel.Selectors.X509CertificateValidator并覆盖Validate回调。