2

C++ でクライアント TLS 接続の例を探しています。Visual Studio に最適ですが、正直なところ、どのコンパイラでもかまいません。いくつかの C サンプルを見つけました。しかし、誰も働いていませんでした。私は C でこのサンプルから始めました: https://wiki.openssl.org/index.php/SSL/TLS_Client

しかし、それは失敗します

    res = BIO_do_connect(web);

自分の node.js サーバーに (直接 IP アドレスを使用して) 接続する場合は「システム ライブラリ」を使用するか、url として 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++ で実行されている独自の証明書を使用して TLS 接続を取得する方法を検索します

4

2 に答える 2

1

C++ でクライアント TLS 接続の例を探しています。

OpenSSL から C++ へのポートがいくつかあると思います。彼らは完全なクラス ラッパーのことをしようとします。Google でopenssl++ クラスを参照してください。

C++ で使用する場合は、クリーンアップに一意のポインターを使用します。たとえば、C++ で RSA* を文字列として適切に印刷する方法を参照してください。. 私は主にクリーンアップを確実にするために使用します。Resource Acquisition Is Initializationパターンに似ていると思います。

OpenSSL は、同様のライブラリとフレームワークのページも提供します。OpenSSL wiki の関連リンクページを参照してください。


しかし、それは失敗します

res = BIO_do_connect(web);

自分のnode.jsサーバーに接続したい場合は「システムライブラリ」(>直接IPアドレスを使用)または「不正なホスト名ルックアップ」を使用

ここでの私の推測では、証明書の名前が、接続する URL で使用されている名前と一致しません。

ファイルにエントリを追加することで、名前を機能させることができhostます。事実上、これはローカルの DNS オーバーライドです。Microsoft TCP/IP ホスト名解決の順序を参照してください。

または、必要なすべての名前を含む証明書を生成できます。そのためには、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 に従っています。

永続的な接続をサポートしないサーバーは、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は改行として使用され、not\rおよび notは使用されません\n\r\nヘッダーを終了するためにdoubleが使用されます。標準で「CRLF」を検索していることをすぐに確認できます。ABNF 文法の議論に入ります。


そこで、実際に動作するサンプルを検索するか、C++ で実行されている独自の証明書を使用して TLS 接続を取得する方法を検索します

ここでの秘訣は、整形式の証明書を作成することです。そのためには、openssl で自己署名証明書を作成する方法を参照してください。

于 2015-05-01T18:58:24.527 に答える