调用Https WebService是报“基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系”的解决过程

本文介绍了解决C#访问特定Webservice时遇到的证书信任问题,通过修改代码允许信任任何证书,适用于测试环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在通过C#访问Webservice时遇到一个问题,首先通过对方提供的wsdl生成了调用代理类,在测试能否正常访问时,访问正式环境https://api.xxx.xx,一切正常,当访问测试环境是https://apitest.xxx.xxx,总是报“基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系”  InnerException信息为:根据验证过程,远程证书无效。

 

在网上找到解决方法:

http://social.microsoft.com/Forums/zh-CN/wcfzhchs/thread/1591a00d-d431-4ad8-bbd5-34950c39d563

 

依照上面的描述操作,问题解决,以作纪念

 

分以下三步:

1. 添加引用

    using System.Net;
    using System.Net.Security;
    using System.Security.Authentication;
    using System.Security.Cryptography.X509Certificates;

 

2. 在生成的代理类中添加RemoteCertificateValidate函数

    private static bool RemoteCertificateValidate(object sender, X509Certificate cert,

                                                                          X509Chain chain, SslPolicyErrors error){
            // trust any certificate!!!
            System.Console.WriteLine("Warning, trust any certificate");
            //为了通过证书验证,总是返回true
            return true;
    }

 

3. 在生产的代理类的构造函数中添加

    ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate;//验证服务器证书回调自动验证

