9

新しいマシンに Windows サービスをインストールしています。このサービスは、問題の証明書を使用する TCP 上の SslStream でさまざまな操作を実行します。

このサービスは、他の 2 台の Windows 2003 マシンで同じコードと同じ証明書を使用して正常に動作しています。ただし、この新しいマシンも 64 ビット プロセッサを搭載した Windows 2003 です。

「サービス アカウント」ID でサービスを実行しようとすると、この問題が発生します。自分の資格情報で問題なく動作します。(繰り返しますが、このサービス アカウントを持つ他の 2 台のマシンでは問題なく動作します)

証明書のインポート中に「強力な保護」が有効になっていません。

これがスタックトレースです。

System.ComponentModel.Win32Exception: パッケージに提供された資格情報が、System.Net.Security.SecureChannel.AcquireCredentialsHandle(CredentialUse credUsage, SecureCredential& secureCredential) at System.Net.Security.SecureChannel.AcquireClientCredentials(Byte[]& thumbPrint) at System.Net.Security.SecureChannel.GenerateToken(Byte[] 入力、Int32 オフセット、Int32 カウント、Byte[]& 出力) システムで.Net.Security.SecureChannel.NextMessage(Byte[] 着信、Int32 オフセット、Int32 カウント)
System.Net.Security.SslState.StartSendBlob (Byte[] 着信、Int32 カウント、AsyncProtocolRequest asyncRequest) で
System.Net.Security.SslState.ProcessReceivedBlob (Byte[] バッファー、Int32 カウント、AsyncProtocolRequest asyncRequest)
で System.Net.Security.SslState.StartReadFrame (Byte[] バッファー、Int32 readBytes、AsyncProtocolRequest asyncRequest)
で System.Net.Security .SslState.StartReceiveBlob(Byte[] バッファー、AsyncProtocolRequest asyncRequest) System.Net.Security.SslState.CheckCompletionBeforeNextReceive (ProtocolToken メッセージ、AsyncProtocolRequest asyncRequest) で System.Net.Security.SslState.StartSendBlob(Byte[] 着信、Int32 カウント、AsyncProtocolRequest) asyncRequest)
System.Net.Security.SslState.ForceAuthentication (Boolean receiveFirst、Byte[] バッファー、AsyncProtocolRequest asyncRequest) で
System.Net.Security.SslState.ProcessAuthentication (LazyAsyncResult lazyResult) で System.Net.Security.SslStream.AuthenticateAsClient (文字列 targetHost、X509CertificateCollection clientCertificates、SslProtocols enabledSslProtocols、ブール値 checkCertificateRevocation) で

4

4 に答える 4

11

問題とその解決策を見つけました。

アイデアは、サービス ID に使用されるアカウントにアクセス許可を付与することです。

ツール WinHttpCertCfg.exe を使用する必要があります。これは、クライアント証明書を使用して承認を取得するアプリケーションに役立ちます。

ここでうまく説明されています。 http://support.microsoft.com/kb/901183

別のフォーラムで回答してくれたFeroze Daud ( http://ferozedaud.blogspot.com/ ) に感謝します。

于 2010-02-24T18:47:30.820 に答える
2

ASP.NET アカウントで実行している場合、または Windows サービス (ローカル システム アカウントで) を使用している場合の両方で、この問題が発生しました。ASP.NET で実行している場合、Windows 2003 では、上記の cdpnet で説明されているように、WinHttpCertCfg.exe ツールを使用する必要があります。Windows 2008 R2 では、GUI を使用して権限にアクセスできます。これは優れた改善です。

ただし、Windows サービスとして実行している場合は、証明書が個人用証明書ストアにあることを確認する必要があります。これには、mmc に移動し、Windows サービス アカウント用の証明書スナップインを追加するか、「ローカル システム アカウント」を使用している場合' アカウントで、ローカル コンピューターのスナップインを取得するだけです。

これが私が見つけた違いです...

個人証明書を自分のユーザーの証明書ストアにインストールし、それをコピーしてローカル コンピューター ストアに貼り付けた場合、これが常に機能するとは限りません。ただし、ローカル コンピューター ストアの個人用フォルダーから証明書を削除した場合は、ローカル コンピューター ストアの個人用フォルダーを右クリックし、インポートしてウィザードを実行できます。

何らかの理由で、これにより修正され、証明書を使用するための正しいアクセス許可が割り当てられます。幸運を!

于 2010-11-15T16:16:55.090 に答える
0

Win 2003 Serv についてここで説明されていることを行っていましたが、「パッケージに提供された資格情報が認識されません」というメッセージが原因で、まだ機能しませんでした。

上記の解決策をすべて試しましたが、成功しませんでした。

最後に、次のことを実行して動作するようになりました。

  1. makecert -pe -n "CN=CERT" -ss my -sr LocalMachine -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -in "CERT" -is MY -ir LocalMachine -sp "Microsoft RSA SChannel暗号化プロバイダー" -sy 12 CERT.cer
  2. Personal から Trusted Root への MMC コピーの使用
  3. サービス アプリからの X509 呼び出し用に生成された証明書 (.cer) を使用します。

なぜ...誰が知っているのか.....それが私にとってうまくいったことをうれしく思います....これが他の人にとってより簡単になることを願っています

于 2012-02-06T12:37:26.027 に答える