4

OpenSSLを使用して秘密鍵と公開鍵のペアを作成し、.p12ファイルを生成してWindows証明書ストアにインポートしました。キーペアと.p12ファイルはWindowsXPで作成されており、Windows 7で使用しようとしています。IISのWebサービス(.svc)内からキーにアクセスしようとしています。スタンドアロンアプリから秘密鍵を読み取ろうとすると問題なく実行できますが、Webアプリから秘密鍵を読み取ろうとすると、常に次の例外が発生します。

'cert.PrivateKey' threw an exception of type 'System.Security.Cryptography.CryptographicException'

そして、これはスタックトレース全体です。

en System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
en System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
en System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
en System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize)
en System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey()
en ValidKeyDll.ValidKey.getLlaveDeAlmacen(String almacen, Boolean esLlavePrivada) en C:\Users\desarrollo\Documents\ValidKeyDll\ValidKeyDll\ValidKey.cs:línea 58
en ValidKeyDll.ValidKey.firmaCadena(String almacen, String cadenaFirmar) en C:\Users\desarrollo\Documents\ValidKeyDll\ValidKeyDll\ValidKey.cs:línea 117

そして、これはキーを読み取るコードの私の部分です:

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
RSACryptoServiceProvider csp = null;
foreach (X509Certificate2 cert in store.Certificates)
{
   if (cert.Subject.Contains(almacen))
   {
      if (cert.NotAfter.CompareTo(System.DateTime.Now) <= 0)
         throw new CertificadoVencidoException();

      if (isPrivateKey)
         csp = (RSACryptoServiceProvider)cert.PrivateKey;
      else
         csp = (RSACryptoServiceProvider)cert.PublicKey.Key;

      break;
   }
}

なんらかの許可の問題と関係があると思いますが、それが何なのかわかりません…何か提案があれば大歓迎です。

考慮事項:

  • 秘密鍵はエクスポート可能です。
  • ユーザーIIS_IUSRSには、証明書に対するアクセス許可があります。
4

2 に答える 2

4

私はついに問題を取り締まりましたが、今まで答えを投稿できませんでした(私は初心者なので):

問題は、.p12を間違った方法でインポートしていたことです。私はそれをダブルクリックして、手順に従いました。これは、証明書を現在のユーザー(個人証明書ストア)に配置することでした。そのため、証明書をそのストアからローカルマシンストアに移動するだけで十分だと思いました...しかし、驚きました。そうではありませんでした。多くの改訂を行った後、IISには内部から証明書をインポートする機能があり、これにより証明書がローカルマシンの証明書ストアに直接配置されることがわかりました。誰かが何らかの問題を抱えているか、これを行う方法を知りたいだけの場合は、次の手順を実行します。

  • IISを開きます。
  • サーバー証明書に移動します(正確な単語が見つからない場合は申し訳ありませんが、私のWindowsはスペイン語です)
  • [インポート]を選択します
  • ファイルを選択します。ファイルが私のような.p12の場合は、*。*を表示するように選択します。
  • パスワードを入力します
  • 受け入れる...そしてvoilá
于 2011-05-31T01:33:03.323 に答える
1

はい、権限に問題があります。私はしばらく前にこれに苦労しました。現在、winhttpcertcfgを使用して適切な権限を追加しています。

次のリンクも確認する必要があります:http://benoit808.wordpress.com/2008/10/31/cryptographicexception-the-handle-is-invalid/

それに関する記事もありますhttp://www.stevefenton.co.uk/Content/Blog/Date/201101/Blog/X509-Certificates-On-Windows-Server-2003/。IIS_WPGおよびIUSRアカウントのアクセス許可を追加する必要がある場合もあります(記事には記載されていません)。

于 2011-05-30T17:01:58.497 に答える