2012-02-13 50 views
5

這是,我一直在使用VS2008是用C#編寫的應用程序跟進Mono xbuild error CS1548 - key file has incorrect formatPFX/PKCS12到SNK轉換爲單

嗨。目前我們正在使用Mono將此應用程序移植到Mac。

我試圖從pfx文件中提取密鑰。 首先我用

`sn -pc key.pfx key.snk` 

這給我的

'Failed to extract public key for key pair -- Keyset does not exist'. 

錯誤然後我用

`sn -p key.pfx key.snk` 

這創造我想要的SNK文件。 然後我在單選擇項目選項>大會簽約 當內置錯誤

'key.snk is missing private key needed for signing'. 

我想我明白,如果我做,我可以在它同時擁有私鑰和公鑰新的SNK密鑰。正是由於遺留問題,我們才真正希望能夠使用原始的pfx鍵值。

回答

6

非常感謝Poupou提出的答案我剛剛添加了代碼給我的小程序讓我snk。

using System.IO; 
using System.Security.Cryptography; 
using System.Security.Cryptography.X509Certificates; 

namespace PfxSnk 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      X509Certificate2 cert = new X509Certificate2(@"KEY.pfx", "pfxPassword", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet); 
      RSACryptoServiceProvider provider = (RSACryptoServiceProvider)cert.PrivateKey; 

      byte[] array = provider.ExportCspBlob(!provider.PublicOnly); 

      using (FileStream fs = new FileStream("FileName.snk", FileMode.Create, FileAccess.Write)) 
      { 
       fs.Write(array, 0, array.Length); 
      } 
     } 
    } 
} 
0

改爲嘗試sn -p key.pfx key.snk

+1

從這個問題看起來這與他嘗試的第二件事情完全相同。 – poupou 2012-02-19 16:58:48

2

sn -p用於從強名稱中提取public key

但是,您需要私鑰才能簽署程序集 - 因此(內置的sn)轉換對您的目標沒有幫助。

不幸的是,快速瀏覽微軟sn選項沒有記錄任何選項來做你想要的。

我的建議是編寫一個小工具,重新使用Mono snMono.Security.dll源代碼,讀取PFX(pkcs#12)文件並將其寫回爲SNK文件。

+0

感謝poupou我是一個初學者,簽署程序集等等。我明白這個工具應該做什麼,卻不知道如何開始製作它。所以我可以使用mono.security讀取pfx,然後獲取私鑰和​​公鑰,然後使用mono sn和檢索到的密鑰創建新的snk文件。我有pfx文件的密碼。預先感謝任何建議,我真的很感激它。 – 2012-02-23 23:51:03

+0

我們的pfx文件上有一個密碼,我們認爲它會阻止單聲道讀取密鑰,如鏈接https://bugzilla.xamarin.com/show_bug.cgi?id=725。 另外我們不知道如何用確切的私鑰和公鑰來編寫一個snk文件 - 它似乎會生成新的隨機密鑰。 – 2012-02-24 00:12:15

+0

類'X509Certificate2'可以讀取PFX(PKCS#12)密碼保護的文件。它還有一個'PrivateKey'屬性,它將公開'RSA'實例。有了這個,你可以使用'StrongName'類(來自Mono.Security.dll)將它保存爲(無密碼的)'.snk'文件。 – poupou 2012-02-24 01:25:48