スマートカードに保存された資格情報を使用してC++でSSLクライアント認証を実装しようとしています。libp11とpkcs11-engineを使った秘密鍵の読み取りの違い
本質的に、これは、opensslライブラリを使用して証明書と秘密鍵を使用してSSLコンテキストを初期化し、将来のすべてのhttps接続でこのコンテキストを使用することを意味します。
libp11とそのpkcs11エンジンモジュールは、ここではhttps://github.com/OpenSC/libp11にあります。
当社のウェブサーバで意図したとおりに私のコードは、実際に動作するシナリオは、証明書が記載されていると、検索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-engine)の使用もなくなります。
私がいる問題はで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呼び出し私が使っていたことを作った。
誰もがこのトピックの経験があり、ここで何が起こっているのか知っている人は、私を非常に助けてくれるでしょう。