簡潔な答え
必要なセキュリティの種類は次のとおりです。wsHttpBinding を使用して、証明書 clientCredentialType を使用するトランスポート セキュリティ モード。最初の質問、私はそれを仮定するのは正しいですか?
はい。メッセージ セキュリティは、WCF ストリーミング機能を使用しない場合にも機能しますが、トランスポート セキュリティを使用すると、ハードウェア アクセラレーションを利用できます。
証明書を設定するにはどうすればよいですか?
以下の詳細な回答をご覧ください。
サーバーからクライアントに何を渡し、どこに行くのですか? 複数のクライアント (Web ファーム) がある場合、それらすべてに対して異なるクライアント証明書を用意する必要がありますか? それとも、サーバーが受け入れる 1 つの証明書を共有できますか?
3 つの証明書が必要です。
- クライアント証明書 (すべてのクライアントで同じ)。
- サーバー証明書。
- クライアント証明書とサーバー証明書が発行された認証局 (CA) 証明書。
クライアントには次のものが必要です。
- 個人証明書ストアにインストールされたクライアント証明書。
- 信頼されたルート証明機関ストアにインストールされた CA 証明書。
クライアントからサーバーに何を与え、どこに行くのですか?
サーバーには以下が必要です。
- 個人証明書ストアにインストールされているサーバー証明書。
- 信頼されたルート証明機関ストアにインストールされた CA 証明書。
- Trusted People ストアにインストールされたクライアント証明書。
詳細な回答
このシナリオ (Web ファームと自己ホスト型 Web サービス間の通信) では、クライアント マシンとサーバー マシンの両方を所有しています。サードパーティが発行した証明書は必要ありません (自分自身を信頼していますよね?)。つまり、自家製の証明書を安全に使用できます。
これは、あなた(または他の誰か)がこれを達成するのに役立つことを願っているクイックガイドです。質問が示唆するように、既に証明書を所有している場合は、手順 I をスキップしてください。さらに、サードパーティが発行した証明書を既に購入している可能性があります。その場合、ルート認証局 (VeriSign、Microsoft など) の証明書が既にインストールされている可能性があります。あなたのクライアントとサーバーマシン。
I.証明書を作成する
このmsdn articlemakecert
で説明されているように、次の3 つの証明書を生成するために使用します。
- ルート認証局の証明書、それを と呼びましょう
MyRootCA
、およびその失効リスト。
- サーバー SSL 証明書。この名前は、Web ファーム クライアントが Web サービスを呼び出すために使用するドメイン名でなければなりません。たとえば、クライアントが次の URL を使用している場合、
https://mywebserver.myprivatedomain.com/service1.svc
証明書の CN (共通名) は になりますmywebserver.myprivatedomain.com
。
- クライアント X.509 証明書、と呼びましょう
MyAmazonClient
。
これらの 3 つのステップを実行する簡単なバッチを次に示します。
REM 1: MyRootCA
makecert -n "CN=MyRootCA" -r -sv "MyRootCA.pvk" "MyRootCA.cer"
makecert -crl -n "CN=MyRootCA" -r -sv "MyRootCA.pvk" "MyRootCA.crl"
REM 2: mywebserver.myprivatedomain.com
makecert -sk "mywebserver.myprivatedomain.com" -iv "MyRootCA.pvk" -n "CN=mywebserver.myprivatedomain.com" -ic "MyRootCA.cer" -sr LocalMachine -ss My -sky exchange -pe
REM 3: MyAmazonClient
makecert -sk "MyAmazonClient" -iv "MyRootCA.pvk" -n "CN=MyAmazonClient" -ic "MyRootCA.cer" -sr LocalMachine -ss My -sky signature -pe
このバッチは、現在のフォルダーに 3 つのファイルを作成します。
- MyRootCA.cer : ルート CA 証明書の公開鍵が含まれています。
- MyRootCA.crl : 証明書失効リストが含まれています。
- MyRootCA.pvk : ルート CA 証明書の秘密鍵が含まれています。
他の 2 つの証明書 (クライアントとサーバー) は、ローカル コンピューターの証明書ストアにインストールされます。
証明書 MMC スナップインを使用して、それらを .pfx ファイルにエクスポートします。
- LocalMachine > My > Certificates を見つけます。
- MyAmazonClient > すべてのタスク > エクスポートを右クリックします。
- mywebserver.myprivatedomain.com > すべてのタスク > エクスポートを右クリックします。
Ⅱ.サーバー証明書をインストールする
サーバー マシン (Web サービスを公開するマシン) で、次のファイルをコピーします。
- MyRootCA.cer
- MyRootCA.crl
- MyAmazonClient.pfx
- mywebserver.myprivatedomain.com.pfx
サーバー マシンで証明書 MMC スナップインを使用して、次の場所に証明書をインストールします。
- MyRootCA.cerとMyRootCA.crlに
Local Computer > Trusted Root Certification Authorities > Certificates
- MyAmazonClient.pfxを
Local Computer > Trusted People > Certificates
- mywebserver.myprivatedomain.com.pfxに
Local Computer > Personal > Certificates
mywebserver.myprivatedomain.com 証明書の秘密キーへの IIS AppPool アクセスを許可します。MMC 証明書スナップインで、mywebserver.myprivatedomain.com を右クリックし、[すべてのタスク] > [秘密キーの管理...] をクリックして、AppPool が実行されている ID を追加します。ApplicationPoolIdentity (デフォルト) を使用する場合、ID 名はIIS AppPool\YourAppPoolNameHere
.
III. SSL をサポートするように IIS を構成する
IIS マネージャーを使用して Web サイトを見つけ、mywebserver.myprivatedomain.com
証明書に https バインディングを追加します。ステップ 4: SSL をサポートするように IIS で一時的なサービス証明書を構成するを参照してください。
IV. サービスを構成する (web.config)
<system.serviceModel>
<protocolMapping>
<add scheme="https" binding="wsHttpBinding" />
</protocolMapping>
<bindings>
<wsHttpBinding>
<!-- configure wsHttp binding with Transport security mode and clientCredentialType as Certificate -->
<binding>
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
V. クライアント証明書をインストールする
各クライアント マシン (Web ファーム) で、次のファイルをコピーします。
- MyRootCA.cer
- MyRootCA.crl
- MyAmazonClient.pfx
クライアント マシンで証明書 MMC スナップインを使用して、次の場所に証明書をインストールします。
- MyRootCA.cerとMyRootCA.crlに
Local Computer > Trusted Root Certification Authorities > Certificates
- MyAmazonClient.pfxを
Local Computer > Personal > Certificates
MyAmazonClient 証明書の秘密鍵への IIS AppPool アクセスを許可します ( IIと同じ手順)。
Ⅵ.クライアントを構成する (web.config)
<system.serviceModel>
<client>
<!-- this endpoint has an https: address -->
<endpoint address="https://mywebserver.myprivatedomain.com/service1.svc"
behaviorConfiguration="endpointCredentialBehavior"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="MyWebApp.IServiceContract"/>
</client>
<behaviors>
<endpointBehaviors>
<behavior name="endpointCredentialBehavior">
<clientCredentials>
<clientCertificate findValue="MyAmazonClient"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName" />
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<!-- configure wsHttpbinding with Transport security mode
and clientCredentialType as Certificate -->
<binding name="Binding1">
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
以上です。