我正在尝试在将暴露给公共互联网的服务器上设置 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
,还是还有更多需要发生的事情?- 每个客户都应该获得相同客户证书的副本吗?