繁体   English   中英

如何将C#SSLStream客户端连接到OpenSSL服务器?

[英]How can I connect a C# SSLStream client to an OpenSSL server?

我目前正在 C ++编写的现有OpenSSL服务器编写C#客户端 (使用Mono使用SSLStream)。 我知道从理论上讲,他们应该能够沟通,但是我总是会遇到一个例外:

认证或解密失败。

当我调用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套接字以获取传入数据。

客户端

我正在尝试使用适应于本主题中的临时客户端的临时客户端进行连接。

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

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

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

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

这可能不行 ,因为BIO_readBIO_write 不等同SSL_readSSL_write 这两个函数仅在基础套接字上读写,而没有任何加密或解密,这使得SSL握手几乎无用(除了检查该行另一端的身份)。

这就解释了为什么我无法进行通信,因为两端使用的语言不同:一个发送未加密的消息,而另一个发送SSL封装的消息,而另一种则相反。

SSL_readSSL_Write函数负责加密和解密,因此在这里使用它们。 现在,它可以完美运行了。

如果您需要有关我的操作方法的更多详细信息,请评论此答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM