2017-05-15 18 views
2

의 알고리즘 그룹이 있고, 캔트 찾기 솔루션을해야합니다. 푸시 알림 api에 대한 사과의 새로운 승인 방법입니다.키 나는 다음과 같은 문제가 ECDSA

Apple이 개인 키를 제공합니다.이 개인 키는 C# CngKey 개체를 만드는 데 사용되며 데이터를 서명하는 데 사용됩니다.

CngKey key = CngKey.Import(
     Convert.FromBase64String(privateKey), 
     CngKeyBlobFormat.Pkcs8PrivateBlob); 

using (ECDsaCng dsa = new ECDsaCng(key)) 
{ 
    dsa.HashAlgorithm = CngAlgorithm.Sha256; 
    var unsignedJwtData = 
     Url.Base64urlEncode(Encoding.UTF8.GetBytes(header)) + "." + Url.Base64urlEncode(Encoding.UTF8.GetBytes(payload)); 
    var signature = 
     dsa.SignData(Encoding.UTF8.GetBytes(unsignedJwtData)); 
    return unsignedJwtData + "." + Url.Base64urlEncode(signature); 
} 

결과는 서명 된 토큰입니다.이 토큰은 API를 사용하고 푸시 알림을 보내는 동안 인증 헤더로 사용됩니다.

그것은 내 dev에 컴퓨터에서 잘 작동하지만 때 나는이 코드가 난 다음 얻을 실행하면, 윈도우 서버에 배포 :

System.ArgumentException: Keys used with the ECDsaCng algorithm must have an algorithm group of ECDsa. 
Parameter name: key 
    at System.Security.Cryptography.ECDsaCng..ctor(CngKey key) 
    at OTTCommon.Encryption.ECDSA.SignES256(String privateKey, String header, String payload, ILog log) 

나는 해결책을 찾을 수 없습니다, 그것은 윈도우 키 저장 또는 뭔가 뭔가 그런 ....

어떻게해야합니까?

답변

4

이 문제는 .NET Framework 4.6.2에서 수정되었으므로 가장 쉬운 방법은 서버를 업그레이드하는 것입니다.

NIST P-256, NIST P-384 및 NIST P-521에서 작동하는 해결 방법은 blob 내보내기에서 dwMagic 값을 변경하는 것입니다. (dwMagic 값이 같은 방식으로 정렬되지 않기 때문에 Windows 10 일반 ECC에서는 작동하지 않습니다.

byte[] blob = key.Export(CngKeyBlobFormat.EccPrivateBlob); 
key.Dispose(); 

BCRYPT_ECCKEY_BLOB 구조에서 dwMagic 값이 Blob지도의 처음 4 바이트.

BCRYPT_ECDH_PRIVATE_P256_MAGIC은 "ECK2"(Elliptic Curve Key-exchange 2)의 리틀 엔디안 표현 인 값이 0x324B4345입니다. BCRYPT_ECDSA_PRIVATE_P256_MAGIC의 값은 0x32534345이며 "ECS2"(Elliptic Curve Signing 2)의 리틀 엔디안 표현입니다.

// Change it from Key-exchange (ECDH) to Signing (ECDSA) 
blob[1] = 0x53; 

key = CngKey.Import(blob, CngKeyBlobFormat.EccPrivateBlob); 

이제는 ECDSA 키라는 것을 알았습니다. 모든 것이 행복합니다.

+2

대단히 빠른 답변을드립니다! 너무 빨리 그것을 기대하지 않았다 :) 어쨌든, 내 dev에 컴퓨터에 4.6.2 버전이 있고 서버에 4.6.1이있다. 서버를 4.6.2 net 버전으로 업그레이드하고 문제가 해결되는지 확인합니다. 정보처럼, 해결 방법이 내 컴퓨터 (Win7)에서 작동하지 않습니다. "요청한 작업이 지원되지 않습니다."라는 메시지가 나타납니다. 예외. – MIslavMIslav

+1

Windows 서버 2012r2 .NET 버전을 4.6.2로 업그레이드 할 때 작동했습니다! 문제가 해결되었습니다. 대단히 감사합니다! – MIslavMIslav