2012-03-24 11 views
0

WCF 4サービスもホストするASP.NET MVC Webサイトを開発しました。私は、Webサイトを補完し、インターネットを介してそのWebサービスを消費することによってそれとやりとりする.NET Windowsアプリケーションを作成しました。両方のプログラムは、Visual Studio 2010で.NET 4を使用して作成されました.WCFサービスで使用されるバインディングはWsHttpBindingです。X509証明書を使用してサーバー資格情報を使用せずにクライアントを認証するWCFサービスを構成する

私ののみセキュリティ要件は、Webサイトのデータベースの情報を汚染するため、WCFサービスが未知の団体によって消費されないことです。私はプライバシーを必要としません。ウェブサービスに送信しているメッセージ(暗号化の必要性がない)を第三者が見ても気にしません。 Webサービスのセキュリティに関する私の知識は、セキュリティシナリオを実装する最良の方法は、クライアントがX509証明書で各SOAPメッセージに署名し、Webサービスがその「信頼できる人物"店。証明書は公開鍵/秘密鍵のペアを使用するため、メッセージが暗号化されていなくても、メッセージに署名するために使用された秘密鍵を使用せずに、許可されていない第三者によって再現することはできません。これにより、メッセージの整合性も保証されます。

この決定を考慮して、makecert.exeを使用してテスト証明書を作成しました。 のバージョンをインストールしました。 "現在のユーザー" "私"証明書ストアに、クライアントマシン(Windowsアプリケーションを持つユーザー)のプライベートと公開キーがインストールされています。その後、証明書を(秘密鍵なしで)エクスポートし、Webサーバーの「ローカルマシン」証明書ストアの「信頼できるユーザー」にインストールしました。

私のこれまでのところ、そのシナリオを設定するには(失敗した)試みはこのように書き:

は、バインディングは、メッセージが証明書タイプのクライアントの資格情報を見込んでメッセージセキュリティを使用するように設定されています。また、サーバはテスト証明書が信頼できるCAによって放出されないので、ChainTrustの代わりにPeerTrustを使用するように設定されています

<bindings> 
    <wsHttpBinding> 
    <binding> 
     <security mode="Message"> 
     <transport clientCredentialType="None" proxyCredentialType="None" /> 
     <message clientCredentialType="Certificate" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

<behaviors> 
    <serviceBehaviors> 
    <behavior name="Standard"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <serviceCredentials> 
     <clientCertificate> 
      <authentication certificateValidationMode = "PeerTrust" trustedStoreLocation="LocalMachine"/> 
     </clientCertificate> 
     </serviceCredentials> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

クライアントのWindowsアプリケーション上の設定は、その証明書として証明書を設定します。バインディング構成は、サーバー内の構成と同じです。

The service certificate is not provided. Specify a service certificate in ServiceCredentials. 

私の問題は私にはない、次のとおりです。

<behaviors> 
    <endpointBehaviors> 
    <behavior name="CertificateCredential"> 
     <clientCredentials> 
     <clientCertificate findValue="ErrEye" 
          storeLocation="CurrentUser" 
          storeName="My" 
          x509FindType="FindBySubjectName" /> 
     </clientCredentials> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

問題は、私は、Webサービスのホストが正常に起動したかどうかを確認しようとすると、この構成では、私は次のエラーを取得するということです「サービス証明書」を指定します。私が理解する限り、サービス証明書はクライアントがサービスを認証できるようにしますが、その必要はありません。私は、サービスがクライアントを認証することを望み、それだけです。 I doこれは、(たとえば、クライアントコンピュータのDNS設定を改ざんするなどして)誰かがWebサーバーを偽装した場合、クライアントからのメッセージを受信し、クライアントが意図した受信者と通信していないことを知らないことを意味するそれが起こるかどうか気にしない。

要約すると、私の質問は、私が記述したセキュリティシナリオをWCFでどのように設定するのですか?

ご協力いただきありがとうございます。

答えて

0

- ネット(およびそのまま)にこの

negotiateServiceCredential=true 

を追加します。

<message clientCredentialType="Certificate" /> 

しかし、注意してください、あなたは非.NETクライアントとの相互運用性を失うことになります。

+0

残念ながら、サービスホストはまだ開始されず、サービス信任状の指定に関して同じエラーが表示されます。 negotiateServiceCredentialを "true"と "false"の両方で試してみました。 – andragon

関連する問題