You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:50:27