【发布时间】:2019-07-26 12:13:31
【问题描述】:
场景是:我们有一个带有证书的 linux 设备。设备证书由根证书签名的中间证书签名,因此深度级别为 3。有一个服务可以对 linux 设备进行 Https 调用。该服务托管在 Windows 工作站上,并且在 CA 信任库中安装了对设备进行签名的根证书的公钥。问题是我们无法找到在工作站端验证设备证书的正确方法。
在创建 HttpWebRequest 时,我们尝试通过在受信任的根证书颁发机构中为 Windows 上的本地用户添加公共证书来验证证书。
var httpWebRequest = (HttpWebRequest)WebRequest.Create(endpoint);
httpWebRequest.ServerCertificateValidationCallback = CertificateValidationHandler;
处理程序是:
bool CertificateValidationHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
{
return true;
}
//Validate certificate
}
简单的方法是验证中的简单return true;,但我们希望进行适当的证书处理。
【问题讨论】:
-
你能告诉我们当你不设置
ServerCertificateValidationCallback时会发生什么吗?你想验证什么?到期,它没有被撤销(证书撤销列表或在线响应者)?发行人? -
您的信任链由设备证书、颁发该证书的中间 CA 和颁发中间证书的根 CA 组成。您的工作站只知道信任根 CA,并且大概您的 linux 设备在响应 HTTPS 请求时只提供设备证书。因此,显然缺少一块,客户端工作站无法建立信任链。您的 linux 设备应(至少)提供中间证书及其设备特定证书(如果不是完整链)。
-
@AmitKumarGupta 感谢您的分析。基于它,我们试图查看 Linux 设备(服务器)是否确实只提供叶子而不提供中间证书。在服务器回调中,我们只看到叶子。然而,当我们对 Java 应用程序进行相同尝试时——进行比较——我们确实收到了叶子和中间的组合。因此,在这种情况下,linux 设备的行为与预期的一样,提供了链。这可能是在客户端中以某种方式控制的吗?您是否知道 .NET 端有一个设置来“控制”服务器对证书的响应?
标签: c# certificate ssl-certificate self-signed