2017-10-30 8 views
1

Jose.JWT.encode(payload, secretKey, JwsAlgorithm.ES256, header) (https://github.com/dvsekhvalnov/jose-jwt 참조)을 사용하여 Apple의 새 토큰 기반 APN 시스템과 함께 사용하는 JWT 토큰을 생성하려고합니다.가져 오기 메서드를 사용하여 .p8 파일에서 CngKey를 만드는 동안 "인코딩 또는 디코딩 작업 중에 오류가 발생했습니다."오류가 발생합니다.

JWT 인코딩 방법은 secretKey가 CngKey 형식이어야합니다.

 var privateKeyContent = System.IO.File.ReadAllText(authKeyPath); 
     var privateKey = privateKeyContent.Split('\n')[1]; 

     //convert the private key to CngKey object and generate JWT 

     var secretKeyFile = Convert.FromBase64String(privateKey); 
     var secretKey = CngKey.Import(secretKeyFile, CngKeyBlobFormat.Pkcs8PrivateBlob); 

그러나, 마지막 줄에 다음과 같은 오류가 발생 : 는 여기 CngKey 객체에 애플에서 .p8 파일을 변환 내 코드입니다. 그에 대해 별도의 오류가 (필자는 BLOB 유형을 변경할 때 나타납니다) 거기로

System.Security.Cryptography.CryptographicException was unhandled by user code 
    HResult=-2146885630 
    Message=An error occurred during encode or decode operation. 

    Source=System.Core 
    StackTrace: 
     at System.Security.Cryptography.NCryptNative.ImportKey(SafeNCryptProviderHandle provider, Byte[] keyBlob, String format) 
     at System.Security.Cryptography.CngKey.Import(Byte[] keyBlob, String curveName, CngKeyBlobFormat format, CngProvider provider) 
     at System.Security.Cryptography.CngKey.Import(Byte[] keyBlob, CngKeyBlobFormat format) 
     at tokenauthapi.App_Start.TokenInitSendMessage.<send>d__0.MoveNext() in C:\token-push-prototype\token-auth-api\token-auth-api\App_Start\TokenInitSendMessage.cs:line 31 
    InnerException: 

는 입력이 잘못된 형식이 아닙니다.

이 코드는 .NET WebApi 버전 4.6에서 실행됩니다.

나는 높거나 낮게 검색했지만이 오류의 의미를 해독하지 못했습니다. 어떤 도움이라도 대단히 감사하겠습니다. 고맙습니다.

답변

1

사용중인 .p8 파일이 어떤 이유로 그 중간에 개행 문자가 있습니다. 메모장이 그것을 추가했을 가능성이 있습니다 (그리고 그것을 저장 했습니까?). 개인 키를 얻기 위해 개행으로 나누었으므로 키를 자르고있었습니다. 새 라인을 제거한 후에는 정상적으로 작동했습니다.

error occurred during encode or decode operation 오류가 발생하면 .p8 (또는 기타) 개인 키의 형식이 잘못되어 올바른 길이인지 확인하십시오.

0

같은 문제가 발생했습니다. 나는 이것을 사용한다 :

var privateKey = privateKeyContent.Split('\n')[1]; 

나는 애플사로부터 다운로드 한 토큰 파일을 분석한다. 파일에 \n이 더 있음을 발견했습니다. 이 형식이 다른 곳이나 사과가 변경된 곳인지 잘 모르겠습니다. 다음 토큰을로드 할 때 다음 코드를 사용합니다. 실제로이 토큰 문자열을 직접 사용할 수 있습니다.

var privateKeyContent = System.IO.File.ReadAllText(authKeyPath); 
var privateKeyList = privateKeyContent.Split('\n'); 
int upperIndex = privateKeyList.Length; 
StringBuilder sb = new StringBuilder(); 
for(int i= 1; i< upperIndex - 1; i++) 
{ 
    sb.Append(privateKeyList[i]); 
    Debug.WriteLine(privateKeyList[i]); 
}