我们有一个构建服务器,它包含我们的私钥,用于在密钥容器中签署延迟签名的程序集。我们现在正在创建另一个构建服务器,似乎没有人知道原始密钥文件的位置,因此我们尝试从原始服务器导出密钥并导入到新服务器中。
要进行导出,我们正在使用:
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
所以,我怀疑,我们的导入或导出过程都是错误的。想法?
答案 0 :(得分:1)
您可以使用以下命令行导出密钥容器:
aspnet_regiis -px "SameplKeys" keys.xml -pri
这会将密钥容器SampleKeys
导出到keys.xml
文件。 -pri
选项包含私钥信息。
答案 1 :(得分:0)
RSACryptoServiceProvider的一个问题是,如果不存在密钥对,它将生成密钥对。如果您正在阅读现有密钥(或使用全新的密钥),则更难以了解。
我不记得究竟是如何存储强名称密钥(已经有一段时间了)和CryptoAPI。但是我不相信他们会在机器商店(不管是默认情况下),所以
cp.Flags = CspProviderFlags.UseMachineKeyStore;
不应该使用(在导出中,也不在导入中)。
我不记得密钥槽(例如KeyNumber.Signature),但它在导出和导入代码中应该是相同的(同时尝试: - )。
如果这不起作用,请尝试检测导出或导入是否是问题。使用 sn 选项查看导出的公钥( -tp )是否与程序集上使用的公钥匹配( -Tp )。
您还可以查看Mono source code的 sn 工具。它确实支持这些选项,但我不记得它们是否与MS版本(wrt密钥容器)完全兼容,因为FX 1.x可能会有一些变化; - )