私はカード リーダー付きのスマート カードを持っており、後者にクライアント証明書を実装することにしました。
秘密鍵はカードに保存され、公開鍵はサーバーに保存されます。
アプリケーション シナリオは次のようなものです。
- アプリケーションがフレームを Linux サーバーに送信する
- ランダム数を使用した Linux サーバーの応答
- アプリケーションは(スマートカードまたはpemファイル)から秘密鍵を読み取り、受信した乱数を暗号化し、結果をサーバーに送信します。
- サーバーは、送信された暗号化された文字列を公開鍵 (サーバーに保存されている pem ファイル) を介して復号化しようとします => 成功した場合はアクセスが許可され、それ以外の場合はアクセスが拒否されます。
私のアプリケーションには、証明書認証 (静的ファイル .pem) のモードがあり、秘密鍵 (同じく静的 .pem) も使用します。やopenssl-net
などの関数を使用して、秘密鍵を読み取り、データを暗号化してサーバーに送信しました。FromPrivateKey(string pem, string password)
PrivateEncrypt(byte[] msg, RSA.Padding padding)
必要な問題は、pem ファイル以降、スマートカードに秘密鍵をエクスポートする先験的な方法がないことです。
そのため、多くの調査の結果、これらの関数タイプの関数の代わりに、エンジン「pkcs11」を使用した「ENGINE_load_private_key」を使用する必要があることがわかりました。
したがって、pkcs11(opensc、engine_pkcs11など)を使用したopenssl構成の例(http://openssl.6102.n7.nabble.com/Private-Key-from-Windows-Cert-Store-td20720.htmlなど)を見てきました。 ..) 問題は、これらの構成が Linux 用であることです。
実際、スマートカードまたは PEM ファイルから秘密鍵を読み取ることができるクライアント アプリケーション Windows WPF (C# で記述) を開発する必要があります。