如何获取HTTPS Web服务的服务器证书详细信息
获取HTTPS Web服务的服务器证书详细信息
要在C#的WCF客户端调用HTTPS Web服务时获取服务器证书的组织名称、序列号等信息,你可以通过自定义消息拦截器来实现,具体步骤如下:
- 实现
IClientMessageInspector接口,在请求前后拦截并提取HTTP响应中的服务器证书 - 实现
IEndpointBehavior接口,将自定义拦截器绑定到WCF客户端端点 - 在客户端代码中添加该行为,执行调用时即可获取证书信息
自定义拦截器与行为类代码
using System; using System.Linq; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Description; using System.ServiceModel.Dispatcher; using System.Net; // 消息检查器:负责拦截请求和响应,提取证书信息 public class CertificateInspector : IClientMessageInspector { public void AfterReceiveReply(ref Message reply, object correlationState) { var webResponse = correlationState as HttpWebResponse; if (webResponse?.ServiceCertificate != null) { // 提取组织名称(从Subject字段中解析O=开头的部分) var orgName = webResponse.ServiceCertificate.Subject .Split(',') .FirstOrDefault(s => s.Trim().StartsWith("O="))? .Split('=')[1] .Trim(); // 提取证书序列号 var serialNumber = webResponse.ServiceCertificate.SerialNumber; // 提取证书颁发者 var issuer = webResponse.ServiceCertificate.Issuer; Console.WriteLine($"服务器证书组织名称: {orgName ?? "未找到"}"); Console.WriteLine($"服务器证书序列号: {serialNumber}"); Console.WriteLine($"证书颁发者: {issuer}"); } } public object BeforeSendRequest(ref Message request, IClientChannel channel) { // 创建并返回HttpWebRequest,用于后续获取响应中的证书 var requestUri = request.Headers.ToUri(); var webRequest = (HttpWebRequest)channel.GetProperty<IWebRequestCreate>().Create(requestUri); return webRequest; } } // 端点行为:将消息检查器添加到客户端运行时 public class CertificateBehavior : IEndpointBehavior { public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { clientRuntime.MessageInspectors.Add(new CertificateInspector()); } public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { } public void Validate(ServiceEndpoint endpoint) { } }
修改客户端调用代码
在原有的WCF客户端实例中添加自定义行为,执行调用时即可输出证书信息:
ServiceReference2.WebService1SoapClient srv = new ServiceReference2.WebService1SoapClient(); // 添加自定义证书拦截行为 srv.Endpoint.Behaviors.Add(new CertificateBehavior()); string s = srv.HelloWorld(); Console.WriteLine(s);
注意事项
- 确保项目已引用
System.ServiceModel和System.Net命名空间 - 证书Subject的解析逻辑需根据实际证书格式调整,部分证书的字段分隔符或前缀可能不同
- 该方案仅适用于基于HTTP/HTTPS协议的WCF客户端调用
内容的提问来源于stack exchange,提问作者vico
相关产品推荐
相关产品推荐

