2

我们确实有一个构建服务器,其中包含我们的私钥,用于在密钥容器中签署延迟签名的程序集。我们现在正在创建另一个构建服务器,但似乎没有人知道原始密钥文件在哪里,所以我们试图从原始服务器导出密钥并导入新服务器。

为了进行导出,我们使用这个:

RSACryptoServiceProvider key;
CspParameters cp = new CspParameters();
cp.KeyContainerName = "nameOfOurContainer";
cp.Flags = CspProviderFlags.UseMachineKeyStore;
key = new RSACryptoServiceProvider(cp);
var blob = key.ExportCspBlob(true);
using (var fs = new FileStream(filePath,  FileMode.CreateNew))
{
    fs.Write(blob, 0, blob.Length);
}

导入 - 这个

CspParameters cp = new CspParameters();
cp.KeyContainerName = containerName;
cp.Flags = CspProviderFlags.UseMachineKeyStore;
cp.KeyNumber = (int)KeyNumber.Signature;

RSACryptoServiceProvider key = new RSACryptoServiceProvider(cp);

using (var fs = new FileStream(filePath, FileMode.Open))
{
    var blob = new byte[fs.Length];
    fs.Read(blob,0,(int)fs.Length);
    key.ImportCspBlob(blob);
    key.PersistKeyInCsp = true;             
}

密钥已成功导出和导入,但新服务器上的签名不起作用 - 我们正在

Key pair does not match public key from assembly

因此,我怀疑我们的导入或导出过程是错误的。想法?

4

2 回答 2

1

您可以使用以下命令行导出密钥容器:

aspnet_regiis -px "SameplKeys" keys.xml -pri

这会将密钥容器导出SampleKeyskeys.xml文件。该-pri选项包括私钥信息。

于 2012-01-25T12:04:35.220 回答
0

RSACryptoServiceProvider 的问题之一是如果不存在密钥对,它将生成密钥对。很难知道您是否正在阅读现有的密钥(或使用全新的密钥)。

我不记得究竟是如何存储强名称密钥的(已经有一段时间了)wrt CryptoAPI。但是我不相信他们在机器商店里(无论如何都不是默认的)所以

cp.Flags = CspProviderFlags.UseMachineKeyStore;

不应使用(在导出中,也不在导入中)。

我不记得密钥槽(例如 KeyNumber.Signature),但它在您的导出和导入代码中应该是相同的(尝试两者:-)。

如果这不起作用,请尝试检测是导出还是导入问题。使用sn选项查看导出的公钥 ( -tp ) 是否与程序集上使用的公钥 ( -Tp ) 匹配。

您还可以查看其sn工具的 Mono源代码。它确实支持这些选项,但我不记得它们是否与 MS 版本(wrt 密钥容器)完全兼容,并且自 FX 1.x 以来情况可能会有所变化;-)

于 2011-09-08T12:42:50.780 回答