2017-04-11 8 views
2

私は外部サービスと話すためにJWTトークンを作成する必要があるWebJobを持っています。私は私のローカルマシン上WebJobを実行すると、次のコードは動作します:CryptographicExceptionを取得せずにAzure WebJobでJWTトークンに署名するにはどうすればよいですか?

public static string SignES256(byte[] p8Certificate, object header, object payload) 
{ 
    var headerString = JsonConvert.SerializeObject(header); 
    var payloadString = JsonConvert.SerializeObject(payload); 

    CngKey key = CngKey.Import(p8Certificate, CngKeyBlobFormat.Pkcs8PrivateBlob); 
    using (ECDsaCng dsa = new ECDsaCng(key)) 
    { 
     dsa.HashAlgorithm = CngAlgorithm.Sha256; 
     var unsignedJwtData = Base64UrlEncoder.Encode(Encoding.UTF8.GetBytes(headerString)) + "." + Base64UrlEncoder.Encode(Encoding.UTF8.GetBytes(payloadString)); 
     var signature = dsa.SignData(Encoding.UTF8.GetBytes(unsignedJwtData)); 
     return unsignedJwtData + "." + Base64UrlEncoder.Encode(signature); 
    } 
} 

しかし、私はアズールに私のWebJobを展開するとき、私は次の例外を取得:

Microsoft.Azure.WebJobs.Hostを.FunctionInvocationException:関数の実行中に例外が発生しました:NotificationFunctions.QueueOperation ---> System.Security.Cryptography.CryptographicException:指定されたファイルが見つかりません。 System.Security.Cryptography.CngKey.ImportでSystem.Security.Cryptography.NCryptNative.ImportKey(SafeNCryptProviderHandleプロバイダ、バイト[] keyBlob、文字列形式)(バイト[] keyBlob、CngKeyBlobFormatフォーマット、CngProviderプロバイダ)で

それは指定されたファイルを見つけることができないと言いますが、私が渡しているパラメータはファイルの場所を見ていない、彼らはメモリ内にあります。私が集めたことから、CngKey.Importメソッドを使用できるようにするために必要な暗号化設定があるかもしれませんが、Azureポータルでこれに関する設定を見つけることができません。

私もJwtSecurityTokenHandlerを使用しようとしましたが、使用する必要があるES256ハッシュアルゴリズムを処理していないようです(JwtAlgorithmsクラスでECDSA_SHA256として参照されていますが)。

ご意見をお寄せください。

UPDATEは

CngKey.Importが実際のAzure上でアクセス可能ではないどこかに証明書を保存しようとすることができることが表示されます。私はそれが格納されている必要はありませんので、メモリ内の証明書にアクセスするより良い方法があれば、それは動作するように使いやすくなる別の種類の証明書に変換してください。

UPDATE 2

この問題はhereが述べたように、ユーザープロファイルをロードしない設定AzureのWebアプリケーションIISに関連している可能性があります。 Azureポータルアプリの設定でWEBSITE_LOAD_USER_PROFILE = 1を設定してこれを有効にしました。 AzureのWebJobとWeb Appの両方でコードを実行しているときにこのアップデートを試しましたが、同じエラーが表示されます。

+0

あなたのマシンでローカルに実行しようとすると同じエラーが表示されますか? – Niels

+0

いいえ、WebJobが期待どおりに動作するため、ローカルで実行しているマシン上でローカルに例外がスローされません。 – lehn0058

+0

証明書をどこでインポートしましたか?私はAzureを意味します。 – Thomas

答えて

1

私は、CngKey.Importメソッドが実際に行っていたものを見て、逆コンパイラを使用しました。私が使用している証明書を「Microsoft Software Key Storage Provider」に挿入しようとしているようです。私は実際にこれを必要としません、証明書の価値を読む必要がありますが、それは可能であるように見えません。

証明書がマシンのどこかにあるストアに挿入されていることがわかったら、Azure Web Appが共有環境で実行されていた場合、セキュリティの観点から考えるとどれほど悪いと思い始めましたフリー層とシェアード層では同じです。確かに、私のVMは共有層にあった。基本層までスケールアップしてこの問題を解決しました。

関連する問題