以前は、CryptLib を使用する (Windows) パッケージを使用して RSA 暗号化を処理していました。ここで、クライアントを CryptLib の使用が優先されない新しいプラットフォームに移行したいと考えています。すべてを作成したので、あとは秘密鍵をインポートするだけです。
キーは CryptLib のキーセット ストア (pkcs#15) に格納されます。グーグルで調べてみると、ほとんどの (10 年前の) メールは、「あなたはそれを望まない」、「作者は故意にそれを防いでいる」などと述べています。誰も使わないからサポートを作りたくない。
唯一の方法があるようです: 秘密鍵を pfx / pkcs#12 形式で保存します。その形式ははるかによくサポートされています。
pkcs#12 を使用するには、フラグを有効にして cryptlib dll を再コンパイルする必要があります。私はそれを行い、pkcs#12 ルーチンを呼び出すことができました。
dll に Delphi ラッパーを使用して読みやすくします。 // ディスク ks からキーセット (p15) をロードします。
// get private key from keyset ks
ck := TCryptKey.GetPrivateKey(ks, CRYPT_KEYID_NAME, pansichar('Key'), fpasswd);
// test write to a p15 store
ks2 := TCryptKeyset.Create(CRYPT_KEYSET_FILE, 'test.p15', CRYPT_KEYOPT_CREATE );
ks2.AddPrivateKey(ck, 'fiets');
// test write to p12 store
ks3 := TCryptKeyset.Create(CRYPT_KEYSET_FILE, 'test.p12', CRYPT_KEYOPT_CREATE );
ks3.AddPrivateKey(ck, 'fiets'); // <--- fails with error
最初のテストは、p15 ストアを作成することであり、うまく機能します (作成されたストアは、もちろんパスワードが変更されていることを除いて、元のストアとほとんど同じです)。しかし、p12 ストアへの 2 回目の書き込みでエラーが発生します。ソースをたどると、提供した秘密鍵が証明書と見なされることに関係しています。また、秘密鍵がまだ存在しないため、次のエラーで失敗します。
誰かが cryptlib の pcs#12 機能を使用したことがあるか、この状況を処理する別の方法を知っていることを願っています。ソリューションが python、php、c#、delphi にある場合は問題ありません...
2014 年 4 月 22 日更新 cryptlib self の C# ラッパーを使用し、コードを書き直しました (Delphi ラッパーが問題を引き起こした場合に備えて) が、同じ結果が得られました :(
static void Main(string[] args)
{
int ks_ptr = 0;
int ks_pvk = 0;
int ks12_ptr = 0;
try
{
Console.WriteLine("Initializing...");
crypt.Init();
Console.WriteLine("Loading keystore");
ks_ptr = crypt.KeysetOpen(crypt.UNUSED, crypt.KEYSET_FILE, "privatekey.key", crypt.KEYOPT_NONE);
Console.WriteLine("Loading private key");
ks_pvk = crypt.GetPrivateKey(ks_ptr, crypt.KEYID_NAME, "Key", pwd);
Console.WriteLine("Creating new keystore");
ks12_ptr = crypt.KeysetOpen(crypt.UNUSED, crypt.KEYSET_FILE, "privatekey.pfx", crypt.KEYOPT_CREATE);
Console.WriteLine("Saving private key");
crypt.AddPrivateKey(ks12_ptr, ks_pvk, "mylittlesecret");
}
catch (CryptException ce)
{
Console.WriteLine("Exception: "+ce.Message);
Console.WriteLine("Status writingkeystore: " + GetStatusFor(ks12_ptr));
}
Console.WriteLine("Done. Press a key to quit.");
Console.ReadKey();
}
更新 #2
テストを確認すると、テストで .p12 IS が生成されます。真新しい .p12 ファイルにも多少の手間がかかります。ただし、元のキーは .p12 から読み取られるため、ファイルを書き戻すために必要な情報が含まれている可能性があります...さらに確認してみましょう...
更新 #3 cryptlib の unittests を変更して、.p15 キーストアからテスト秘密鍵を取得し、それを p12 キーストアに書き込みましたが、秘密鍵を設定するときに、空の pkcs12_info 構造がアイテム設定関数に渡されるようです。
Pfff、誰かが何か指針を持っていることを願っています...