X509証明書をcyptptおよびdecyptメッセージに作成すると、エラー情報が表示され、この問題を修正できませんでした。誰かがこのバグを解決したことがありますか?ありがとう。
説明:現在のWebリクエストの実行中に未処理の例外が発生しました。エラーの詳細とコードのどこで発生したかについては、スタックトレースを確認してください。
例外の詳細:
System.Security.Cryptography.CryptographicException:キーセットが存在しません。
ソースエラー:
53行目:(RSACryptoServiceProvider rsaProviderDecrypt =(RSACryptoServiceProvider)cerDecrypt.PublicKey.Key)を使用54行目:
{行55:plainHashBytes = rsaProviderDecrypt.Decrypt(encryptedHashBytes、false); 56行目:
rsaProviderDecrypt.Clear();行57:
rsaProviderDecrypt.Dispose();ソースファイル:E:\ PayUSite\PayMvcApp\Controllers\HashMessageController.cs行:55
スタックトレース:
[CryptographicException:キーセットは存在しません。 ]
System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)+41
System.Security.Cryptography.RSACryptoServiceProvider.DecryptKey(SafeKeyHandle pKeyContext、Byte [] pbEncryptedKey、Int32 cbEncryptedKey、Boolean fOAEP、ObjectHandleOnStack ohRetDecryptedKey)+0
System.Security.Cryptography.RSACryptoServiceProvider.Decrypt(Byte [] rgb、Boolean fOAEP)+579
ソースコード:
string docFile = Server.MapPath("~/docx/DirectAccess_StepByStep.doc");
HashAlgorithm hash = HashAlgorithm.Create("SHA1");
byte[] hashedBytes;
using (FileStream fs = new FileStream(docFile, FileMode.Open))
{
//compute message hash value
hashedBytes = hash.ComputeHash(fs);
hash.Dispose();
fs.Close();
}
string hashedString = Convert.ToBase64String(hashedBytes);
//encrypt message digest
string priKeyFile = Server.MapPath("~/certificate/WosMiddle.pfx");
X509Certificate2 certEncrypt = new X509Certificate2(priKeyFile, "123456");
byte[] encryptedHashBytes;
using (RSACryptoServiceProvider rsaProviderEncrypt = (RSACryptoServiceProvider)certEncrypt.PrivateKey)
{
encryptedHashBytes = rsaProviderEncrypt.Encrypt(hashedBytes, false);
rsaProviderEncrypt.Dispose();
}
//decrypt message digest
string pubKeyFile = Server.MapPath("~/certificate/WosMiddle-pubkey.cer");
X509Certificate2 cerDecrypt = new X509Certificate2(pubKeyFile);
byte[] plainHashBytes;
using (RSACryptoServiceProvider rsaProviderDecrypt = (RSACryptoServiceProvider)cerDecrypt.PublicKey.Key)
{
//***will throw error message here...***
plainHashBytes = rsaProviderDecrypt.Decrypt(encryptedHashBytes, false);
rsaProviderDecrypt.Dispose();
}
//verify message whether was modified
string docFile2 = Server.MapPath("~/docx/DirectAccess_StepByStep.doc");
HashAlgorithm hash2 = HashAlgorithm.Create("SHA1");
byte[] hashedBytes2;
using (FileStream fs2 = new FileStream(docFile2, FileMode.Open))
{
//compute message hash value
hashedBytes2 = hash.ComputeHash(fs2);
fs2.Close();
}
//compare hash value
bool isEqual = plainHashBytes.SequenceEqual(hashedBytes2);
この質問は古いですが、Encrypt
とDecrypt
を使い続けながら解決策を探している人のために、このエラーを解決する方法を以下に示します。
基本は、.pfx
ファイルをダブルクリックしてストアを選択することにより、証明書が間違った方法でインストールされていることです。
1。証明書をダブルクリックします。
2。ウィザードが開き、次のボタンをクリックします。
。ウィザードは証明書の場所を表示し、次のボタンをクリックします。
4。パスワードを入力して、[次へ]をクリックします。
5。ストアを選択して、[次へ]をクリックします。
6。ウィザードに証明書情報が表示されます。Finishボタンをクリックします
7。成功ダイアログが表示されます:
1。 Microsoft管理コンソール(mmc.exe)を実行します。
2。空のMMCインスタンスは以下を示しました。
。 [ファイル]-> [スナップインの追加と削除]をクリックします...
4。クリックして証明書スナップインを選択Addボタン:
5。を選択コンピュータアカウントをクリックして、Nextボタンをクリックします。
6。選択Local computerをクリックしてFinishボタンをクリックします。
7。証明書スナップインが追加されました。[〜#〜] ok [〜#〜]ボタンをクリックします。
8。パーソナルストアを選択し、右クリックしてImportを選択します。
9。証明書を参照して、[次へ]をクリックします。
10。パスワードを入力し、Nextボタンをクリックします。
11。証明書ストアを自動的に選択します。
12。証明書情報には以下が表示されます。
13。成功ダイアログメッセージが表示されます:
14。 MMConsoleを更新して証明書を表示します。
15。証明書を右クリックし、Manage Private Keys ...をクリックします。
16。プールIDまたはIISユーザーを追加します。私の場合、IIS_IUSRSを追加しました。
17。ユーザーが追加されました。[〜#〜] ok [〜#〜]ボタンをクリックします。
アプリケーションは、次のフォルダーパスに書き込もうとしている可能性があります。C:\ Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys
アプリケーションが偽装またはIUSR_MACHINENAMEユーザーを使用している場合は、MachineKeysフォルダーのセキュリティを構成し、ユーザーに読み取りと実行、フォルダーの内容の一覧表示、読み取り、書き込みを許可します。それでもうまくいかない場合は、Everyoneユーザーに同じ権限を与えてみてください。
EncryptおよびDecryptを使用する場合、暗号化には公開キー、復号化には秘密キーが必要だと思います。したがって、秘密鍵なしで復号化しようとすると失敗し、例外が発生します。
署名の作成には SignData メソッドを、検証には VerifyData メソッドを使用する必要があります。
私は同じ問題に遭遇しました。このメッセージは理想的ではなく、私の場合、ユーザーには秘密鍵にアクセスする権限がありませんでした。次の手順を使用してこれを修正できます。
SAML応答に署名しようとしたときに、証明書からPrivateKeyをsignedXmlElementのSigningKeyにロードしていないときに、このエラーに遭遇しました。
signedElement.SigningKey = myCertificate.PrivateKey;
OPと同じエラーを受け取りました: "System.Security.Cryptography.CryptographicException:keyset does not exist"
(私にとって)解像度は:Visual Studioが必要(管理者として実行)
私に説明したように(YMMV)、キーストアから証明書のプライベートキーを抽出し、keyvaultと認証/ハンドシェイクをネゴシエートするには、VSを管理者として実行する必要があります。
管理者として実行してみてください。私のために働いた