【问题标题】:How can I connect a C# SSLStream client to an OpenSSL server?如何将 C# SSLStream 客户端连接到 OpenSSL 服务器?
【发布时间】:2013-07-12 17:41:12
【问题描述】:

我正在编写一个 C# 客户端(使用使用 SSLStream 的 Mono)为一个已经存在的 OpenSSL 服务器用 C++ 编写。我知道理论上,他们应该能够交流,但我总​​是得到一个例外:

身份验证或解密失败。

当我调用 sslStream.AuthenticateAsClient(ServerName) 时发生在 Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback 中;

我不需要客户端身份验证,所以我不使用任何客户端证书,并且我无法将服务器证书加载到客户端的信任库中,因为我无法使用该命令客户端的线路。

在服务器上,我似乎收到了一些不应该发生的随机数据,因为我从未在客户端代码中调用sslStream.Write()。也许我不完全理解握手是如何发生的。我有一个可以完美运行的 OpenSSL C++ 客户端。

有人知道我怎样才能让它工作吗?

我在服务器端使用由 OpenSSL 生成的自签名证书,我将其转换为 DER 格式。

我如何进行:

服务器端

  1. 初始化 OpenSSL
  2. 加载服务器证书 (DER) 和私钥 (PEM)
  3. 打开非 SSL 监听套接字
  4. 当客户端连接时,我打开一个新套接字,将其连接到 SSL_Bio 并接受连接
  5. 读取 SSL 套接字以获取传入数据。

客户端

我正在尝试使用改编自 this topic 的临时客户端进行连接。

  1. 打开一个新的 TCPClient
  2. 使用与上述线程中相同的验证回调将新的 SSLStream 链接到它;
  3. 调用 AuthenticateAsClient(ServerName) 会带来此异常。
  4. 调用sslStream.Write,但执行永远不会到这里。

任何帮助将不胜感激,因为我不确定 sslStream 内部是如何工作的。

【问题讨论】:

    标签: c# openssl client ssl-certificate sslstream


    【解决方案1】:

    好的,知道了。事实上,我以错误的顺序设置了 BIO 和 SSL 变量。您必须创建 BIO 并将其附加到您的 SSL 之前,您实际上在 OpenSSL 中调用 SSL_Accept,否则身份验证无法完成,这似乎是合乎逻辑的。

    另外,我在客户端使用 C# 中的 SSLStream 来发送我的消息,而我在使用 OpenSSL 的服务器端使用 BIO_read 和 BIO_write。

    这可能行不通,因为BIO_read 和BIO_write 不等同于 SSL_read 和SSL_write。这两个函数只在底层套接字上读写,没有任何加密或解密,使得 SSL 握手几乎没有用(除了检查线路另一端的身份)。

    这解释了为什么我无法进行通信,因为两端没有说相同的语言:一个发送未加密的消息,而另一个预期 SSL 包装的消息,反之亦然。

    SSL_read 和 SSL_Write 函数负责加密和解密,所以在这里使用它们。现在它完美地工作了。

    如果您需要有关我如何做到这一点的更多详细信息,请评论此答案。

    【讨论】:

    • 嗨,我正在尝试制作 SSLStream 服务器和 OpenSSL 客户端连接。当我的 SSLStream 调用 ReadFunction 来读取从客户端发送的消息时,它会抛出一个 IO 异常。我对消息语言有类似的猜测是不同的,但想不出任何解决方案来使其在整个平台上统一。
    • 嗨,我也有一个 C# SSLStream 客户端和一个 OpenSSL 服务器 c++。它执行的那一刻 sslStream.AuthenticateAsClient("ServerCertificateName");它给出了错误。错误消息:对 SSPI 的调用失败,请参阅内部异常。 InnerException : {"收到的消息是意外的或格式错误的"}。您是否还可以在实际调用 OpenSSL 中的 SSL_Accept 之前分享有关如何创建 BIO 并将其附加到 SSL 的代码。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 2015-05-16
    • 1970-01-01
    相关资源
    最近更新 更多