如何将C#SSLStream客户端连接到OpenSSL服务器? 我是CurrScript写的强> C(C)客户端(用SLSFUNION使用MUNO) >已经存在的OpenSSL服务器用C++编写。我知道理论上,他们应该能够沟通,但我总是有一个例外:
身份验证或解密失败 当我调用如何将C#SSLStream客户端连接到OpenSSL服务器? 我是CurrScript写的强> C(C)客户端(用SLSFUNION使用MUNO) >已经存在的OpenSSL服务器用C++编写。我知道理论上,他们应该能够沟通,但我总是有一个例外:,c#,openssl,client,ssl-certificate,sslstream,C#,Openssl,Client,Ssl Certificate,Sslstream,身份验证或解密失败 当我调用sslStream.authenticatesclient(ServerName)时,它在Mono.Security.Protocol.Tls.SslStreamBase.asynchhandshakecallback中发生 我不需要客户端身份验证,因此我不使用任何客户端证书,也无法将服务器证书加载到客户端的信任存储中,因为我无法在客户端使用命令行 在服务器上,我似乎收到了一些不应该发生的随机数据,因为我从未在客户端代码中调用sslStream.Write()。也许我
sslStream.authenticatesclient(ServerName)
时,它在Mono.Security.Protocol.Tls.SslStreamBase.asynchhandshakecallback中发生
我不需要客户端身份验证,因此我不使用任何客户端证书,也无法将服务器证书加载到客户端的信任存储中,因为我无法在客户端使用命令行
在服务器上,我似乎收到了一些不应该发生的随机数据,因为我从未在客户端代码中调用sslStream.Write()
。也许我不完全明白握手是怎么发生的。我有一个OpenSSL C++客户端,它工作得很好。
有人知道我怎样才能让它工作吗
我在服务器端使用OpenSSL生成的自签名证书,我将其转换为DER格式
我如何继续:
服务器端
sslStream.Write
,但执行从未到达此处非常感谢您的帮助,因为我不确定sslStream内部是如何工作的。好的,明白了。事实上,我设置的
BIO
和SSL
变量顺序错误。在OpenSSL中实际调用SSL\u Accept
之前,您必须创建BIO并将其附加到SSL,否则身份验证无法完成,这似乎是合乎逻辑的
另外,我在客户端使用C语言中的SSLStream
发送消息,而在服务器端使用OpenSSL的BIO\u read
和BIO\u write
这不起作用,因为BIO\u read
和BIO\u write
与SSL\u read
和SSL\u write
没有等效性。这两个函数只在底层套接字上读写,没有任何加密或解密,这使得SSL握手几乎毫无用处(除了检查线路另一端的身份)
这就解释了为什么我无法进行通信,因为两端的语言不同:一个发送未加密的消息,而另一个期望SSL包装的消息,反之亦然
SSL\u read
和SSL\u Write
函数负责加密和解密,因此在这里使用它们。现在它工作得很好
如果您需要关于我是如何做到这一点的更多详细信息,请评论此答案。好的,我知道了。事实上,我设置的
BIO
和SSL
变量顺序错误。在OpenSSL中实际调用SSL\u Accept
之前,您必须创建BIO并将其附加到SSL,否则身份验证无法完成,这似乎是合乎逻辑的
另外,我在客户端使用C语言中的SSLStream
发送消息,而在服务器端使用OpenSSL的BIO\u read
和BIO\u write
这不起作用,因为BIO\u read
和BIO\u write
与SSL\u read
和SSL\u write
没有等效性。这两个函数只在底层套接字上读写,没有任何加密或解密,这使得SSL握手几乎毫无用处(除了检查线路另一端的身份)
这就解释了为什么我无法进行通信,因为两端的语言不同:一个发送未加密的消息,而另一个期望SSL包装的消息,反之亦然
SSL\u read
和SSL\u Write
函数负责加密和解密,因此在这里使用它们。现在它工作得很好
如果你需要关于我是如何做到这一点的任何进一步细节,请评论这个答案