Windows Server 2019上.NET 4.7.2 SSLStream忽略代理无法校验CRL求助
Windows Server 2019下SSLStream校验CRL失败的兼容性问题
我在Windows Server 2012 R2服务器上,使用.NET 4.7.2类库通过SSLStream类连接SMTP服务器发送邮件,代码如下:
... TcpClient _tcpc = new System.Net.Sockets.TcpClient(host, port); _tcpc.SendBufferSize = m_BlockOfBytesToSend; sslStream = new SslStream(_tcpc.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate)); sslStream.AuthenticateAsClient(host, null, SslProtocols.Tls12, true); ...
原本运行正常,但升级到Windows Server 2019后,该类库无法正常工作,原因是无法校验远程服务器证书的吊销列表(CRL),报错信息如下:
Pid 7936.Chain status: 0:RevocationStatusUnknown:The revocation function was unable to check revocation for the certificate.
1:OfflineRevocation:The revocation function was unable to check revocation because the revocation server was offline.
我的分析如下:
- SSLStream.AuthenticateAsClient方法使用Windows加密API校验CRL,通过winhttp API下载证书指定的CRL端点内容,本应使用服务器的winhttp代理设置,且该行为无法由开发者自定义(除了禁用CRL校验,但这不合适)
- 通过procmon分析发现:Windows Server 2019尝试绕过代理设置直接访问CRL分发端点,而
netsh winhttp show proxy显示代理设置是正确的,因无代理无法访问端点导致失败 - 进一步对比显示:Windows Server 2012在联系企业代理下载CRL前会读取注册表中的winhttp设置,而Windows Server 2019则读取用户注册表中的Internet设置;由于我的应用以非交互式用户运行,该用户无配置文件,因此无代理设置
- 恢复Windows Server 2012快照后问题解决,说明Windows Server 2019对winhttp API的行为做了修改,破坏了软件的向后兼容性
请问有没有人遇到过类似问题,或有相关信息可以分享?
内容的提问来源于stack exchange,提问作者Benny Evangelista
相关产品推荐
相关产品推荐

