2017-04-18 92 views
1

我正在嘗試創建一個自簽名的RSA-2048-SHA-256證書PFX文件,以便在我的WCF請求中使用它進行數據簽名。使用openSSL生成自簽署的RSA-2048-SHA-256證書PFX文件

我使用了一些openSSL示例來創建證書PFX文件,但即使我將SHA算法設置爲256,當我將其加載到我的.net應用程序中時,我發現該證書的私鑰具有這些設置:

KeyExchangeAlgorithm = RSA-PKCS1-KeyEx 

SignatureAlgorithm = http://www.w3.org/2000/09/xmldsig#rsa-sha1 

,當我爲了使用下面的代碼來使用這個證書,我得到「無效的算法指定的異常」,但如果我改變SHA256CryptoServiceProvider到SHA1CryptoServiceProvider一切工作正常。

string msg = "This is my test message"; 

X509Certificate2 privateCert = new X509Certificate2("C:\\TEMP\\private.pfx", "12345"); 

byte[] signature = (privateCert.PrivateKey as RSACryptoServiceProvider).SignData(new UTF8Encoding().GetBytes(msg), new SHA256CryptoServiceProvider()); 

我只能假設我的證書文件不是用SHA256創建的,而是用某種默認的SHA1算法創建的。

這些都是我在訂單中使用的步驟來創建我的證書:

  1. openssl req -x509 -days 365 -newkey rsa:2048 -sha256 -keyout key.pem -out cert.pem
  2. openssl pkcs12 -export -in cert.pem -inkey key.pem -out private.pfx

我在做什麼錯?

+0

至於爲什麼你不能用鑰匙創建新的基於SHA-256的簽名,要麼添加'-csp「Microsoft增強RSA和AES加密提供」'到PKCS12命令,或獲取私鑰從'cert.GetRSAPrivateKey()'。但這真是一個不同的問題。 – bartonjs

+0

感謝您的評論,我在我的pkcs12命令中使用了-CSP「Microsoft Enhanced RSA and AES Cryptographic Provider」,現在它可以工作,之前,但由於某種原因,pkcs12命令失敗。我也嘗試使用cert.GetRSAPrivateKey(),並且這也適用,雖然它需要.NET Framework 4.6。 – Alex

回答

1

我在做什麼錯?

相信這兩個屬性有意義:)。

你看到的兩個值是hard-coded into RSACryptoServiceProvider。其他RSA類型(如RSACng)有different, less confusing, hard-coded values

問題是密鑰沒有這些屬性中的任何一個。一個密鑰可以用於多種目的(儘管NIST建議不要這樣做)。 TLS會話(或EnvelopedCMS文檔等)可以具有密鑰交換算法。證書,SignedCMS文檔或其他此類材料可以具有簽名(並因此具有簽名算法)。

要知道您的證書是使用RSA-PKCS1-SHA256簽名的,您需要查看X509Certificate2.SignatureAlgorithm

switch (cert.SignatureAlgorithm.Value) 
{ 
    case "1.2.840.113549.1.1.4": 
     return "RSA-PKCS1-MD5"; 
    case "1.2.840.113549.1.1.5"; 
     return "RSA-PKCS1-SHA1"; 
    case "1.2.840.113549.1.1.11"; 
     return "RSA-PKCS1-SHA2-256"; // Winner 
    case "1.2.840.113549.1.1.12": 
     return "RSA-PKCS1-SHA2-384"; 
    case "1.2.840.113549.1.1.13": 
     return "RSA-PKCS1-SHA2-512"; 
    default: 
     throw new SomethingFromTheFutureOrMaybeNotRSAException(); 
} 
+0

感謝您的回答,我使用cert.SignatureAlgorithm valie檢查了我的證書,事實上,正如您所說,它實際上是RSA-PKCS1-SHA2-256 :)。 – Alex

相關問題