シナリオはこれです:クライアントが2つ(WCFClient)、サーバーが1つ(WCFServer) 。私はそれらの2人の間で証明書通信が必要でした。クライアントWCFはローカルマシン上にサーバー証明書を持たずにサーバーWCFに接続できません
サーバWCFでは、クライアント証明書タイプとして証明書を使用するようにバインディングを設定しました。
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
また、行動のセクションで、他の設定の中で、私がテストしたい場合は、私はこのエンドポイントの振る舞い
<endpointBehaviors>
<behavior name="CustomBehavior">
<clientCredentials>
<clientCertificate findValue="Client"
x509FindType="FindBySubjectName"
storeLocation="LocalMachine"
storeName="TrustedPeople" />
<serviceCertificate>
<authentication certificateValidationMode="PeerTrust"/>
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
を追加したクライアントのWCFサービス上で
<serviceBehaviors>
<behavior name="Server.ServiceBehavior">
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="PeerTrust"/>
</clientCertificate>
<serviceCertificate findValue="Server"
storeLocation="LocalMachine"
storeName="TrustedPeople"
x509FindType="FindBySubjectName" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
を持っている私サービスのエラーメッセージが表示されました:
The service certificate is not provided for target 'http://blablabla...'. Specify a service certificate in ClientCredentials.
私はインターネット上で物事をチェックアウトし始めました。多くのことをしようとした後、実際に働いていた唯一のことは、私のクライアント上でこれを追加している:あなたが考えるかもしれませんが、はい、これは私は私のクライアントマシン上のサーバー証明書を必要とする意味
<serviceCertificate>
<defaultCertificate findValue="Server"
storeLocation="LocalMachine"
storeName="TrustedPeople"
x509FindType="FindBySubjectName" />
<authentication certificateValidationMode="PeerTrust"/>
</serviceCertificate>
。それは明らかに非常に悪いことです。 私のテスト目的では動作しますが、展開には受け入れられません。
私は本当にそのエラーメッセージを引き起こす可能性があり、解決策が何であるかを理解したいと思います。
後で編集:このプロジェクトでは、(プライベートキーを持たなくても)クライアントはサーバー証明書を持っていてはいけません。これはシステムの仕様であり、これを超えることはかなり難しいです(bureaucracy
という用語で)。 クライアントWCFサービスを実行している複数のクライアントが存在し、それぞれが独自の証明書を認識している必要があります。サーバーはサーバー証明書とすべてのクライアント証明書を認識します。
クライアント証明書とサーバー証明書が混乱している可能性があります。あなたが記述する状況は、呼び出し元のユーザーの身元を保証するためにクライアント証明書を使用することです。したがって、この状況では、呼び出し元が証明書を持っていることは間違いありません。 –
私は、証明書を含むWebサービスのセキュリティに関する高度な知識を持っていないことを認めます。しかし、私の基本的なセキュリティ知識には、(クライアント側の)公開鍵と(サーバ側の)秘密鍵が必要であり、クライアントが秘密鍵を知ってはならないことが含まれています。あなたが私がちょっと混乱させるのを助けるソースを知っていれば、私は感謝します。 –
StackOverflowの精神ではない、あまりにも多くのトピックを外さずに。 SSL(https)には2種類の証明書が含まれています。サーバーとクライアント。通常、httpsのWebサイトにアクセスすると、サーバーがプライベートキーを保持している間にプルブラキーキーが与えられます。次に、サーバーによってのみ解読できる公開キーを使用して暗号化されます。時々使用される他の証明書はクライアント証明書ですが、これは同じですが、今回はSSLでクライアント識別を証明する秘密鍵があります。これはすべて交渉プロセスの一部です。 –