如何让C#客户端信任SoapUI HTTPS Mock服务的自签名证书?
嘿,我来帮你搞定这个HTTPS信任的问题!你现在用的全局禁用证书校验虽然能临时跑通,但确实不安全,下面几个方案能让你的C#程序像浏览器信任站点那样,安全地信任SoapUI的自签名证书:
方案一:把证书导入Windows系统信任存储(通用型,适合所有.NET应用)
这和你在浏览器里添加HTTPS站点例外的逻辑一致,导入后整个系统的应用都会信任这个证书:
- 从SoapUI密钥库导出证书
打开命令行,用Java的keytool工具导出证书文件:
执行时输入你创建密钥库时设置的密码,完成后会生成一个keytool -export -alias soapui -keystore mock.keystore -file soapui-mock.cersoapui-mock.cer文件。 - 导入到Windows受信任根证书存储
- 双击
soapui-mock.cer文件,点击「安装证书」 - 选择「本地计算机」(要让所有用户都信任选这个,仅当前用户就选「当前用户」)
- 选择「将所有证书放入下列存储」,点击「浏览」,选中「受信任的根证书颁发机构」
- 一路确认完成导入,之后你的C#程序再连SoapUI的HTTPS服务就不会报信任错误了。
- 双击
方案二:代码中仅信任指定证书(更安全,不影响全局)
如果不想修改系统证书存储,可以在代码里只信任SoapUI的这个证书,避免全局禁用校验的风险:
- 把刚才导出的
soapui-mock.cer添加到你的C#项目中,右键文件设置「复制到输出目录」为「如果较新则复制」。 - 在调用Web服务前添加以下代码:
// 加载我们信任的SoapUI证书 X509Certificate2 trustedSoapUiCert = new X509Certificate2("soapui-mock.cer"); // 自定义证书校验逻辑:只信任指定的证书,其他证书正常校验 ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, sslErrors) => { // 通过证书哈希值判断是否是我们信任的那个 if (cert.GetCertHashString().Equals(trustedSoapUiCert.GetCertHashString(), StringComparison.OrdinalIgnoreCase)) { return true; } // 其他证书遵循默认校验规则 return sslErrors == SslPolicyErrors.None; }; // 正常调用Web服务 FooSoapClient webService = new FooSoapClient(); webService.Endpoint.Address = new EndpointAddress(cbWsUrl.Text); bool response = webService.PutDocumentCollection(docs);
方案三:通过WCF配置文件指定信任证书(无需改代码)
因为你用的是WCF生成的客户端FooSoapClient,也可以通过配置文件来配置证书信任:
- 先获取SoapUI证书的指纹(打开
soapui-mock.cer,转到「详细信息」标签,找到「指纹」字段,复制去掉空格后的字符串)。 - 在项目的
app.config或web.config中添加以下配置:<system.serviceModel> <behaviors> <endpointBehaviors> <behavior name="TrustSoapUiCertBehavior"> <clientCredentials> <serviceCertificate> <!-- 指定只信任特定证书 --> <authentication certificateValidationMode="PeerTrust" /> <defaultCertificate findValue="这里填证书指纹" storeLocation="CurrentUser" storeName="TrustedPeople" x509FindType="FindByThumbprint" /> </serviceCertificate> </clientCredentials> </behavior> </endpointBehaviors> </behaviors> <client> <!-- 给你的服务端点绑定上面的行为 --> <endpoint address="https://localhost:8083/你的服务路径" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_FooSoap" contract="FooService.FooSoap" name="FooSoap" behaviorConfiguration="TrustSoapUiCertBehavior" /> </client> </system.serviceModel>
注意:临时的全局禁用证书校验只适合本地测试,绝对不要用到生产环境!上面的方案都是更安全的替代方式。
内容的提问来源于stack exchange,提问作者paulsm4
相关产品推荐
相关产品推荐

