2017-08-29 17 views
5

Tôi đang cố định cấu hình bảo vệ dữ liệu và sử dụng chứng chỉ để bảo vệ các tệp khóa. Dưới đây là tài liệu MS Configuring data protectionCách bảo vệ các tệp khóa bảo vệ dữ liệu bằng chứng chỉ trên Asp.Net Core 2 trên debian/linux

Dưới đây là những gì tôi đang cố gắng để làm:

services 
    .AddDataProtection() 
    .SetApplicationName("test server") 
    .PersistKeysToFileSystem("/home/www-data/config") 
    .ProtectKeysWithCertificate(
     new X509Certificate2("/home/www-data/config/"keyprotection.pfx); 

Khi tôi khởi động ứng dụng tôi nhận được lỗi sau khi khởi động:

info: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[58] 
    Creating key {71e2c23f-448b-49c9-984f-3c8d7227c904} with 
    creation date 2017-08-29 18:53:51Z, activation date 2017-08-29 18:53:51Z, and expiration date 2017-11-27 18:53:51Z. 
info: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[39] 
    Writing data to file '/home/www-data/config/key-71e2c23f-448b-49c9-984f-3c8d7227c904.xml'. 
fail: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[24] 
    An exception occurred while processing the key element '<key id="71e2c23f-448b-49c9-984f-3c8d7227c904" version="1" />'. 
System.Security.Cryptography.CryptographicException: Unable to retrieve the decryption key. 
    at System.Security.Cryptography.Xml.EncryptedXml.GetDecryptionKey(EncryptedData encryptedData, String symmetricAlgorithmUri) 
    at System.Security.Cryptography.Xml.EncryptedXml.DecryptDocument() 
    at Microsoft.AspNetCore.DataProtection.XmlEncryption.EncryptedXmlDecryptor.Decrypt(XElement encryptedElement) 
    at Microsoft.AspNetCore.DataProtection.XmlEncryption.XmlEncryptionExtensions.DecryptElement(XElement element, IActivator activator) 
    at Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager.Microsoft.AspNetCore.DataProtection.KeyManagement.Internal.IInternalXmlKeyManager.DeserializeDescriptorFromKeyElement(XElement keyElement) 
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver[12] 
    Key {71e2c23f-448b-49c9-984f-3c8d7227c904} is ineligible to be the default key because its CreateEncryptor method failed. 
System.Security.Cryptography.CryptographicException: Unable to retrieve the decryption key. 
    at System.Security.Cryptography.Xml.EncryptedXml.GetDecryptionKey(EncryptedData encryptedData, String symmetricAlgorithmUri) 
    at System.Security.Cryptography.Xml.EncryptedXml.DecryptDocument() 
    at Microsoft.AspNetCore.DataProtection.XmlEncryption.EncryptedXmlDecryptor.Decrypt(XElement encryptedElement) 
    at Microsoft.AspNetCore.DataProtection.XmlEncryption.XmlEncryptionExtensions.DecryptElement(XElement element, IActivator activator) 
    at Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager.Microsoft.AspNetCore.DataProtection.KeyManagement.Internal.IInternalXmlKeyManager.DeserializeDescriptorFromKeyElement(XElement keyElement) 
    at Microsoft.AspNetCore.DataProtection.KeyManagement.DeferredKey.<>c__DisplayClass1_0.<GetLazyDescriptorDelegate>b__0() 
    at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) 
    at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) 
    at System.Lazy`1.CreateValue() 
    at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyBase.get_Descriptor() 
    at Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.CngGcmAuthenticatedEncryptorFactory.CreateEncryptorInstance(IKey key) 
    at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyBase.CreateEncryptor() 
    at Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver.CanCreateAuthenticatedEncryptor(IKey key) 
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver[12] 
    Key {71e2c23f-448b-49c9-984f-3c8d7227c904} is ineligible to be the default key because its CreateEncryptor method failed. 
System.Security.Cryptography.CryptographicException: Unable to retrieve the decryption key. 
    at System.Security.Cryptography.Xml.EncryptedXml.GetDecryptionKey(EncryptedData encryptedData, String symmetricAlgorithmUri) 
    at System.Security.Cryptography.Xml.EncryptedXml.DecryptDocument() 
    at Microsoft.AspNetCore.DataProtection.XmlEncryption.EncryptedXmlDecryptor.Decrypt(XElement encryptedElement) 
    at Microsoft.AspNetCore.DataProtection.XmlEncryption.XmlEncryptionExtensions.DecryptElement(XElement element, IActivator activator) 
    at Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager.Microsoft.AspNetCore.DataProtection.KeyManagement.Internal.IInternalXmlKeyManager.DeserializeDescriptorFromKeyElement(XElement keyElement) 
    at Microsoft.AspNetCore.DataProtection.KeyManagement.DeferredKey.<>c__DisplayClass1_0.<GetLazyDescriptorDelegate>b__0() 
    at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) 
--- End of stack trace from previous location where exception was thrown --- 

Vì vậy, chìa khóa được tạo và mã hóa tốt. Nhưng có vẻ như rằng bằng cách nào đó nó không biết làm thế nào để giải mã nó như nó nói trong các lỗi:

System.Security.Cryptography.CryptographicException: 
    Unable to retrieve the decryption key. 

Nếu tôi hiểu nó một cách chính xác, nó sử dụng giấy chứng nhận tôi cung cấp để mã hóa chìa khóa. Nhưng có vẻ như nó không sử dụng cùng một chứng nhận giải mã vì một lý do nào đó (Có vẻ như nó cố gắng truy xuất nó từ một nơi khác [lưu trữ?]).

Điều gì đang xảy ra?

Tôi cũng đã cố gắng để đưa các CERT vào CA cửa hàng như đã mô tả ở đây: Create a Self-Signed Certificate and trust it on Ubuntu Linux

Sau đó, tôi đã cố gắng để tìm thấy chúng trở lại từ mã như thế này:

var cert = new CertificateResolver().ResolveCertificate(CertThumbprint); 

Nhưng nó đã không làm việc (nó không thể tìm thấy nó).

Tôi cũng đã cố gắng cố gắng để tìm thấy chúng bằng cách sử dụng phương pháp sau đây:

var store = new X509Store(StoreName.CertificateAuthority, 
    StoreLocation.LocalMachine); 

store.Open(OpenFlags.ReadOnly); 

var collection = store.Certificates.Find(
    X509FindType.FindByThumbprint, 
    CertThumbprint, false); 

store.Close(); 

var x509Cert = collection.Count > 0 ? collection[0] : null; 

Nhưng nó đã không làm việc không.

Vậy điều gì là đúng?

Trả lời

2

Vì lý do chỉ được biết đến với Microsoft, các ProtectKeysWithCertificate ghi đè mà chấp nhận giấy chứng nhận thực tế (file PFX hoặc X509Certificate2 đối tượng) chỉ có thể mã hóa dữ liệu DPAPI. Giải mã chỉ hoạt động nếu cùng một chứng chỉ được lưu trữ trong kho lưu trữ chứng chỉ của máy, điều này làm cho các ghi đè đó tương đối vô nghĩa.

Tại sao? Ai biết. Nó không phải là thông tin đặc biệt hữu ích, nhưng nó bị bỏ qua một cách mơ hồ here như là một "hạn chế của khuôn khổ cơ bản".

Trong this thảo luận liên quan (chỉ đóng mà không có bất kỳ sự hỗ trợ hoặc tham gia nào của Microsoft), người dùng chia sẻ các lớp tùy chỉnh kiên trì không bị ảnh hưởng "hạn chế" bí ẩn này. GitHub repo liên kết dưới đây, tôi biết đây là một câu hỏi cũ, nhưng có lẽ nó sẽ giúp đỡ người khác.

https://github.com/tillig/DataProtection

Cập nhật: Điều này sẽ được cố định trong Core sắp tới 2.1.0 phát hành: https://github.com/aspnet/Home/issues/2759#issuecomment-367157751

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