【问题标题】:How to use certificate authentication for custom sockets TCP protocol?如何对自定义套接字 TCP 协议使用证书身份验证?
【发布时间】:2015-07-10 02:41:43
【问题描述】:

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

【问题讨论】:

    标签: c# authentication networking certificate


    【解决方案1】:

    假设您要使用 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 的包装。这一切都内置在框架中,您可以像普通的NetworkStream 一样读取/写入SslStream

    【讨论】:

    • 如果我只想将证书用于身份验证而不用于加密怎么办?有没有更简单的方法?
    • 如果将SslStreamleaveInnerStreamOpen参数设置为true,则可以在双方成功执行AuthenticateAsXxxxx()方法后关闭SslStream。然后您可以继续通过NetworkStream 或套接字发送未加密的数据。我不知道这是“要走的路”还是被认为是“有史以来最糟糕的黑客”,但它确实有效。
    猜你喜欢
    • 1970-01-01
    • 2020-04-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多