1

私は、UbuntuにX509Certificate2をロードしたり、Microsoftが提供するDebianベースのドッカーイメージを読み込まないようにするバグを発見しました。これは私がこれらのプラットフォーム上で自分のWeb APIでJwtAuthenticationを初期化することができないことを意味し、私は助けを探しています:Ubuntu/Docker上のASP.NET Core Web APIで、以下に説明するバグを受けて、どのようにユーザーが認証されますか?

  1. あなたが成功したLinux上でJwtAuthenticationを使用していますか?
  2. もしそうなら、JwtBearerOptionsのX509Certificateをどのように初期化していますか?
  3. 私がやっていることに問題があるか、回避策または解決策を提案できますか?

私はcorefxチームと問題を記録している、あなたは十分な議論hereを見ることができますが、以下の主な問題の説明である:私は、Web APIは、ドッキングウィンドウで実行している


コンテナ。コンテナが提供1.1.0パッケージから構築されています。

FROM microsoft/aspnetcore:1.1.0 

とWeb APIのバイナリはにコピーされているAPIは正常に動作し、予想通り、私は認証をオンにするまでのデータを返し、それがX509SecurityKeyを必要とし、その時点で。 TokenValidationParameters.IssuerSigningKeyの値を設定します。

Unhandled Exception: System.Exception: Failed to extract the Token Signing certificate from the Federation metadata. ---> 
    Interop+Crypto+OpenSslCryptographicException: error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error 
     at Internal.Cryptography.Pal.CertificatePal.FromBlob(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags) 
     at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(Byte[] data) 
     at Mercury.Shared.Rest.Authentication.AdfsFederationMetadata.GetSigningCertificate() 

X509Certificate2が初期化されているから、文字列値である:

MIIC4jCCAcqgAwIBAgIQHWt3kGySgJxPtsalC0EoKzANBgkqhkiG9w0BAQsFADAtMSswKQYDVQQDEyJBREZTIFNpZ25pbmcgLSBzdHMuYWxsYW5ncmF5LmNvLnphMB4XDTE2MDkwNzA5MDQyM1oXDTE3MDkwNzA5MDQyM1owLTErMCkGA1UEAxMiQURGUyBTaWduaW5nIC0gc3RzLmFsbGFuZ3JheS5jby56YTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANdq9BEuBRPsTdpngeFyXbfH5lBg5WyENQW0qz2FtDw3AvZhiPdFyvTPZIeZDc4vhg+gPuG8pCxhFa6hPqNIwnLSVuyhUi4/CtZrLghF2wVVcyriijvirzdVp2m56nO31NB5HXbSerTmey1gJsgumr+MiaM2CEI9z5ctwAp66jqM9jVv7kzqIwB33irSck+X97jUa9XVa0/0QPBdrSVUR0i4rmfZ9orRdTKC3IA13bD9duk2Kc9V7t8t/woo80Kbbb3ZseYk5N8AI+7RRw9+oSAm8zZQzBYkNkAMeI1mto1faXsm9Aea4HXbyCbvVOx/JGj5Ki7YK/BtzWAyCgRu0TkCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAd9rdJ1V9te8njMHiEuvr1DLVUBt2YdpZ8qGFC2rWDKeEW8iARrMfbtrlQovvE1radxoZ2gWR1AaaoEqzmLvF9fEAZ7xjR2P2UlT+ZgntfMn/c+3j7gWnfGNHIjosaYiyF72q4k6bgOx1TV8X08kD2AMBH27utXeeUQTZTd0bUWaWpr76NrDB95k4P6d0t5bkYsguiQjV+2t5/dSvrbTPVbXQmWGyC53IS2OI37AI2bIaeCCDkRHDoxu+L/DtgH8N60k2CLfa+pf0/cxQCR39p4Z+tquVKfYgJIsdZLD6bbrqK9VdpSR2vyUcDLMTGnO0tuDuzBd/xdhJ0GKbnBv3+g== 

string certValue = certificate.Value; 
    byte[] byteCert = Encoding.ASCII.GetBytes(certValue); 
    return new X509Certificate2(byteCert); 

OpenSslCryptographicExceptionをスロー:それは文字列値からX509Certificate2を初期化しようとするときに例外をスロー

同じコードがWindowsで問題なく実行され、同じ文字列から証明書が作成されます。

編集:注意私が最初にドッカイメージを実行して、この問題に遭遇しながら、その後のテストが、それはまた、ここでの問題は何があるということであるUbuntuの14.04 + .NETのコア1.1

+0

コンストラクタに渡す前に(Base64から)デコードしようとしましたか? – Salem

+0

素敵な仕事セーラム、それはやった!新しいX509Certificate2(byteCert)を呼び出す前に、自分のコードを 'var byteCert = Encoding.ASCII.GetBytes(certString);'から 'var byteCert = Convert.FromBase64String(certString);'に変更したところ、Windows、Ubuntu、ドッカーこの効果の答えを入れてください、私はそれを受け入れます。 – Peter

答えて

0

を使用して発生したことを示していることコンストラクタに渡されるのは、キーのbase64表現のバイトであり、キー自体のバイトではありません。

このコードがWindowsで動作する場合は、この問題を参照している.netコアgithubに問題を作成することをお勧めします。

+0

ありがとう、これは私の問題を解決しました。 Linux実装(opensslライブラリをラップする)とWindowsの実装は、WindowsではBase64でエンコードされたバイトまたはデコードされたバージョンのどちらかを扱う場所が少し不一致であることに注意するだけです.Linuxでは、ここに示すようにデコードする必要があります。私はこれを私の[Github issue](https://github.com/dotnet/corefx/issues/16029)のcorefxチームの注目に持ってきました。 – Peter

関連する問題