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 

所以,我怀疑,无论是我们的进口或出口过程我这是错的。想法?

回答

0

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

我记不清究竟如何存储强名密钥(这是一段时间)和CryptoAPI。但我不相信他们是在计算机存储(默认情况下是这样)所以

cp.Flags = CspProviderFlags.UseMachineKeyStore; 

不应该使用(在出口,也没有进口)。

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

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

您还可以看看单色source codesn工具。它确实支持这些选项,但我不记得它们是否与MS版本完全兼容(包括密钥容器),并且因为FX 1.x ;-)

+0

那么,试图与导出的旗帜属性arround周围 - 它是为每个设置生成不同的键。一致,但不同。没有一个是正确的。明天继续调查。 – Hassan

1

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

aspnet_regiis -px "SameplKeys" keys.xml -pri 

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