过去,我们使用 CryptLib 的(windows)包来处理 RSA 加密。现在我们想将我们的客户转移到一个不喜欢使用 CryptLib 的新平台。我们创建了一切,剩下的就是导入私钥。
密钥存储在 CryptLib 的密钥集存储 (pkcs#15) 中。在谷歌上搜索时,大多数(10 年前的)邮件都说“你不想要那个”,“作者故意阻止那个”等。似乎没有软件可以处理 pkcs#15,而安全提供程序库作者不不想创建支持,因为没有人使用它。
似乎只有一条出路:以 pfx / pkcs#12 格式存储私钥。这种格式的支持要好得多。
要使用 pkcs#12,您必须启用一个标志并重新编译 cryptlib dll。我这样做了,并且能够调用 pkcs#12 例程。
我使用 dll 的 delphi 包装器来使内容可读: // 从磁盘 ks 加载密钥集 (p15) := TCryptKeyset.Create(CRYPT_KEYSET_FILE, pansichar(fname), CRYPT_KEYOPT_NONE);
// 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 存储时出错。如果我追查源头,这与我提供的私钥被视为证书有关。并且因为还没有私钥,所以它失败并出现以下错误。
我希望有人曾经使用过 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 中读取的,因此它可能包含写回文件所需的信息......让我们再检查一下......
UPDATE #3 修改了 cryptlib 的 unittests 以从我的 .p15 密钥库中获取测试私钥,然后将其写入 p12 密钥库,但似乎在设置私钥时,将一个空的 pkcs12_info 结构传递给 set item 函数。
噗,希望有大神指点一下。。。