如何使用证书身份验证自定义套接字TCP协议?

时间:2015-04-30 11:49:55

标签: c# authentication networking certificate

我知道WCF有证书身份验证。如何为自定义套接字协议执行相同的操作?我应该使用哪些类来验证证书?我应该在各方之间转移什么数据?有哪些必要的步骤?

1 个答案:

答案 0 :(得分:0)

假设您要使用SSL:

在服务器端,您可以将NetworkStream打包在SslStream中并使用X509Certificate进行身份验证:

SslStream stream = new SslStream(networkStream, false);
stream.AuthenticateAsServer(certificate, false, SslProtocols.Default, false);

第二次调用中的false控制服务器是否还要求客户端拥有证书。

This link包含用于生成自签名证书的代码,在开发过程中非常方便。

在客户端,您必须提供验证回调:

SslStream stream = new SslStream(networkStream, false, ValidateRemoteCertificate);
stream.AuthenticateAsClient(RemoteHost);

如果需要,您可以在AuthenticateAsClient重载中提供客户端证书。

private bool ValidateRemoteCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
    {
        return true;
    }

    // Here you decide whether self-signed certificates are OK
    if (allowAnyCertificateAnyway)
    {
        return true;
    }

    return false;
}

我希望这有帮助,它使用NetworkStream,它最终只是Socket的包装。这些都是在框架中内置的,您可以从/ SslStream读取/写入,就像它是常规的NetworkStream一样。