SslStream 接受证书?

Posted

技术标签:

【中文标题】SslStream 接受证书?【英文标题】:SslStream accept certificate? 【发布时间】:2009-12-16 20:49:09 【问题描述】:

我用 C# 制作了一个简单的 ftp 客户端,它可以满足我的需要(连接到 ftp,可选择使用代理),但我也希望能够使用 AUTH SSL。

因此,我没有使用 NetworkStream,而是查看了 SslStream,并希望它是一个相当容易的替代品。

但是,在与我的 (glftpd, selfsigned openssl cert) ftp 握手时,我似乎遇到了很多问题。这是一个代码片段:

    TcpClient client = new TcpClient("192.168.0.2", 1337);
    SslStream sslStream = new SslStream(
                client.GetStream(),
                false,
                new RemoteCertificateValidationCallback(ValidateServerCertificate),
                null
                );
        try
        
            sslStream.AuthenticateAsClient("192.168.0.2"); // or "glftpd", neither worked.
        
        catch (AuthenticationException e)
        
            Console.WriteLine("Exception: 0", e.Message);
            if (e.InnerException != null)
            
                Console.WriteLine("Inner exception: 0", e.InnerException.Message);
            
            Console.WriteLine("Authentication failed - closing the connection.");
            client.Close();
            return;
        

我以 IOException 中断 AuthenticateAsClient:“由于意外的数据包格式,握手失败。”。 我没有打破 ValidateServerCertificate(从未达到)。

我发现很难调试此错误,因为我可以将 TcpClient 端口设置为 1208219421,但仍然收到相同的错误(所以我什至不知道它是否无法与 ssl 端口通信)。

上面的代码(在我查看的 3-4 个不同的 C# ssl 指南中)是从 link text 修改的

我已经尝试过 sslStream.AuthenticateAsClient(..., ..., SslProtocols.Tls, false) 和 sslStream.AuthenticateAsClient(..., ..., SslProtocols.Ssl3, false) Ssl2 和 Default,并且我知道 TLS 适用于我的 glftpd 安装。

如果我不得不猜测我会认为它与机器名/证书名有关,但我已经尝试过证书名(即“glftpd”),所以现在我对失败的原因一无所知握手。

还应注意证书是自签名的。

非常感谢任何帮助!

查克

【问题讨论】:

【参考方案1】:

你检查端口号了吗?是这个问题吗?

编辑 1

http://en.wikipedia.org/wki/FTPS

也许您的服务器未处于“隐式”模式?应该吗?

您可能也希望/相反在您的产品中支持显式模式。

编辑 2

(抱歉,我还不能发表评论,没有足够的代表,所以我正在编辑。:-))

如果不需要在您的实时代码中同时支持显式和隐式,我通常希望尽可能在两个端口上同时运行 TCP 服务器,一个用于隐式 SSL,一个用于显式/非 SSL。您的服务器软件可能支持也可能不支持。

编辑 3

取决于您是否控制服务器/您希望如何符合标准!

隐式模式将被视为稍微不那么标准,但 OTOH 它的工作量更少。

编辑 4

使用显式而不是隐式可能更好地防止拒绝服务问题,但我不确定,我必须研究该协议。我的经验是使用 XMPP。

编辑 5

加上显式模式的纯文本启动可能会让一些公司法律部门对任何未经授权的访问的法律问题更加放松,而不是直接在网络上进行 TLS 胡言乱语。

【讨论】:

不幸的是,我不这么认为。端口应该是正确的。 1337 是我可以在各种 ftp 客户端中使用非 SSL 和 AUTH SSL 连接的,但感谢您的回复。 你说得对,不支持隐式。所以可能就是这样。我想要的是 AUTH SSL 或者只是 TLS 就可以了(如果工作量少的话?) 我的目标只是将 (TCP) 连接到 IP。然后无论如何都可以发送“AUTH TSL”(或“AUTH SSL”)并接受证书,然后与该 IP 建立安全连接。 仅依靠 DNS 不好 - DNS 可能会受到中间人攻击。进行风险评估并可能尽量避免。此外,如果您开始使用证书,请验证每次 TLS 握手的结果。协商的协议应该是公认的强协议(TLS 库通常可以协商来自一套捆绑协议的连接)并检查证书指纹。最好在您的 TLS 软件中禁用弱协议。 感谢您的安全顾虑,但我至少需要对接受证书说是/否,并且说是,无论如何它都会接受。

以上是关于SslStream 接受证书?的主要内容,如果未能解决你的问题,请参考以下文章

SslStream.AuthenticateAsServer 异常 - 服务器模式 SSL 必须使用具有关联私钥的证书

SslStream.AuthenticateAsClient() 使用未缓存的 CRL 非常慢

Windows/Linux dotnet core SslStream 差异

自签名证书:私钥问题

stream抓包安装ca证书没反应

使用 C# 和 AWS 证书保护 WebSocket 服务器