web-dev-qa-db-ja.com

ASP.NET Core 2.1のデータ保護は1台のマシンでのみ機能します

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._

10
Coder6841

Joe Audetteの提案のおかげで、詳細なログをチェックアウトし、解決策があった この回答 を指すより具体的なエラーを見つけました。

問題は、Windows証明書ストア内の証明書のアクセス許可に、読み取りアクセスを許可するように設定されたIIS_IUSRSグループがないことです(証明書を右クリック->すべてのタスク->秘密キーの管理...)。代わりにVisual Studioのユーザーコンテキストで実行されていたため、この問題は開発マシンでは発生しませんでした。

3
Coder6841

証明書が自己署名されたため、2.2アプリでも同様の問題が発生しました。とりあえず、証明書を検証しない独自のCertificateResolverクラスとProtectKeysWithCertificateメソッドを実装することで回避しました。しかし、私にとって本当の解決策は、有効な証明書を使用することです。

これに遭遇した人のためのちょっとした追加情報。

0
Gup3rSuR4c

同様の問題がありましたが、同じCookieを共有しようとした2つの異なるASP.NET Coreアプリケーション間で発生しました。 Microsoft.AspNetCore.Authentication.Cookies(2.1.2対2.2.0)のマイナーバージョンの不一致により、アプリケーションの1つが他のバージョンで作成されたキーを見つけることができませんでした。

エラーメッセージが完全に一致するため、ここにこの回答を追加します(上記の質問には回答していませんが)。

0
tejas