使用证书文件通过SSL连接到Web服务

本文关键字:连接 Web 服务 SSL 证书 文件 | 更新日期: 2023-09-27 18:19:41

我正在C#中开发windows服务,它调用Web服务方法。我必须使用SSL连接到Web服务。我已收到来自发布者的带有证书的p12文件。该文件受密码保护。使用Import方法使用此证书。一切都很好,但我不喜欢这种方法——我的应用程序中有密码。当发布者更改证书时,我必须重写代码(将密码更改为新密码)。有没有办法不将密码更改为.p12文件或使用其他选项(.cer文件)?

使用证书文件通过SSL连接到Web服务

您可以做的事情如下:

  1. 将SSL证书安装到本地计算机证书存储中(使用Microsoft管理控制台"MMC")
  2. 提取证书指纹(例如"748681ca3646ccc7c4facb7360e3baa0894cb5")
  3. 使用一个函数,从本地证书存储中获取给定指纹的证书
  4. 在调用web服务时提供SSL证书
private static X509Certificate2 GetCertificateByThumbprint(string certificateThumbPrint, StoreLocation certificateStoreLocation) {
    X509Certificate2 certificate = null;
    X509Store certificateStore = new X509Store(certificateStoreLocation);
    certificateStore.Open(OpenFlags.ReadOnly);

    X509Certificate2Collection certCollection = certificateStore.Certificates;
    foreach (X509Certificate2 cert in certCollection)
    {
        if (cert.Thumbprint != null && cert.Thumbprint.Equals(certificateThumbPrint, StringComparison.OrdinalIgnoreCase))
        {
            certificate = cert;
            break;
        }
    }
    if (certificate == null)
    {
        Log.ErrorFormat(CultureInfo.InvariantCulture, "Certificate with thumbprint {0} not found", certificateThumbPrint);
    }
    return certificate;
}
public string GetServiceResponse() {
    string WebSvcEndpointConfigurationName = "WebServiceEndpoint";
    Uri webSvcEndpointAddress = new Uri("http://www.example.com/YourWebService.svc");
    string webSvcCertificateThumbPrint = "748681ca3646ccc7c4facb7360a0e3baa0894cb5";
    string webSvcResponse = null;
    SomeWebServiceClient webServiceClient = null;
    try
    {
        webServiceClient = new SomeWebServiceClient(WebSvcEndpointConfigurationName, new EndpointAddress(webSvcEndpointAddress));
        webServiceClient.ClientCredentials.ClientCertificate.Certificate = GetCertificateByThumbprint(webSvcCertificateThumbPrint, StoreLocation.LocalMachine);
        webSvcResponse = webServiceClient.GetServiceResponse();
    }
    catch (Exception ex)
    {
    }
    finally
    {
        if (webServiceClient != null)
        {
            webServiceClient.Close();
        }
    }
    return webSvcResponse;
} 

PKCS#12文件提供给您,因为它是将证书与私钥一起传输的自然方式。您可以使用以下选项之一:

  • 将其转换为您喜欢的格式并以您喜欢的方式存储
  • 将其转换为无密码PFX
  • 将其导入计算机的证书存储并以这种方式使用

但是,所有这些方法(加上保留硬编码密码)都无法对私钥提供真正的保护,因此,如果您将应用程序分发到组织外部,则这些方法是不可用的。