ASP.NET Core Data Protection system を使用して、アプリケーションAでデータを暗号化し、アプリケーションBでデータを復号化します。
暗号化と復号化は開発マシンで実行すると機能しますが、アプリケーションBを本番マシンに移動すると、 IDataProtector.Unprotect メソッドが例外をスローするため、復号化できなくなります。
System.InvalidOperationException:キーリングに有効なデフォルトの保護キーが含まれていません。キーの自動生成が無効になっているため、データ保護システムは新しいキーを作成できません。
以下は、アプリケーションBで復号化を構成するために使用しているコードです。
_sKeysPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Keys");
services.AddDataProtection()
.SetApplicationName("My Application") // Application A sets this same name
.PersistKeysToFileSystem(new DirectoryInfo(sKeysPath))
.ProtectKeysWithCertificate("634D3F23...")
//.ProtectKeysWithCertificate(x509Certificate2) // I've tried using an X509 certificate parameter but it gives the same result as providing the thumbprint of the one in the certificate store
.DisableAutomaticKeyGeneration(); // Application A is the master key generator so do not generate keys
_
実稼働マシンには、Windows証明書ストアにインストールされた同じキーフォルダー(.pfxおよび.xmlファイル)と同じキーが含まれています。
私が理解しているように、証明書ファイルをデータ保護システムに提供することにより、任意のマシンで動作し、特定のマシンまたはWindowsユーザーにバインドされないはずです。その仮定は間違っていますか、または復号化の実行方法に問題がありますか?
より詳細なログメッセージを次に示します。
2018-06-13 16:32:32.6750 | TRACE | Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector | 5 | Performing unprotect operation to key {846541...} with purposes ('My Application', 'My Purpose').
_
2018-06-13 16:32:32.6750 | DEBUG | Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository | 37 | Reading data from file 'C:\inetpub\wwwroot\My Website\Keys\key-846541....xml'.
__
2018-06-13 16:32:32.6750 | DEBUG | Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager | 18 | Found key {846541...}.
__
2018-06-13 16:32:32.6750 | DEBUG | Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver | 13 | Considering key {846541...} with expiration date 2038-01-18 20:54:13Z as default key.
__
2018-06-13 16:32:32.6750 | DEBUG | Microsoft.AspNetCore.DataProtection.TypeForwardingActivator | Forwarded activator type request from Microsoft.AspNetCore.DataProtection.XmlEncryption.EncryptedXmlDecryptor, Microsoft.AspNetCore.DataProtection, Version=2.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 to Microsoft.AspNetCore.DataProtection.XmlEncryption.EncryptedXmlDecryptor, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60
__
2018-06-13 16:32:32.7051 | ERROR | Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager | 24 | An exception occurred while processing the key element '<key id="846541..." version="1" />'. Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Keyset does not exist
__
2018-06-13 16:32:32.7051 | TRACE | Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager | 25 | An exception occurred while processing the key element '<key id="846541..." version="1" />...
__
2018-06-13 16:32:32.7051 | WARN | Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver | 12 | Key {846541...} is ineligible to be the default key because its CreateEncryptor method failed. Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Keyset does not exist
__
2018-06-13 16:32:32.7051 | DEBUG | Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver | 14 | Key {846541...} is no longer under consideration as default key because it is expired, revoked, or cannot be deciphered.
__
2018-06-13 16:32:32.7051 | DEBUG | Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver | 53 | Repository contains no viable default key. Caller should generate a key with immediate activation.
__
2018-06-13 16:32:32.7051 | DEBUG | Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider | 57 | Policy resolution states that a new key should be added to the key ring.
__
2018-06-13 16:32:32.7051 | ERROR | Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider | 49 | The key ring does not contain a valid default key, and the key manager is configured with auto-generation of keys disabled.
__
2018-06-13 16:32:32.7051 | ERROR | Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider | 48 | An error occurred while reading the key ring. System.InvalidOperationException: The key ring does not contain a valid default protection key. The data protection system cannot create a new key because auto-generation of keys is disabled.
_
Joe Audetteの提案のおかげで、詳細なログをチェックアウトし、解決策があった この回答 を指すより具体的なエラーを見つけました。
問題は、Windows証明書ストア内の証明書のアクセス許可に、読み取りアクセスを許可するように設定されたIIS_IUSRSグループがないことです(証明書を右クリック->すべてのタスク->秘密キーの管理...)。代わりにVisual Studioのユーザーコンテキストで実行されていたため、この問題は開発マシンでは発生しませんでした。
証明書が自己署名されたため、2.2アプリでも同様の問題が発生しました。とりあえず、証明書を検証しない独自のCertificateResolver
クラスとProtectKeysWithCertificate
メソッドを実装することで回避しました。しかし、私にとって本当の解決策は、有効な証明書を使用することです。
これに遭遇した人のためのちょっとした追加情報。
同様の問題がありましたが、同じCookieを共有しようとした2つの異なるASP.NET Coreアプリケーション間で発生しました。 Microsoft.AspNetCore.Authentication.Cookies
(2.1.2対2.2.0)のマイナーバージョンの不一致により、アプリケーションの1つが他のバージョンで作成されたキーを見つけることができませんでした。
エラーメッセージが完全に一致するため、ここにこの回答を追加します(上記の質問には回答していませんが)。