c# - 如何对自定义套接字 TCP 协议(protocol)使用证书身份验证?

标签 c# authentication networking certificate

我知道WCF有证书认证。我怎样才能为我的自定义套接字协议(protocol)做同样的事情?我应该使用哪些类来验证证书?我应该在各方之间传输哪些数据?需要哪些步骤?

最佳答案

假设您要使用 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 一样。

关于c# - 如何对自定义套接字 TCP 协议(protocol)使用证书身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29966999/

相关文章:

asp.net - 为什么 aspnet_users 使用 guid 作为 id 而不是递增 int?帮助扩展用户字段的奖励积分

C# - Get 和 Set 访问器中的树/递归?

c# - IObservable - 如何发送/发布/推送新值到集合

c# - Int32.TryParse 错误

java - 如何获取其他网段的计算机主机名?

c# - 正确实现多线程+套接字应用

bash - Vagrant 报告一个没有任何运行的端口冲突

c# - IIS 应用程序池、内存管理

php - 将输入与两个表进行比较

ajax - CakePHP AuthComponent 使用 Ajax 登录而无需表单?