【发布时间】:2021-12-04 10:40:42
【问题描述】:
我正在尝试在将公开给公共互联网的服务器上设置 TCP 流(非 HTTP),但只有“选择的”客户端才能连接。据我了解,这通常是通过证书固定来处理的,但我并不熟悉如何完成此操作的所有细节。
- 为服务器生成 SSL 证书。这很容易。
- 设置服务器。当客户端连接时,让它调用如下代码:
private SslStream GetSslStream(TcpClient client, string certificateFile)
{
var c = X509Certificate.CreateFromCertFile(certificateFile);
var cert = new X509Certificate2(c);
if (!cert.Verify()) {
throw new Exception("Certificate failed verification");
}
var stream = new SslStream(client.GetStream(), false, VerifyClientCert);
stream.AuthenticateAsServer(cert, true, true);
return stream;
}
- 客户端证书从何而来?它是服务器 SSL 证书的副本吗?它是必须以某种方式从服务器的证书派生的单独证书吗?是完全不同的证书吗?
-
VerifyClientCert方法中有哪些内容可以确保它是正确的证书?只需Verify()并检查Thumbprint是否符合预期值,还是需要进行更多操作? - 每个客户都应该获得一份相同客户证书的副本吗?
【问题讨论】:
标签: c# ssl certificate-pinning