我需要在建立 SSL 连接时验证 4 件事
- URL 中的主机名与 CN 和 SAN 证书匹配
- 服务器提供的证书由 CA 在信任库中签名
- 服务器证书未过期
- CA 证书未过期
代码:
options.withT1s(new MqttClientOptionsBuilderT1sParameters()
{
CertificationValidationCallBack=(cer, chain, error, o) =>
{
if(//do checks here)
{
// check pass
return true;
}
else
{
// check fail
return false;
}
}
}
最佳答案
这四项检查已经由系统完成。如果您没有自定义回调,那正是为您强制执行的内容。
在自定义回调中,这些状态由 error
和 chain
参数表示... error
是一个 [Flags] 值.
如果设置了 RemoteCertificateNameMismatch
,则名称与 SAN 条目不匹配(如果没有 SAN-DNS 条目,则为 CN 条目)——您的条件 (1)。
如果 RemoteCertificateChainErrors
被设置,那么 chain
对象将指出它无效的原因(有些东西已经过期,根不可信,以及更多潜在的问题).
因此,最简单的答案(在未注册回调之后)是return errors == SslPolicyErrors.None;
关于c# - 进行 SSL 连接时需要主机名验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55938578/