3

私のシナリオ: Amazon EC2 サーバーでホストされている公開 Web アプリがあります。ファイアウォールの背後に自己ホスト型データベース サーバーがあります。データ アクセス用の Web サービスを備えた自己ホスト型の Web サービス サーバーがあります。私が承認したアプリケーション (クラウドに住んでいる私自身) だけがサービスにアクセスできるようにしたいのですが、どのデータもクリアテキストで渡されることは望ましくありません。

支離滅裂で非常に難読化された MSDN の記事、Stackoverflow スレッド、コード プロジェクトの記事、その他のブログをすべて読んでいるとわかります。必要なセキュリティのタイプは次の とおりです。 wsHttpBinding を使用して、証明書clientCredentialType を使用したトランスポートセキュリティ モード。最初の質問、私はそれを仮定するのは正しいですか? それで十分なセキュリティが得られますか?これは B2B などではありません。ただし、これはクロスドメインであり、呼び出し元を信頼できることを確認したいだけです. 私のサービスは特定のユーザーが所有する AppPool で実行されているため、統合されたセキュリティで DB にアクセスできます。承認したサービスへの呼び出し元だけが確実にアクセスできるようにする必要があります。SSL が既に行っている以上に、メッセージを暗号化する必要はないと思います。

考えられるすべてのシナリオにより、これが私が望むものであるかどうかを知ることは非常に困難です. しかし、それが次の質問であると仮定すると、証明書をどのように設定するのですか? 現在、サーバーに証明書があり、Https でしかアクセスできません。(セキュリティ モード="トランスポート"、clientCredentialType="なし")。しかし、私の人生では、 clientCredentialType を Certificate に変更して機能させるために何をする必要があるのか​​ わかりません。

  • サーバーからクライアントに何を渡し、どこに行くのですか?
  • クライアントからサーバーに何を与え、どこに行くのですか?
  • 複数のクライアント (Web ファーム) がある場合、それらすべてに対して異なるクライアント証明書を用意する必要がありますか? それとも、サーバーが受け入れる 1 つの証明書を共有できますか?

私が読んだすべての開発記事には、証明書のセットアップは管理ツールであり、記事の範囲を超えていると書かれています。まあ、WCF のことは簡単です。それはまさに私が助けを必要としている極度の証明書のことであり、私が見つけた有用な記事はまだありません。近いものは、makecert.exe でそれを行う方法を示し、本番環境では異なると言っていますが、本番環境でそれを行う方法については述べていません。

私の欲求不満のレベルが現れていると確信しています。申し訳ありません。しかし、WCF で非常に一般的なセキュリティ シナリオと思われるものを実行する方法について明確な説明がないのは、まったく意味がありません。

すべての助けに感謝します、ケン

4

1 に答える 1

3

簡潔な答え

必要なセキュリティの種類は次のとおりです。wsHttpBinding を使用して、証明書 clientCredentialType を使用するトランスポート セキュリティ モード。最初の質問、私はそれを仮定するのは正しいですか?

はい。メッセージ セキュリティは、WCF ストリーミング機能を使用しない場合にも機能しますが、トランスポート セキュリティを使用すると、ハードウェア アクセラレーションを利用できます。

証明書を設定するにはどうすればよいですか?

以下の詳細な回答をご覧ください。

サーバーからクライアントに何を渡し、どこに行くのですか? 複数のクライアント (Web ファーム) がある場合、それらすべてに対して異なるクライアント証明書を用意する必要がありますか? それとも、サーバーが受け入れる 1 つの証明書を共有できますか?

3 つの証明書が必要です。

  • クライアント証明書 (すべてのクライアントで同じ)。
  • サーバー証明書。
  • クライアント証明書とサーバー証明書が発行された認証局 (CA) 証明書。

クライアントには次のものが必要です。

  • 個人証明書ストアにインストールされたクライアント証明書。
  • 信頼されたルート証明機関ストアにインストールされた CA 証明書。

クライアントからサーバーに何を与え、どこに行くのですか?

サーバーには以下が必要です。

  • 個人証明書ストアにインストールされているサーバー証明書。
  • 信頼されたルート証明機関ストアにインストールされた CA 証明書。
  • Trusted People ストアにインストールされたクライアント証明書。

詳細な回答

このシナリオ (Web ファームと自己ホスト型 Web サービス間の通信) では、クライアント マシンとサーバー マシンの両方を所有しています。サードパーティが発行した証明書は必要ありません (自分自身を信頼していますよね?)。つまり、自家製の証明書を安全に使用できます。

これは、あなた(または他の誰か)がこれを達成するのに役立つことを願っているクイックガイドです。質問が示唆するように、既に証明書を所有している場合は、手順 I をスキップしてください。さらに、サードパーティが発行した証明書を既に購入している可能性があります。その場合、ルート認証局 (VeriSign、Microsoft など) の証明書が既にインストールされている可能性があります。あなたのクライアントとサーバーマシン。

I.証明書を作成する

このmsdn articlemakecertで説明されているように、次の3 つの証明書を生成するために使用します。

  1. ルート認証局の証明書、それを と呼びましょうMyRootCA、およびその失効リスト。
  2. サーバー SSL 証明書。この名前は、Web ファーム クライアントが Web サービスを呼び出すために使用するドメイン名でなければなりません。たとえば、クライアントが次の URL を使用している場合、https://mywebserver.myprivatedomain.com/service1.svc証明書の CN (共通名) は になりますmywebserver.myprivatedomain.com
  3. クライアント 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.cerMyRootCA.crlLocal Computer > Trusted Root Certification Authorities > Certificates
  • MyAmazonClient.pfxLocal Computer > Trusted People > Certificates
  • mywebserver.myprivatedomain.com.pfxLocal 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.cerMyRootCA.crlLocal Computer > Trusted Root Certification Authorities > Certificates
  • MyAmazonClient.pfxLocal 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>

以上です。

于 2014-07-24T16:34:14.607 に答える