我的客户端应用程序需要与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
商店。我是对的吗?
答案 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
}