在c#(窗口)中实现安全的webservice调用

时间:2017-06-29 08:44:44

标签: ssl certificate windows

我的客户端应用程序需要与TLS1.1保护的远程Web服务进行通信。我想知道我应该如何配置我的服务器和客户端证书以使其工作。我们从webservice供应商处获得以下样本:

ServicePointManager .ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

然后

WebServiceProxy.AddClientCertificate(cert, password);

据我了解,对于整个应用来说,禁用证书是一个可怕的想法。据我所知,应用程序中应该没有tls / ssl配置,我应该只在正确的商店中安装我的证书,然后http.sys应该在握手期间协商它们。我是对的吗?

AFAIK远程Web服务证书应位于Third-Party Root Certification Authorities,我的客户端证书应位于Client Authentication商店。我是对的吗?

1 个答案:

答案 0 :(得分:1)

你是对的。

在理想的世界中,您可以将客户端证书安装到CurrentUser \ My或LocalMachine \ My store中。将使用AIA从客户端证书获取中间CA证书,并且根CA证书已经位于受信任的根存储中。这同样适用于服务器证书,因此每个人都会工作愉快。

您从webservice供应商那里获得的代码

ServicePointManager
    .ServerCertificateValidationCallback += 
    (sender, cert, chain, sslPolicyErrors) => true;

禁用证书验证。您很容易受到MitM攻击,但通信仍然是加密的:)

我不知道为什么有人会申请此代码。也许webservice供应商正在使用一些非公开的自定义CA,CRL端点不公开或类似的东西。

您可以使用此代码在客户端设置TLS1.1

ServicePointManager.SecurityProtocol = (SecurityProtocolType)LocalSecurityProtocolType.Tls11;

/// <summary>
/// Imported from .NET 4.6.1 : Specifies the security protocols that are supported by the Schannel security package.
/// </summary>
[Flags]
public enum LocalSecurityProtocolType
{
    /// <summary>
    /// Specifies the Secure Socket Layer (SSL) 3.0 security protocol.
    /// </summary>
    Ssl3 = 48,

    /// <summary>
    /// Specifies the Transport Layer Security (TLS) 1.0 security protocol.
    /// </summary>
    Tls = 192,

    /// <summary>
    /// Specifies the Transport Layer Security (TLS) 1.1 security protocol.
    /// </summary>
    Tls11 = 768,

    /// <summary>
    /// Specifies the Transport Layer Security (TLS) 1.2 security protocol.
    /// </summary>
    Tls12 = 3072
}