C ++のWindowsクライアントは、証明書がJKSにフォーマットを使用され、サーバはJAVAの開発で、SSL相互認証をサポートしています。C ++は、証明書JKS形式をサポートしているので、変換の下で行わOpenSSLを使用していません。
1、我々は.P12ファイルに変える最初のJKSに必要
キーツール-importkeystore -srckeystore demo.jks -destkeystore demo.p12 -srcstoretype JKS -deststoretype PKCS12
2、その後は、PEMファイル.P12ファイルに移し
OpenSSLのPKCS12 -nodes - で demo.p12 -out demo.pem
3、コピー-----証明書をBEGIN -----
----- END CERTIFICATE -----のファイルをcacert.pemのために
CER証明書ファイル形式は、次のコマンドを利用できるがある場合は、直接cacert.pemの変換
opensslのX509 -inform DER - で demo.cer -out cacert.pemの
4、秘密鍵を取り出します
OpenSSLのPKCS12 - で demo.p12 -nocerts -nodes - アウトdemo.key、 opensslのRSA - で demo.key -out privkey.pem。
フローチャート:
注意すべきいくつかの場所があります。
1、SSL_load_error_strings()。
SSL_library_init();
OpenSSL_add_all_algorithms();
一度だけ実行する必要があり、再接続する必要の後ろに、再び呼び出す必要がない場合でも。だから我々はコンストラクタで置くことができます。
一般的な接続、ソケットがサーバーを防止し、非ブロックに設定されますがオンラインでないとき2は、長い時間のために接続する必要があります。しかし、非ブロッキングを設定した後、ssl_connectは失敗接続することができ、その複数の接続が必要。
だから私は、次のパッケージを所有しています:
INT CSslSocketClient :: SSL_ShakeHands() { int型 ssl_conn_ret = SSL_connect(m_ssl)。 もし(ssl_conn_ret == 1 ) { 戻り 0 。 } そう であれば(ssl_conn_ret == - 1 ) { int型 ssl_conn_err = SSL_get_error(m_ssl、ssl_conn_ret)。 もし(SSL_ERROR_WANT_READ == ssl_conn_err || SSL_ERROR_WANT_WRITE == ssl_conn_err){ // 需要再次来进行握手 リターン - 2 。 } 他 { リターン - 1 。 } } 他 { リターン - 1 。 } }
場合コールアウト、それは-2、再び必要SSL接続である場合、それは、失敗を示す、-1である場合、戻り値は、成功を示し、0の場合。
3、あなたはSSL_newは、次の証明書、および次のチェックをロードする必要がする前に、双方向認証をサポートしたいので。
CStringのstrPath; strPath.Format(" %sの\\ PEM \\%S " 、m_strWorkPath、cert_nameの)。 もし(SSL_CTX_use_certificate_file(m_ctx、strPath、SSL_FILETYPE_PEM)<= 0 ){ MYTRACE(" CSslSocketClient "、" 証明書ファイルのエラー!" ); DisconnectSocket(); 戻る - 1 。 } strPath.Format(" %sの\\ PEM \\%S " 、m_strWorkPath、PRIV_NAME)。 もし(SSL_CTX_use_PrivateKey_file(m_ctx、strPath、SSL_FILETYPE_PEM)<= 0 ){ MYTRACE(" CSslSocketClient "、" PrivateKeyのファイルエラーを使用:%sの\ nを" 、ERR_reason_error_string(ERR_get_error())); DisconnectSocket(); 戻る - 1 。 } もし(!{SSL_CTX_check_private_key(m_ctx)) MYTRACE(" CSslSocketClient "、" 失敗した秘密鍵を確認してください\ nは!" ); DisconnectSocket(); 戻る - 1 。 }
4、クラスデストラクタは、メモリSSLのメモリを解放しますが、それでもプログラムが引き出された、とにかく、この時間は重要ではありませんではない、メモリリークの2メガバイトの周りに存在します。
// 释放内存 sk_SSL_COMP_free(SSL_COMP_get_compression_methods()); CRYPTO_cleanup_all_ex_data(); ERR_remove_state(0 )。 CONF_modules_unload(1 )。 CONF_modules_free(); ERR_free_strings(); ERR_remove_thread_state(NULL)。 EVP_cleanup();
上記の関数は、ヘッダファイルを必要とします
書式#include <opensslの/ err.h>
の#include <opensslの/ conf.h>