簡體   English   中英

從密鑰容器導出強名

[英]Strong name export from a key container

我們確實有一個構建服務器,其中包含我們的私鑰,該私鑰用於在密鑰容器中對延遲簽名的程序集進行簽名。 我們現在正在創建另一台構建服務器,似乎沒人知道原始密鑰文件在哪里,因此我們試圖從原始服務器導出密鑰並將其導入新服務器。

要進行導出,我們正在使用以下代碼:

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

因此,我懷疑我們的導入或導出過程是錯誤的。 想法?

您可以使用以下命令行導出密鑰容器:

aspnet_regiis -px "SameplKeys" keys.xml -pri

keys.xml密鑰容器SampleKeys導出到keys.xml文件。 -pri選項包括私鑰信息。

RSACryptoServiceProvider的問題之一是,如果不存在密鑰對,它將生成一個密鑰對。 這使您更難知道您是在讀取現有密鑰(還是使用全新的密鑰)。

我不記得確切的名字密鑰是如何存儲的(已經有一段時間)了。 但是我不相信它們會在機器存儲中(無論如何默認情況下也不是),因此

cp.Flags = CspProviderFlags.UseMachineKeyStore;

不應使用(在導出中或在導入中)。

我不記得按鍵槽(例如KeyNumber.Signature),但是在您的導出和導入代碼中都應該相同(均嘗試:-)。

如果這樣不起作用,請嘗試檢測是導出還是導入是問題。 使用sn選項查看導出的公鑰( -tp )是否與程序集( -Tp )上使用的公鑰匹配。

您也可以查看其sn工具的Mono 源代碼 它確實支持這些選項,但我不記得它們是否與MS版本(wrt密鑰容器)完全兼容,並且自FX 1.x以來,情況可能有所變化;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM