2016-10-17 43 views
2

スマートカードに保存された資格情報を使用して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呼び出し私が使っていたことを作った。

誰もがこのトピックの経験があり、ここで何が起こっているのか知っている人は、私を非常に助けてくれるでしょう。

答えて

0

これは私の悪かったです。私はpkcs11エンジンを初期化していましたが、pkcs11を実装している私たち自身のdllで、p11を初期化するときはopensc dllを使いました。私はここで学んだレッスンは、コピー/貼り付けコードの前に常に慎重に見えると思います。

関連する問題