[英]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.