[英]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格式。
我正在尝试使用适应于本主题中的临时客户端的临时客户端进行连接。
sslStream.Write
但是执行永远不会到达这里。 任何帮助将不胜感激,因为我不确定如何了解sslStream的内部工作原理。
好的,我知道了。 实际上,我以错误的顺序设置了BIO
和SSL
变量。 在实际在OpenSSL中调用SSL_Accept
之前,必须创建BIO并将其附加到SSL,否则身份验证无法完成,这似乎很合理。
另外,我在客户端使用C#中的SSLStream
发送消息,而我在服务器端使用OpenSSL使用BIO_read
和BIO_write
。
这可能不行 ,因为BIO_read
和BIO_write
不等同于SSL_read
和SSL_write
。 这两个函数仅在基础套接字上读写,而没有任何加密或解密,这使得SSL握手几乎无用(除了检查该行另一端的身份)。
这就解释了为什么我无法进行通信,因为两端使用的语言不同:一个发送未加密的消息,而另一个发送SSL封装的消息,而另一种则相反。
SSL_read
和SSL_Write
函数负责加密和解密,因此在这里使用它们。 现在,它可以完美运行了。
如果您需要有关我的操作方法的更多详细信息,请评论此答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.