2017-04-11 2 views
2

외부 서비스와 대화하기 위해 JWT 토큰을 만들어야하는 WebJob이 있습니다. 나는 내 로컬 컴퓨터에 WebJob를 실행할 때 다음 코드는 작동 :CryptographicException을받지 않고 Azure WebJob에서 JWT 토큰에 서명하려면 어떻게해야합니까?

Microsoft.Azure.WebJobs.Host 그러나

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를 배포, 나는 다음과 같은 예외를 얻을 .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 실제로 푸른에 액세스 할 수없는 어딘가에 인증서를 저장하려고 할 수 있다는 것을 나타납니다. 저장하지 않아도됩니다. 메모리에있는 인증서에 액세스하거나 작동하기 쉬운 인증서의 다른 종류로 변환하는 더 좋은 방법이 있다면 좋습니다.

업데이트 2

이 문제는 here을 언급 한 바와 같이 사용자 프로파일을로드하지 설정 하늘빛 웹 앱 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 웹 응용 프로그램이 공유 환경에서 실행되는 경우 보안 관점에서 생각하는 것이 얼마나 나쁜지 생각하기 시작했습니다. 무료 및 공유 티어에 해당합니다. 물론, 내 VM은 공유 계층에있었습니다. 기본 계층으로 확장하면이 문제가 해결됩니다.

관련 문제