5

私はこのコードを持っています:

string certificateFilePath = @"C:\Users\Administrator\Documents\Certificate.pfx";

string certificateFilePassword = "Some Password Here";

X509Certificate clientCertificate = new X509Certificate(certificateFilePath, certificateFilePassword);

TcpClient client = new TcpClient(host, port);

SslStream stream = new SslStream(client.GetStream(), false, (sender, certificate, chain, errors) => true);

X509CertificateCollection clientCertificates = new X509CertificateCollection {clientCertificate};

stream.AuthenticateAsClient(host, clientCertificates, SslProtocols.Tls, false);

コンソール アプリケーションでコードを実行すると、すべて正常に動作し、正しい証明書オブジェクトが返され、stream.IsAuthenticated含まれています。stream.IsMutuallyAuthenticatedtruestream.LocalCertificate

ただし、まったく同じコードを aWindows Service (as LOCAL SYSTEM user)で実行すると、 return 、return 、およびreturn がstream.IsAuthenticated返されます。truestream.IsMutuallyAuthenticatedfalsestream.LocalCertificatenull

これは、両方のシナリオで、最初の行が実行された後にclientCertificate、正しい認証データが読み込まれ、証明書の正しい情報が含まれているときに発生SubjectしますIssuer

また、このコードを使用して SslStream に強制的に証明書を選択させようとしました:

string certificateFilePath = @"C:\Users\Administrator\Documents\Certificate.pfx";

string certificateFilePassword = "Some Password Here";

X509Certificate clientCertificate = new X509Certificate(certificateFilePath, certificateFilePassword);

TcpClient client = new TcpClient(host, port);

SslStream stream = new SslStream(client.GetStream(), false, (sender, certificate, chain, errors) => true, (sender, host, certificates, certificate, issuers) => clientCertificate);

X509CertificateCollection clientCertificates = new X509CertificateCollection {clientCertificate};

stream.AuthenticateAsClient(host, clientCertificates, SslProtocols.Tls, false);

ただし、コードはまだ機能せず、stream.IsMutuallyAuthenticated戻り値falsestream.LocalCertificate戻り値が返されますnull

私はこれを数日間調査してきましたが、理解できません。どんな助けでも大歓迎です。

編集: WinHttpCertCfgツールで 証明書を試した後、同様の質問とは異なり、下の図に示すように、LOCAL SYSTEM アカウントは既にターゲット証明書の秘密鍵にアクセスできることがわかりました。 ターゲット証明書の WinHttpCertCfg ツールからの出力 したがって、問題はまだ解決されていません。

4

2 に答える 2

0

このようなサービスの問題に対して使用するデバッグ手法の 1 つは、PsExecなどのユーティリティを使用することです。これにより、必要なサービス アカウントとして対話型プロセスを実行できます。

-s システム アカウントでプロセスを実行します。

ヘルプには「リモート処理」とありますが、ローカル処理にも使えます。

たとえば、以下は、管理者権限でコマンドプロンプトで以下を実行した後、システムアカウントとしてコマンドプロンプトを取得します

PsExec.exe -s cmd

WhoAmIコマンドウィンドウでは、コマンドを使用して確認できます

C:\Windows\system32>whoami
nt authority\system

これにより、いくつかのインタラクティブなテストを実行して、さまざまな組み合わせを試すことができます。

SYSTEM アカウントには、ローカル マシンで可能な最大の権限があります。

また、サービスを実行するためのカスタム アカウントを作成することが推奨されるオプションであることもわかりました。ただし、これには別のパスワードを維持するというオーバーヘッドがあります。新しいバージョンの Windows には、管理されたサービス アカウントがあります。これはより良いオプションかもしれません。

管理されたサービス アカウントと仮想アカウント - 管理者がこれらのアカウントの SPN と資格情報を手動で管理する必要をなくしながら、アプリケーションに独自のアカウントの分離を提供するように設計されています。

于 2017-07-14T02:48:38.747 に答える