web-dev-qa-db-ja.com

System.Security.Cryptography.CryptographicException:キーセットが存在しません

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);
38
Bes Ley

この質問は古いですが、EncryptDecryptを使い続けながら解決策を探している人のために、このエラーを解決する方法を以下に示します。

基本は、.pfxファイルをダブルクリックしてストアを選択することにより、証明書が間違った方法でインストールされていることです。

証明書をインストールする間違った方法

1。証明書をダブルクリックします。

certificate file

2。ウィザードが開き、次のボタンをクリックします。

wizard 0

ウィザードは証明書の場所を表示し、次のボタンをクリックします。

wizard 1

4。パスワードを入力して、[次へ]をクリックします。

wizard 2

5。ストアを選択して、[次へ]をクリックします。

wizard 3

6。ウィザードに証明書情報が表示されます。Finishボタンをクリックします

wizard 4

7。成功ダイアログが表示されます:

wizard 5

そのため、この時点でエラーが発生しました「キーセットが存在しません」


それを解決するために、私はこの方法で進めました(正しい方法)

1。 Microsoft管理コンソール(mmc.exe)を実行します。

execute mmc

2。空のMMCインスタンスは以下を示しました。

mmc showed

[ファイル]-> [スナップインの追加と削除]をクリックします...

add snap-in

4。クリックして証明書スナップインを選択Addボタン:

add certificate snap-in

5。を選択コンピュータアカウントをクリックして、Nextボタンをクリックします。

select computer account

6。選択Local computerをクリックしてFinishボタンをクリックします。

selecct local computer

7。証明書スナップインが追加されました。[〜#〜] ok [〜#〜]ボタンをクリックします。

certificate snap-in shows

8。パーソナルストアを選択し、右クリックしてImportを選択します。

select personal store and import

9。証明書を参照して、[次へ]をクリックします。

browse certificate

10。パスワードを入力し、Nextボタンをクリックします。

enter image description here

11。証明書ストアを自動的に選択します。

automatically select the store

12。証明書情報には以下が表示されます。

certificate information

13。成功ダイアログメッセージが表示されます:

enter image description here

14。 MMConsoleを更新して証明書を表示します。

refresh mmc

15。証明書を右クリックし、Manage Private Keys ...をクリックします。

manage private keys

16。プールIDまたはIISユーザーを追加します。私の場合、IIS_IUSRSを追加しました。

add iis_iusrs

17。ユーザーが追加されました。[〜#〜] ok [〜#〜]ボタンをクリックします。

user added

そして、キーセットはexistを終了しました!!

100
sabotero

アプリケーションは、次のフォルダーパスに書き込もうとしている可能性があります。C:\ Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys

アプリケーションが偽装またはIUSR_MACHINENAMEユーザーを使用している場合は、MachineKeysフォルダーのセキュリティを構成し、ユーザーに読み取りと実行、フォルダーの内容の一覧表示、読み取り、書き込みを許可します。それでもうまくいかない場合は、Everyoneユーザーに同じ権限を与えてみてください。

6
eMi

EncryptおよびDecryptを使用する場合、暗号化には公開キー、復号化には秘密キーが必要だと思います。したがって、秘密鍵なしで復号化しようとすると失敗し、例外が発生します。

署名の作成には SignData メソッドを、検証には VerifyData メソッドを使用する必要があります。

3
tyranid

私は同じ問題に遭遇しました。このメッセージは理想的ではなく、私の場合、ユーザーには秘密鍵にアクセスする権限がありませんでした。次の手順を使用してこれを修正できます。

  1. オープンMMC
  2. 証明書スナップインを追加する
  3. 使用する証明書を選択します
  4. それを右クリックし、「すべてのタスク」/「秘密鍵の管理...」を選択します
  5. 許可されたユーザーのリストにユーザーを追加し、「フルコントロール」を許可します
2
Johnny Graber

SAML応答に署名しようとしたときに、証明書からPrivateKeyをsignedXmlElementのSigningKeyにロードしていないときに、このエラーに遭遇しました。

signedElement.SigningKey = myCertificate.PrivateKey;
1
Mough

OPと同じエラーを受け取りました: "System.Security.Cryptography.CryptographicException:keyset does not exist"

(私にとって)解像度は:Visual Studioが必要(管理者として実行)

私に説明したように(YMMV)、キーストアから証明書のプライベートキーを抽出し、keyvaultと認証/ハンドシェイクをネゴシエートするには、VSを管理者として実行する必要があります。

1

管理者として実行してみてください。私のために働いた

0
Bhavesh