2015-12-02 11 views
8

X509Certificate'ım bir veritabanında saklıyorum (byte[] içinde), böylece uygulamam sertifika alabilir ve JWT'leri imzalamak için kullanabilir.X509Certificate2'nin PrivateKey In Azure'ına erişemiyorum

x509Certificate, makinemde oluşturduğum bir .pfx dosyasını aktardı, ancak şimdi bir veritabanında bir bayt dizisi olarak duruyor.

Uygulamam, çalıştırdığımda yerel olarak gayet iyi çalışıyor. Uygulama, X509Certificate2'nin bir örneğini doğru şekilde oluşturabilir ve gereksinimlerim için kullanabilir, ancak azurewebsites web uygulamasında kullanmayı denediğimde sorun ortaya çıkar.

Temelde ben belgelerimiz PrivateKey örnek değişken erişemez, bir istisna

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

olsun Ve ben ASPNET 5 rc1 kullanıyorum bu

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

sertifikayı-başlatmasını yeniden am -update1. Bunu farklı bir makinede çalıştırmayı denedim ve gayet iyi çalışıyor, Azure'a yayınladığımda sadece bu sorunu yaşıyorum. Ve başka bir şey eklemek için, Bu uygulama, DNX sürüm beta7

kullanarak çalışan aynı projeyi çalıştırırken çalışıyordu.

+0

Veritabanınızdaki sertifikanın özel anahtar kümesinin içerdiğinden emin misiniz? Bu bir şans değil, kamu yararı değil mi? –

+0

@ZainRizvi kesinlikle dahil, ben yerel anahtar yerinde yerinde çalıştırırsanız, (X509 Cert Azure DB üzerinde) özel anahtar alabilirsiniz. Ancak, bunu Azure'a dağıttığımda alınamaz. – Lutando

cevap

6

Sorun, Azure Web Apps'ın paylaşılan bir barındırma ortamı olduğu ve makinenin tam sahibi olmadığından, makinelerin özel anahtar deposuna erişimini kısıtlamasıdır. Bir çözüm olarak, bir sertifika yükleyebilirsiniz. Bu blog yayını bunu nasıl en iyi uygulama anlatılmaktadır: https://azure.microsoft.com/en-us/blog/using-certificates-in-azure-websites-applications/

bu sadece yukarıda Temel Tier ve (Serbest veya Paylaşılan katmanlı değil) için çalıştığını unutmayın.

Bu, aşağıdaki gibi bir .cer dosyasından da yapılabilir, ancak kodunuzla güvenli bir kimlik bilgilerini güvenli olmayan bir biçimde sakladığınızdan bunun en iyi uygulama olmadığını unutmayın.

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

Özel anahtarın son derece güvenli olması gerekiyorsa Azure Anahtar Kasası'nı kullanabilirsiniz. –

+0

Şey, benim kodum 4 gün önce çalışmak için kullanılmış ve şimdi değil. Böylece 4 gün önce özel anahtarlarma erişebildim ama artık değil. Bu cevaplar çözümünü tercih ettim. Dürüst olmak gerekirse, mini atılım projelerinin barındırılabilmesi ve hala X509 belgelerinin bir şeyler imzalamak için kullanılmasını sağlamak istedim. Bu web uygulaması için fiyatlandırma planımı yeni sürüme geçirmem gerekiyordu. – Lutando

+0

Bir çözüm buldunuz mu, @Lutando? Azure Key Vault kullanarak aynı sorunu yaşıyorum. Kod, yerel sunucumda çalışırken beklendiği gibi çalışır ve çalışır, ancak Azure Uygulama Hizmeti'ndeki aynı kod, hem parolayı yapıcıya iletirken hem de X509Certificate2'yi başlatılamadı. –

İlgili konular