2015-05-01 30 views
1

我正在C++中搜索客戶端TLS連接示例。最適合Visual Studio,但老實說它可以是任何編譯器。我找到了幾個C樣本。但沒有人工作。我開始與此樣品中C: https://wiki.openssl.org/index.php/SSL/TLS_Client用於客戶端TLS連接的OpenSSL或LibreSSL C++示例

但failes上

res = BIO_do_connect(web); 

與「系統庫」如果我想連接到我自己的node.js服務器(使用直接IP地址)或與「使用encrypted.google.com作爲網址的不良主機名查找」。 都與libressl和Visual Studio 2013年

下一站:http://fm4dd.com/openssl/sslconnect.htm

在這裏,程序運行成功。但是,任何試圖寫在與端SSL連接:

std::string json = "{'test':'huhu'}"; 

char buff[1024]; 
sprintf(buff, "POST /test.de HTTP/1.1 \nHost: test.de\nContent-Type: application/json\nContent-Length: %d\n\n", json.length()); 
std::string post = buff; 

int snd = SSL_write(ssl, post.data(), post.length()); 
snd = SSL_write(ssl, json.data(), json.length()); 

強制服務器關閉連接(我不明白,因爲我不現在我怎麼能告訴Node.js的告訴究竟發生了什麼我更多)。

所以我搜索了工作樣品或如何獲得與自己的證書運行C++

+0

您可以查看主OpenSSL命令行工具中的s_client代碼。這支持許多證書選項。 – Rup

+0

你應該知道要問一個教程或示例:)我經常使用C++來包裝OpenSSL,但我使用獨特的指針來自動清理。下面是它的樣子:[如何在C++中正確地將RSA *打印爲字符串?](http://stackoverflow.com/a/23473034/608639)。 – jww

+0

@jww Mea culpa。今天下午我絕望了:-)現在看起來好多了。但是如何處理這個問題呢?刪除它(誠實的問題)? –

回答

1

我正在尋找C++中的客戶端TLS連接例如TLS連接。

我認爲有一些OpenSSL到C++的端口。他們試圖做全班包裝的事情。請參閱Google上的openssl++ class

當我在C++中使用它時,我使用唯一的指針進行清理。例如參見How to properly print RSA* as string in C++?。我主要使用它來確保清理。我認爲它類似於Resource Acquisition Is Initialization模式。

OpenSSL還爲類似的庫和框架提供了一個頁面。請參閱OpenSSL wiki上的Related Links頁面。


但它

res = BIO_do_connect(web); 

與「系統庫」如果我想連接到我自己的node.js服務器出現故障(使用>直接IP地址)或「壞主機名查找「

我的猜測是這裏的證書中的名稱與URL中用於連接的名稱不匹配。

您可以通過在host文件中添加條目來使名稱生效。實際上,這是您的本地DNS覆蓋。請參閱Microsoft TCP/IP Host Name Resolution Order

或者,您可以生成一個包含所有必需名稱的證書。對於這一點,看到How to create a self-signed certificate with openssl?


強制服務器關閉連接(我不明白,因爲我不現在我怎麼能告訴Node.js的告訴我更準確地說發生了什麼)。

"POST /test.de HTTP/1.1 \nHost: test.de\nContent-Type: 
    application/json\nContent-Length: %d\n\n" 

既然你缺乏Connection: close請求頭,服務器可能是以下RFC 7230, HTTP/1.1 Message Syntax and Routing, Section 6.1

不支持持續的連接必須發送 「close」連接選項,在服務器每個不包含 的響應消息都有1xx(信息)狀態碼。

而且,這也許應該是:

"POST /test.de HTTP/1.1\r\nHost: test.de\r\nContent-Type: 
    application/json\r\nContent-Length:%d\r\n\r\n" 

\r\n被用作新的生產線,而不是\r,而不是\n。雙\r\n用於終止頭。您可以快速驗證是否在標準中搜索「CRLF」。您將着陸討論ABNF語法。


所以我搜索了工作樣品或如何獲得與自己的證書運行C++

訣竅這裏是創建一個結構完整的證書TLS連接。爲此,請參閱How to create a self-signed certificate with openssl?