<think>我们正在解决两个问题:1.Import-Certificate的COMException0x80092009(CRYPT_E_NOT_FOUND)2.WSDL元数据交换期间的SSL/TLS安全通道失败根据用户的问题描述,他似乎是在尝试导入证书时遇到了0x80092009错误,同时在进行Web服务调用(WSDL元数据交换)时遇到了SSL/TLS通道建立失败的问题。这两个问题可能有内在联系(比如证书未正确导入导致TLS失败)。我们先解决第一个问题:Import-Certificate0x80092009根据之前的回答,我们已经提供了多种解决方案。这里需要结合用户的实际环境(可能是在配置Web服务的服务器端证书)来进一步处理。然后解决第二个问题:WSDL元数据交换失败。这通常是因为客户端无法验证服务器的证书(比如自签名证书未被信任,或者证书链不完整,或者TLS版本不匹配等)。以下是综合解决方案:第一部分:解决证书导入问题(0x80092009)我们已经知道0x80092009表示系统找不到指定的证书或存储位置。我们可以从以下几个方面入手:1.1确认证书文件路径正确且文件有效。1.2尝试使用不同的方法导入证书(使用Certutil,使用.NET类库等)。1.3确保有足够的权限(使用管理员权限运行PowerShell)。第二部分:解决WSDL元数据交换的SSL/TLS失败这通常发生在客户端(例如C#程序)尝试与使用HTTPS的Web服务通信时,但证书验证失败。可能的原因:2.1服务器证书不受信任(比如自签名证书未安装到受信任的根证书颁发机构)。2.2TLS版本不匹配(服务器可能要求特定的TLS版本,而客户端默认使用的不匹配)。2.3证书链不完整。具体步骤:步骤1:检查证书文件并导入到正确的存储位置我们假设证书文件是server.cer(可能是自签名证书或CA签发的证书),需要将其导入到本地计算机的“受信任的根证书颁发机构”存储(LocalMachine\Root)中。使用管理员权限运行PowerShell,尝试以下方法之一:方法A:使用Import-Certificate命令(如果可用)```powershell#使用绝对路径$certPath="C:\path\to\server.cer"Import-Certificate-FilePath$certPath-CertStoreLocationCert:\LocalMachine\Root```方法B:如果Import-Certificate命令失败,使用.NET类库```powershell$certPath="C:\path\to\server.cer"$cert=New-ObjectSystem.Security.Cryptography.X509Certificates.X509Certificate2$cert.Import($certPath)$store=New-ObjectSystem.Security.Cryptography.X509Certificates.X509Store([System.Security.Cryptography.X509Certificates.StoreName]::Root,[System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachine)$store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)$store.Add($cert)$store.Close()```方法C:使用certutil```powershellcertutil-f-addstore"Root""C:\path\to\server.cer"```步骤2:验证证书已正确导入```powershellGet-ChildItemCert:\LocalMachine\Root|Where-Object{$_.Subject-like"*your_cert_subject*"}|Format-List*```步骤3:解决WSDL元数据交换错误在客户端代码中,可能需要额外的配置来信任服务器证书(特别是自签名证书)或处理TLS协议版本。3.1如果是在.NET应用程序中调用WSDL服务,可以在调用服务前加入以下代码来接受所有证书(仅测试环境使用):```csharpSystem.Net.ServicePointManager.ServerCertificateValidationCallback+=(sender,cert,chain,sslPolicyErrors)=>true;```3.2更安全的做法是将服务器证书(或根证书)安装到客户端的受信任根证书中(如步骤1),这样就不需要绕过验证。3.3确保使用支持TLS1.2(如果服务器要求):```csharpSystem.Net.ServicePointManager.SecurityProtocol=SecurityProtocolType.Tls12;//或者支持多个协议//System.Net.ServicePointManager.SecurityProtocol|=SecurityProtocolType.Tls12;```3.4如果证书链不完整,可能需要安装中间证书。步骤4:检查事件日志如果在导入证书或进行服务调用时仍然遇到问题,检查系统事件日志(特别是应用程序日志)以获取更详细的错误信息。总结:这两个问题可能是相关的,证书导入成功是解决WSDL元数据交换失败的前提(特别是当服务器使用自签名证书或私有CA时)。确保在服务器和客户端(如果证书验证需要)都正确安装了证书,并且TLS设置正确。如果问题仍然存在,请提供以下信息:-证书的类型(自签名,私有CA,公共CA?)-服务器使用的TLS版本-客户端环境(.NETFramework版本等)§§相关问题§§1.如何在WindowsServer上配置TLS设置?2.如何使用C#代码处理HTTPS请求的证书验证?3.如何为WCF服务配置HTTPS和证书?4.如何检查证书链的完整性?5.如何解决.NETWeb服务调用中的“基础连接关闭”错误?</think> ### 解决证书导入(0x80092009)与WSDL元数据交换SSL/TLS错误 #### 一、证书导入问题解决方案:0x80092009 (CRYPT_E_NOT_FOUND) 1. **验证证书状态** ```powershell # 检查证书文件状态 $certPath = "C:\path\to\server.cer" Get-Item -Path $certPath | Select-Object Name, Length, LastWriteTime ``` 若文件大小为0KB需重新获取证书。 2. **强制导入证书(管理员权限运行)** ```powershell Start-Process powershell -Verb RunAs -ArgumentList @" Import-Certificate -FilePath "$certPath" ` -CertStoreLocation Cert:\LocalMachine\Root -Force "@ ``` 3. **手动安装证书** ```powershell certutil -addstore -f Root $certPath ``` 4. **证书格式转换** ```powershell # PEM转DER格式 certutil -encode "$certPath" "$certPath.der" certutil -f -addstore Root "$certPath.der" ``` 5. **诊断证书存储** ```powershell Get-ChildItem Cert:\LocalMachine\Root | Measure-Object | Select-Object Count ``` #### 二、WSDL元数据交换SSL/TLS故障解决 1. **启用TLS协议(必备先决条件)** ```powershell # 启用所有TLS版本 [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls11 -bor [System.Net.SecurityProtocolType]::Tls12 -bor [System.Net.SecurityProtocolType]::Tls13 ``` 2. **绕过证书验证(仅测试环境)** ```csharp // C#客户端代码 System.Net.ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, errors) => true; ``` 3. **完整证书链验证** ```csharp X509Certificate2 cert = new X509Certificate2("client.pfx", "password"); var handler = new HttpClientHandler { ClientCertificateOptions = ClientCertificateOption.Manual, SslProtocols = SslProtocols.Tls12 }; handler.ClientCertificates.Add(cert); ``` 4. **检查WSDL绑定配置** ```xml <!-- 确保使用wsHttpBinding和安全传输 --> <bindings> <wsHttpBinding> <binding name="SecureBinding"> <security mode="Transport"> <transport clientCredentialType="Certificate"/> </security> </binding> </wsHttpBinding> </bindings> ``` #### 三、联合问题诊断流程 1. **交叉验证工具** ```powershell # 使用openssl验证证书和端点 openssl s_client -connect webservice.domain.com:443 -showcerts ``` 2. **网络层诊断** ```powershell Test-NetConnection webservice.domain.com -Port 443 ``` 3. **协议兼容性矩阵** $$ \begin{array}{|c|c|c|} \hline \text{证书类型} & \text{TLS 1.2支持} & \text{WSDL兼容性} \\ \hline \text{SHA256/RSA2048} & \checkmark & \checkmark \\ \text{SHA1/RSA1024} & \times & \text{有限支持} \\ \text{自签名证书} & \checkmark & \text{需手动信任} \\ \hline \end{array} $$ **根本解决方案**:确保证书同时满足: - 有效时间范围 - 包含完整证书链 - 已安装到计算机存储 - 绑定到正确的服务端口[^2] #### 📌关键检查点 1. 使用`certutil -verify`验证证书链完整性 2. 通过IE访问WSDL测试浏览器兼容性 3. 捕获网络流量分析TLS握手: ```powershell netsh trace start capture=yes tracefile=c:\temp\ssl.etl # 复现问题后停止 netsh trace stop ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值