2

スマート カードに保存されている資格情報を使用して、C++ で SSL クライアント認証を実装しようとしています。

つまり、openssl ライブラリを使用して、証明書と秘密鍵を使用して SSL コンテキストを初期化し、その後のすべての https 接続でこのコンテキストを使用することを意味します。

これを支援するために私が遭遇したライブラリは、https ://github.com/OpenSC/libp11 にある libp11 とその pkcs11-engine モジュールです。

私のコードが実際に Web サーバーで意図したとおりに機能するシナリオは、証明書が一覧表示されて libp11 を介して取得され、秘密鍵が pkcs11 エンジンを使用して id で取得される場合です。

PKCS11_enumerate_certs(slot->token, &certs, &ncerts);

X509 *cert = certs[0].x509;

EVP_PKEY *pkey = ENGINE_load_private_key(pkcs11_eng, "pkey_id", NULL, NULL);

if (!SSL_CTX_use_certificate(context->ctx, cert )) {
    throw SSLError::getLastError();
}
if (!SSL_CTX_use_PrivateKey(context->ctx, pkey )) {
    throw SSLError::getLastError();
}
if (!SSL_CTX_check_private_key(context->ctx)) {
    throw SSLError::getLastError();
}

ただし、一貫性を保ち、物事をシンプルに保つために、これらの両方の取得に libp11 を使用することをお勧めします。これにより、他のコンポーネント全体 (pkcs11 エンジン) を使用する必要がなくなるからです。

私が抱えている問題は、次の方法で pkey を取得するときです。

PKCS11_KEY *key = PKCS11_find_key(&certs[0]);
EVP_PKEY pkey = PKCS11_get_private_key(key)

SSL を初期化すると、チェックはパスしますが、次のエラーがSSL_connect()関数によってスローされます。

error:80009005:Vendor defined:PKCS11_rsa_encrypt:General Error

基本的に、秘密鍵はエンジンを介して取得すると機能しますが、libp11 を使用するとエラーがスローされます。エンジンの github のコードを調べると、使用していたのと同じ p11 呼び出しが行われていることに気付きました。

誰かがこのトピックの経験があり、ここで何が起こっているのかを知っているなら、それは私を大いに助けてくれるでしょう.

4

1 に答える 1