2015-12-02 20 views
8

我將我的X509Certificate存儲在數據庫中(位於byte[]),以便我的應用程序可以檢索證書並使用它來簽署我的JWT。無法在Azure中訪問我的X509Certificate2的PrivateKey

我的x509Certificate被傳遞給我在我的機器上生成的.pfx文件,但是現在它以字節字符串的形式位於數據庫中。

當我運行它時,我的應用程序在本地完全正常工作。應用程序可以正確地創建該X509Certificate2的一個實例並將其用於我的要求,但是當我嘗試在我的azurewebsites Web應用程序中使用它時會出現問題。

基本上我無法訪問證書專用密鑰實例變量,我得到一個異常

System.Security.Cryptography.CryptographicException: Keyset does not exist 

而且我重新實例化的證書與此

var cert = new X509Certificate2(myCertInBytes, myCertPass, 
      X509KeyStorageFlags.PersistKeySet | 
      X509KeyStorageFlags.MachineKeySet | 
      X509KeyStorageFlags.Exportable); 

我使用ASPNET 5 RC1 -update1。我也試着在不同的機器上運行它,並且它工作正常,只有當我發佈到Azure時纔會出現此問題。並且還添加其他內容,此應用程序正在運行,當我運行使用DNX版本beta7運行的同一項目時

任何幫助表示讚賞。

+0

您確定數據庫中的證書是否包含私鑰集?這不是一個公共證書,是嗎? –

+0

@ZainRizvi它肯定包含在內,如果我在本地運行密鑰,我可以檢索私鑰(來自Azure數據庫上的X509 Cert)。但是,將其部署到Azure時無法檢索它。 – Lutando

回答

6

問題是Azure Web Apps限制對計算機私鑰存儲的訪問,因爲它是共享主機環境,並且您沒有完全擁有該計算機。作爲解決方法,您可以加載證書。本博客文章介紹瞭如何操作的最佳做​​法: https://azure.microsoft.com/en-us/blog/using-certificates-in-azure-websites-applications/

請注意,這僅適用於Basic Tier及更高版本(非Free或Shared層)。

這也可以通過下面的.cer文件完成,但是應該注意,這不是最佳實踐,因爲您使用代碼以不安全的格式存儲安全證書。

public X509Certificate2 CertificateFromStrings(String certificateString64, String privateKeyXml) 
{ 
    try 
    { 
     var rsaCryptoServiceProvider = new RSACryptoServiceProvider(); 
     rsaCryptoServiceProvider.FromXmlString(privateKeyXml); 

     var certificateBytes = Convert.FromBase64String(certificateString64); 
     var x509Certificate2 = new X509Certificate2(certificateBytes); 
     x509Certificate2.PrivateKey = rsaCryptoServiceProvider; 

     return x509Certificate2; 
    } 
    catch 
    { 
     return null; 
    } 
} 
+0

如果需要高度保護私鑰,則可以使用Azure密鑰保管庫。 –

+0

事情是我的代碼用於4天前工作,現在它不。所以我能夠在4天前訪問我的證書私鑰,但現在不再了。我選擇了這個答案解決方案。說實話,我希望它仍然有可能在免費的一級,以便可以託管迷你丟棄項目,並仍然使用X509證書籤名。我被迫只升級這個網絡應用的價格計劃。 – Lutando

+0

您是否找到解決方案@Lutando?我遇到使用Azure密鑰保管庫的相同問題。代碼在我的本地主機上運行時運行和按預期工作,但Azure App Service中的相同代碼無法在將密碼傳遞給構造函數時實例化X509Certificate2。 –

相關問題