Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将C#SSLStream客户端连接到OpenSSL服务器? 我是CurrScript写的强> C(C)客户端(用SLSFUNION使用MUNO) >已经存在的OpenSSL服务器用C++编写。我知道理论上,他们应该能够沟通,但我总是有一个例外:_C#_Openssl_Client_Ssl Certificate_Sslstream - Fatal编程技术网

如何将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格式

我如何继续: 服务器端
  • 初始化OpenSSL
  • 加载服务器证书(DER)和私钥(PEM)
  • 打开非SSL侦听套接字
  • 当客户端连接时,我打开一个新的套接字,将其连接到SSL_Bio并接受连接
  • 读取SSL套接字以获取传入数据
  • 客户端 我正在尝试使用一个临时客户端进行连接,该客户端改编自中的一个

  • 打开新的TCP客户端
  • 使用与上面线程中相同的验证回调将新的SSLStream链接到它
  • 调用导致此异常的AuthenticateTaseClient(ServerName)
  • 调用
    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
    函数负责加密和解密,因此在这里使用它们。现在它工作得很好

    如果你需要关于我是如何做到这一点的任何进一步细节,请评论这个答案