web-dev-qa-db-ja.com

インターネット経由でx509証明書を使用するようにWCFを構成するにはどうすればよいですか?

リッチクライアントからインターネット経由で安全なWCF Webサービスに安全なメッセージレベルの認証を取得するには、x509証明書を使用する必要があります。

具体的には、「dev」証明書の作成、インストール、本番用の「実際の」証明書の取得など、セットアップ、構成、コーディング、およびデプロイメントの実用的なステップバイステップガイドを探しています。

37
Ben Laan

次の手順は、開始するためのガイドです。

1)最初に、クライアントとサーバーの証明書を生成するためのルート認証局が必要です。外部の認証機関(Verisignなど)を使用するか、Microsoft Certificate Serverなどを使用して独自の認証機関を生成できます。

開発ルート認証局の証明書を生成するには、Visual Studioに付属の「makecert」ツールを使用できます。

makecert -n "CN=MyRootCA" -r -sv RootCA.pvk RootCA.cer

2)次に、クライアントとサーバーの証明書を要求/生成する必要があります。どちらのタイプの証明書もローカルマシンの証明書としてインストールでき、同じルート認証局を使用して署名する必要があります。 Microsoft Certificate ServerのWebインターフェイスからクライアント証明書をリクエストできます。 http://mycertserver/certsrv

各マシンの開発クライアント証明書を生成するには、「makecert」を再度使用できます。クライアント証明書は、手順1で作成した開発ルート認証局の証明書で署名されていることに注意してください。

makecert -pe -n "CN=MyCert" -ss my -sky exchange -sk MyCert 
         -iv MyRootCA.pvk -ic MyRootCA.cer -sr localmachine MyCert.cer

これにより、コマンドが実行されるマシンの証明書が、ローカルマシンストアの個人証明書フォルダーにインストールされます。

サーバーがクライアント証明書を信頼するには、サーバーの信頼されたルート証明機関ストアに開発ルート証明機関の証明書をインストールする必要があります(これを行うには、mmc証明書スナップインを使用します)。クライアントにも、同じ方法でルート証明書をインストールして、自分の証明書を信頼できるようにする必要があります。

3)WCFサービスを構成して、証明書(web.configなど)を使用したクライアント認証を要求します。

<services>
  <service
    name="TestService"
    behaviorConfiguration="wsHttpCertificateBehavior">
    <endpoint name="TestEndPoint"
      address=""
      binding="wsHttpBinding"
      bindingConfiguration="wsHttpEndpointBinding"
      contract="TestService.IMyContract">
      <identity>
        <dns value=""/>
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
  </service>
</services>

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpEndpointBinding">
      <security mode="Message">
        <message clientCredentialType="Certificate"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<behaviors>
  <behavior name="wsHttpCertificateBehavior">
    <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"/>
    <serviceCredentials>
      <clientCertificate>
        <authentication 
          certificateValidationMode="PeerOrChainTrust" 
          revocationMode="NoCheck"/>
      </clientCertificate>
      <serverCertificate findValue="CN=MyCert"/>
    </serviceCredentials>
  </behavior>
</behaviors>

4)次に、(app.configなどを介して)呼び出し元を構成します。

<client>
  <endpoint name="wsHttpBinding"
    address="https://localhost/TestService/TestService.svc"
    binding="wsHttpBinding"
    bindingConfiguration="wsHttpBinding"
    behaviorConfiguration="wsHttpCertificateBehavior"
    contract="TestService.IMyContract">
    <identity>
      <dns value="MyCert"/>
    </identity>
  </endpoint>
</client>

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpBinding">
      <security mode="Message">
        <message clientCredentialType="Certificate"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<behaviors>
 <endpointBehaviors>
  <behavior name="wsHttpCertificateBehavior">
    <clientCredentials>
      <clientCertificate findValue="MyCert" storeLocation="LocalMachine"/>
      <serviceCertificate>
        <authentication 
          certificateValidationMode="PeerOrChainTrust" 
          revocationMode="NoCheck" 
          trustedStoreLocation="LocalMachine"/>
      </serviceCertificate>
    </clientCredentials>
  </behavior>
 </endpointBehaviors>
</behaviors>
44
Nigel Spencer

マイクロソフトのWCFセキュリティガイダンスを読むことをお勧めします

これはこのシナリオと他の多くのシナリオを扱います

http://www.codeplex.com/WCFSecurityGuide/

編集:今 https://archive.codeplex.com/?p=wcfsecurityguide

10
ChrisCa