簡體   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