2015-12-02 16 views
8

Tôi có chứng nhận X509Certificate được lưu trữ trong cơ sở dữ liệu (trong byte[]) để ứng dụng của tôi có thể truy xuất chứng chỉ và sử dụng nó để ký JWT của tôi.Không thể truy cập PrivateKey X509Certificate2 của tôi trong Azure

Chứng chỉ x509 của tôi được chuyển qua tệp .pfx mà tôi đã tạo trên máy của mình, tuy nhiên giờ nó nằm trong cơ sở dữ liệu dưới dạng chuỗi byte.

Ứng dụng của tôi hoạt động hoàn toàn tốt tại địa phương khi tôi chạy. Ứng dụng có thể tạo một thể hiện của X509Certificate2 đó một cách chính xác và sử dụng nó cho các yêu cầu của tôi, tuy nhiên vấn đề nảy sinh khi tôi cố gắng sử dụng nó trong ứng dụng web azurewebsites của tôi.

Về cơ bản tôi không thể truy cập instance variable PrivateKey của giấy chứng nhận, tôi nhận được một ngoại lệ

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

Và tôi lại instantiating giấy chứng nhận với điều này

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

Tôi đang sử dụng ASPNET 5 rc1 -update1. Tôi cũng đã cố gắng chạy này trên một máy tính khác nhau và nó hoạt động tốt, chỉ có vấn đề này khi tôi xuất bản để Azure. Và cũng để thêm một cái gì đó khác, Ứng dụng này đã hoạt động khi tôi đang chạy cùng một dự án đang chạy sử dụng phiên bản DNX beta7

Bất kỳ trợ giúp nào được đánh giá cao.

+0

Bạn có chắc chắn chứng chỉ trong cơ sở dữ liệu của mình đã bao gồm bộ khóa cá nhân không? Nó không phải là một chứng nhận công khai bởi bất kỳ cơ hội, phải không? –

+0

@ ZainRizvi nó là chắc chắn bao gồm, tôi có thể lấy chìa khóa riêng tư, (từ X509 Cert trên Azure DB) nếu tôi chạy khóa tại chỗ tại chỗ. Tuy nhiên nó không thể được lấy ra khi tôi triển khai nó để Azure. – Lutando

Trả lời

6

Vấn đề là Azure Web Apps hạn chế quyền truy cập vào máy lưu trữ khóa riêng tư, vì đó là môi trường lưu trữ được chia sẻ và bạn không sở hữu đầy đủ máy. Để giải quyết sự cố này, bạn có thể tải chứng chỉ. Bài đăng trên blog này mô tả phương pháp hay nhất về cách thực hiện: https://azure.microsoft.com/en-us/blog/using-certificates-in-azure-websites-applications/

Xin lưu ý rằng thao tác này chỉ áp dụng cho Cấp cơ bản trở lên (không phải tầng miễn phí hoặc chia sẻ).

Điều này cũng có thể được thực hiện từ tệp .cer như sau, tuy nhiên cần lưu ý rằng đây không phải là phương pháp hay nhất vì bạn đang lưu trữ chứng chỉ bảo mật với mã của mình ở định dạng không an toà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

Nếu khóa riêng cần được bảo mật cao, bạn có thể sử dụng Azure Key Vault. –

+0

Điều này là mã của tôi được sử dụng để làm việc 4 ngày trước và bây giờ nó không. Vì vậy, tôi đã có thể truy cập vào khóa cá nhân của riêng tôi cách đây 4 ngày nhưng không còn nữa. Tôi đã chọn giải pháp câu trả lời này. Thành thật mà nói tôi muốn nó vẫn còn có thể trên tầng miễn phí để các dự án mini-throw có thể được lưu trữ và vẫn sử dụng các chứng chỉ X509 để ký mọi thứ. Tôi buộc phải nâng cấp gói giá cho ứng dụng web này. – Lutando

+0

Bạn đã tìm được giải pháp, @Lutando chưa? Tôi đang gặp sự cố tương tự khi sử dụng Azure Key Vault. Mã chạy và hoạt động như mong đợi khi chạy trên máy chủ cục bộ của tôi, nhưng cùng một mã trong Dịch vụ ứng dụng Azure không thể khởi tạo X509Certificate2 cả khi truyền mật khẩu cho hàm tạo và không. –

Các vấn đề liên quan