11

サーバーへの SSL 接続を確立するクライアント アプリケーションを Windows で作成しています。サーバーは認証のためにクライアント証明書を要求します。サーバーから .pfx ファイルが提供されるので、次のように openssl コマンド ライン ツールを使用して証明書と秘密鍵を取得します。

openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
openssl pkcs12 -in filename.pfx -nocerts -out key.pem

その後、以下のように openssl から関数を使用して証明書と秘密鍵を読み込もうとしましたが、SSL_CTX_use_PrivateKey_file()常に失敗しました。エラー メッセージは " error:0906D06C:PEM routines:PEM_read_bio:no start line" です。理由がわかりません。これがコードです。

#include "openssl/ssl.h"
#include "openssl/err.h"
#include <stdio.h>
#include <string>

int InitClientCtx()
{
    OpenSSL_add_ssl_algorithms();

    SSL_CTX* m_pClientCtx;
    m_pClientCtx = SSL_CTX_new(SSLv23_method());

    if(!m_pClientCtx)
    {
        return -1;
    }

    ::SSL_CTX_set_options(m_pClientCtx, SSL_OP_ALL);  //for well-known bugs

    int nRet = 0;

    std::string sCertFilePath = "C:\\cert.pem";

    nRet = SSL_CTX_use_certificate_chain_file(m_pClientCtx, sCertFilePath.c_str());

    std::string sKeyPassWord = "123456";

    SSL_CTX_set_default_passwd_cb_userdata(m_pClientCtx, (void*)(sKeyPassWord.c_str()));

    std::string sKeyFilePath = "C:\\key.pem";

    // this method returned 0, which means it failed.
    nRet = SSL_CTX_use_PrivateKey_file(m_pClientCtx, sKeyFilePath.c_str(), SSL_FILETYPE_PEM);

    SSL_load_error_strings();
    unsigned long n = ERR_get_error();
    char buf[1024];
    printf("%s\n", ERR_error_string(n, buf));

    nRet = SSL_CTX_check_private_key(m_pClientCtx);
    if (nRet <= 0)
    {
        return -1;
    }

    /*std::string sCACertFilePath;

    nRet = SSL_CTX_load_verify_locations(m_pClientCtx, sCACertFilePath.c_str(), NULL);*/

    return 0;
}

int main()
{
    InitClientCtx();
    return 0;
};
4

5 に答える 5

14

私の場合、エラーは PEM ファイルにキーと証明書の両方が含まれていなかったためです。

ファイルに両方のセクションが含まれていることを確認してください。

-----BEGIN PRIVATE KEY----- jhajk838383jks.....
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE----- yoe55wjcxnshre.....
-----END CERTIFICATE KEY-----

ファイルを作成するために、Apache 構成に既にあるファイルを連結.keyしました。.crt.pem

「開始行がありません」というエラーは、PEM ファイルに完全に適切な「BEGIN」行があってもエラーが発生する可能性があるため、誤解を招く可能性があります。

于 2013-11-08T14:17:04.117 に答える
0

openssl ディレクトリ demo/openssl の下に、クライアントの例があります。

変化する:

meth = SSLv2_client_method();

あなたの場合には:

meth = SSLv23_client_method();

この例を試して、失敗する場所を確認してください。

キーのパスワードは 123456 ですか?

于 2013-09-26T17:44:57.440 に答える