gpt4 book ai didi

c# - 如何根据证书主题验证规范名称(通用名称,cn)?

转载 作者:太空宇宙 更新时间:2023-11-03 20:02:31 25 4
gpt4 key购买 nike

在 C# 中,我像这样创建到服务器的 SSL 连接:

var hostname = "www.example.com";
var client = new TcpClient(hostname, 443);
var sslStream = new SslStream(client.GetStream());
sslStream.AuthenticateAsClient(hostname);

在上面没有抛出异常的情况下完成后,我知道服务器证书已经过验证并且主机名与主题充分匹配。可以通过属性 sslStream.RemoteCertificate.Subject 访问主题,这是一个 DN 格式的字符串,类似于

CN=www.example.com, O=Example Inc, L=New York, S=New York, C=US

CN=*.example.com, OU=Certificate Authority Validated

出于深奥的原因,我想针对同一证书主题验证另一个字符串(另一个主机名)。您如何正确验证特定主机名是否与证书的主题匹配?

最佳答案

这里是相关标准:RFC2818 Section 3.1 .

特别重要:问题问如何解析主题字符串,正确答案是:一般来说,你不应该那样做。至少自 2000 年编写 RFC2818 以来,解析主题字符串已被弃用,取而代之的是 subjectAltName.dNSName。

这是单声道实现:(在以下文件中搜索 checkServerIdentity) https://github.com/mono/mono/blob/master/mcs/class/Mono.Security/Mono.Security.Protocol.Tls.Handshake.Client/TlsServerCertificate.cs

我之前发布此信息作为对问题的编辑,并表示它不算作答案,因为代码不完整 - 代码部分标记为 TODODEPRECATED。但现在我更仔细地审查了代码和 RFC,发现 DEPRECATED 注释是 RFC 标准所要求的,而 TODO 注释实际上已经完成了 -显然有人忘记删除 TODO 评论。

关于c# - 如何根据证书主题验证规范名称(通用名称,cn)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26456302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com