5

クライアント側の証明書をインストールすると、「オブジェクトには鍵ペアの公開半分のみが含まれています。秘密鍵も提供する必要があります」という例外が発生します。私のアプリケーションは、ASP.NET プラットフォーム上で実行される VC#.NET アプリケーションです。また、アプリケーションは WSE 2.0 を使用して証明書をインポートし、SOAP 要求を作成します。

調査の結果、この例外のタイプは System.Security.Cryptography.CryptographicException であることがわかりました。

subject-distinguished-name で同様の証明書を見つけることができたので、すべての WSE 設定が正しく構成されていることを確信しています。どんなアイデアでも大歓迎です。

4

3 に答える 3

15

私は最近同じ問題を抱えていました。私はここで私のために働いた1つの説明を見つけました。具体的には、秘密鍵のアクセス許可です。完全な情報を以下にコピーします。

最初に確認する点がいくつかあります。

  1. この証明書の秘密鍵はありますか?
  2. アプリケーションに秘密鍵へのアクセスを許可しましたか?

Windows 証明書ストアで証明書を表示することにより、秘密キーを持っているかどうかを確認できます。これを行うには、次の手順に従います。

  1. Windows の [スタート] メニューから、[ファイル名を指定して実行] を選択します。
  2. 名前: フィールドに mmc と入力します。[OK] をクリックします。
  3. [ファイル] メニューから [スナップインの追加と削除] を選択します。
  4. [追加] ボタンをクリックします。
  5. 使用可能なスタンドアロン スナップインのリストから [証明書] を選択します。[追加] ボタンをクリックします。
  6. 「コンピューター アカウント」を選択します。[次へ] をクリックします。
  7. 「ローカル コンピューター」を選択します。[完了] をクリックします。
  8. [閉じる] をクリックします。
  9. [OK] をクリックします。
    1. コンソール ルートの下の証明書ノードを展開し、個人ストアを開きます。
    2. 使用している証明書をダブルクリックします。秘密鍵がある場合、ダイアログの下部に「この証明書に対応する秘密鍵があります」というメッセージが表示されます。

秘密鍵がある場合は、アプリケーションに鍵へのアクセス許可があることを確認します。

  1. Windows エクスプローラーを開きます。
  2. C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys フォルダーに移動します。
  3. WSE が取得する必要があるキーを含むファイルを選択します。
  4. [ファイル] メニューから [プロパティ] を選択します。
  5. [セキュリティ] タブで、ASPNET アカウントを追加し、[フル コントロール] オプションを選択します。
  6. 注: 1. MachineKeys フォルダー内のどのキー ファイルが証明書に関連付けられているかを判断するのは難しい場合があります。簡単な方法の 1 つは、新しい証明書を作成するときに作成日時をメモすることです。MachineKeys ディレクトリ内のファイルを表示するときは、[更新日] フィールドで対応する日付と時刻を確認します。2. システムを ASPNET 以外のアカウントで実行するように構成した場合は、証明書へのアクセス許可を付与するときにそのアカウントを使用します。
于 2010-08-09T14:39:31.470 に答える
0

同じ例外が発生した後: System.Security.Cryptography.CryptographicException, Object has only public half of a key pair, 私は代替案を証明しましたが、最適ではないソリューションです。

状況: 証明書/キー ルックアップは Visual Studio IIS Express 内でうまく機能しましたが、Web アプリケーションが適切な IIS サービスで実行されている間、常に「キー ペアの公開半分のみを含む」という例外を受け取りました。

私は WSE3 CertificateTool を使用してファイルシステムの秘密鍵セクションを見つけ、ユーザー権限設定を調整して、上記の回答に従って ASP ユーザー権限を付与しようとしました。

私の最終的な修正は、Web サービス コードに固有の新しい IIS アプリケーション プールを作成し、プールが実行するユーザー ID を証明書 + 秘密キーのローカル マシン所有者として設定することでした。

証明書をインストールした最終的な場所は、「Local Computer / Trusted People」でした。

WSE3 CustomPolicyAssertion、C# .NET を使用:

clientToken = X509TokenProvider.CreateToken(StoreLocation.LocalMachine, 
   StoreName.TrustedPeople, "soap.partnersite.com", X509FindType.FindBySubjectName);

アプリケーション プール ID を更新した後、アプリケーション プールの所有者を変更するときに秘密鍵ファイルの上書きは必要ありませんでした。

于 2014-10-15T13:22:52.213 に答える