C ++のWindowsクライアントは、SSL相互認証をサポートしています

   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>

 

おすすめ

転載: www.cnblogs.com/ahcc08/p/11302798.html