方案是:我们有一个带有证书的linux设备。设备证书由中间证书签名,中间证书由根证书签名,因此深度级别为3。有一项服务可以对Linux设备进行Https调用。该服务托管在Windows工作站上,并且在CA信任库中安装了用于对设备进行签名的根证书的公共密钥。问题在于,我们无法在工作站上找到正确的方法来验证设备证书。
创建HttpWebRequest时,我们试图通过在Windows上本地用户的受信任的根证书颁发机构中添加公共证书来验证证书。
var loadingTask = pdfjsLib.getDocument({
url: url,
cMapUrl: "pdfjs/cmaps/",
cMapPacked: true
});
loadingTask.promise.then(...
处理程序是:
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
}
,但我们希望适当地处理证书。
答案 0 :(得分:0)
感谢您的评论。花了一些时间试图找出如何从ServerCertificateValidationCallback
处理HttpWebRequest
之后,我决定更改方法并尝试不同的http .net实现。我使用System.Net.Http.HttpClient
类进行了测试,并且回调函数返回了正确验证的完整证书链。此外,ms docs中建议不要将HttpWebRequest
用于新开发。用法示例:
HttpClientHandler httpClientHandler = new HttpClientHandler();
httpClientHandler.CertificateCustomValidationCallback = ValidationCallback;
using (HttpClient client = new HttpClient(httpClientHandler))
{
}
答案 1 :(得分:0)
经过一些测试,我们发现问题出在HttpWebRequest和HttpClient的.net core 2.0。将框架更新为.net core 2.1验证对于两者都可以正常工作。 .net core 2.0的问题在于它如何处理证书验证回调。由于HttpClient,此问题未得到解决,但是由于我们将版本更新为2.1。此外,验证回调使用.net Framework 4.6.1
可以检索证书链。