スマート カードに保存されている資格情報を使用して、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 呼び出しが行われていることに気付きました。
誰かがこのトピックの経験があり、ここで何が起こっているのかを知っているなら、それは私を大いに助けてくれるでしょう.