gpt4 book ai didi

WCF、REST、SSL、客户端、自定义证书验证

转载 作者:太空宇宙 更新时间:2023-11-03 13:01:52 35 4
gpt4 key购买 nike

我有一个我无法解决的具体问题。让我详细解释一下。我是这项技术的新手,所以我可能使用了一些错误的术语。不明白的请指正解释或求解释。我正在创建一个自托管的 WCF REST 服务器,托管在 WPF 应用程序中。它使用 https、SLL 和 WebHttpSecurityMode.Transport。我正在使用自己生成的证书。我想创建一个使用此服务的 WinForms 客户端。服务器响应的格式是 JSON。我想使用从 X509CertificateValidator 继承的自定义验证器来验证客户端上的证书。

这是我的服务器端代码。我正在使用工作正常的自定义用户名验证器。我已经在我机器上的 IIS 管理器中为默认网站 > 绑定(bind)配置了证书,我在其中生成了证书 (Windows 7)。

WebServiceHost sh = new WebServiceHost(typeof(ReachService)); 
string uri = "https://localhost:9000/Service";
WebHttpBinding wb = new WebHttpBinding();
wb.Security.Mode = WebHttpSecurityMode.Transport;
wb.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
sh.AddServiceEndpoint(typeof(IReachService), wb, uri);
sh.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new CustomUserNameValidator();
sh.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom;

sh.Open();

这是我的客户端代码

Uri uri = new Uri("https://localhost:9000/Service");
WebChannelFactory<ReachService> cf = new WebChannelFactory<IReachService>(uri);
WebHttpBinding wb = cf.Endpoint.Binding as WebHttpBinding;
wb.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
wb.Security.Mode = WebHttpSecurityMode.Transport;
cf.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.Custom;
cf.Credentials.ServiceCertificate.Authentication.CustomCertificateValidator = new CustomCertificateValidator("PL2"); // this is the name that issued the certificate
cf.Credentials.UserName.UserName = "user1";
cf.Credentials.UserName.Password = "user1";
IReachService service = cf.CreateChannel();
try
{
CustomersList auth = service.GetCustomers();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}

调用 service.GetCustomers() 我得到:无法与权限建立 SSL/TLS 安全通道的信任关系'本地主机:9000'。内部异常消息:底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。内部异常消息:根据验证程序,远程证书无效。

当我在浏览器中测试时,服务器工作正常。但是客户端代码是错误的,因为它没有进入自定义证书验证器类。并且此类与 http://msdn.microsoft.com/en-us/library/system.identitymodel.selectors.x509certificatevalidator.aspx 上的 MSDN 示例中的类相同.

谁能告诉我这种方法哪里出了问题?

如果您需要更多信息,请询问。

谢谢

最佳答案

问题的发生似乎是因为证书是为其他主机名颁发的。您可以通过提供自定义 ServicePointManager.ServerCertificateValidationCallback 来检查这一点(并在必要时进行自定义)。

关于WCF、REST、SSL、客户端、自定义证书验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4759217/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com