gpt4 book ai didi

c# - .NET SslStream AuthenticateAsServer 能否遵守客户端发送的服务器名称指示符?

转载 作者:行者123 更新时间:2023-11-30 16:16:07 26 4
gpt4 key购买 nike

客户:来访
1. https://host1.com/
2. https://host2.com/

服务器:有两个证书。
certificates1.pfx CN=host1.com 和 certificates2.pfx CN=host2.com

使用wireshark
客户来访https://host1.com/
1: C --> S同步
2: C <-- S SYN,ACK
3: C --> S ACK
4: C --> S Client Hello (Contain Server Name: host1.com)
...如何在 C# 中选择 certificate1
5: C <-- S Server Hello, Certificate, Server Hello Done

客户来访https://host2.com/
1: C --> S同步
2: C <-- S SYN,ACK
3: C --> S ACK
4: C --> S Client Hello (Contain Server Name: host2.com)
...如何在 C# 中选择 certificate2
5: c <-- S Server Hello, Certificate, Server Hello Done

SslStream sslStream = new SslStream(
clientStream,
false,
new RemoteCertificateValidationCallback(ValidateServerCertificate),
new LocalCertificateSelectionCallback(SelectLocalCertificate)
);

X509Certificate2 certificate = new X509Certificate2("certificates1.pfx");

sslStream.AuthenticateAsServer(certificate , false, SslProtocols.Tls | SslProtocols.Ssl3 | SslProtocols.Ssl2, true);

private X509Certificate SelectLocalCertificate(object sender, string targetHost, X509CertificateCollection localCertificates, X509Certificate remoteCertificate, string[] acceptableIssuers)
{
//In Debug, targetHost is empty string and remoteCertificate=null
//I can't return right Certificates
return null;
}
private bool ValidateServerCertificate( object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}

最佳答案

虽然 SslStream 本身不支持 SNI,但我已确认可以解决此问题。在服务器上,如果您在启动 SslStream 之前从 NetworkStream 读取一些字节,您可以看到从客户端发送到服务器的初始数据包实际上是客户端问候,其中包括请求的服务器名称。

有一个问题,因为 NetworkStream 不支持偷看字节...所以你必须使用包装流类。 (这里有一个实现:https://stackoverflow.com/a/7281113/1726692)。

还有一个问题——一旦你得到字节,你必须弄清楚如何处理它们。我确定这是特定于实现的,并且受许多标准的约束......我目前没有实现来解析那些初始字节,但是当我将 Win7 SSlStream 客户端连接到 Win8 SslStream 服务器时,我捕获从客户端到服务器的第一个数据包,在服务器上启动 SslStream 之前,我可以非常清楚地看到在那些字节中发送到服务器的请求的服务器名称,通过上面的 PeekableStream 提供给服务器。

所以这绝对是可能的。问题是在哪里可以找到可靠的实现。

关于c# - .NET SslStream AuthenticateAsServer 能否遵守客户端发送的服务器名称指示符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18754271/

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