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選項包括私鑰信息。