2017-05-15 8 views
2

のアルゴリズム・グループを持っている必要があり、私は次のような問題があり、解決策を見つけるカント:APN(アップルのプッシュ通知)を消費しながら鍵ECDSA

をAPIは、私は、トークン化された認証を実装しました。 Appleのプッシュ通知apiに対する承認の新しい方法です。

Appleは秘密鍵を提供しています。これは私がC#KeyNGオブジェクトを作成するために使用します。私は秘密鍵を使ってデータに署名します。

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のマシン上でうまく動作しますが、私は、Windows Serverに展開するときに、このコードは、私は次の取得実行時に、:

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 Generic ECCでは機能しません)。

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

BCRYPT_ECCKEY_BLOB構造でdwMagic値にこのブロブマップの最初の4バイト。

BCRYPT_ECDH_PRIVATE_P256_MAGICは、 "ECK2"(楕円曲線キー交換2)のリトルエンディアン表現である値0x324B4345を有する。 BCRYPT_ECDSA_PRIVATE_P256_MAGICの値は0x32534345です。これは「ECS2」(楕円曲線符号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ネットバージョンにアップグレードし、問題が解決するかどうかを確認します。情報のように、私のマシン(Win7)で回避策が動作しない場合、「要求された操作はサポートされていません」と表示されます。例外。 – MIslavMIslav

+1

これは、Windowsサーバー2012r2 .NETバージョンを4.6.2にアップグレードしたときに機能しました!問題が解決しました、ありがとうございます! – MIslavMIslav

関連する問題