9

私は WCF セルフホステッド サービスを開発しました。このサービスには、インターネット経由でアクセスするため、次の 2 つの基本的なセキュリティ要件があります。

  • トランスポート層は、改ざんやスニッフィング、特に認証資格情報の取得を防止する必要があります。これは SSL が行うことですが、私が見たところ、SSL のセットアップには証明書のインストールが必要です (プレーンな証明書ファイルを使用するこのハックを除く)。

  • 認証レイヤーは、ユーザー名/パスワードバリデーターで構成する必要があります。

以下を使用するようにサービスを構成しました。

      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" />
        <transport clientCredentialType="Basic" />
      </security>

トランスポート レイヤーが HTTP (HTTPS ではない) であっても、WCF は SSL と同等の別のセキュリティ レイヤーを作成しますか? そうでない場合、セキュリティ強度の違いは何ですか?

また、SSL 証明書を使用せずにメタデータ エンドポイントを保護する方法はありますか (必須ではありませんが、よろしくお願いします)。

セルフホステッド サービスの完全な構成コードは次のとおりです。

<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
  <system.serviceModel>
    <services>
      <service name="MyService">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8000/Services" />
          </baseAddresses>
        </host>
        <endpoint address ="MyService" binding="wsHttpBinding" contract="IMyService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="Binding1" maxReceivedMessageSize="2147483647">
          <security mode="TransportWithMessageCredential">
            <message clientCredentialType="UserName" />
            <transport clientCredentialType="Basic" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="CR.Common.Services.CustomValidator, Common" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

ありがとうございました!

4

1 に答える 1

11

既定では、すべてのセキュリティで保護されたWCF バインディング (wsHttpBinding など) は、メッセージを暗号化して署名します。

SSLは必須で証明書を使用します。指定したリンクのハックは、SSLではなくwcfのハッキングです。SSL を使用しない場合、WCF は basicHttpBinding (xml をクリアで送信する) と UserNamePasswordValidator の使用を禁止します。この場合、メッセージを傍受した人は誰でもユーザー名/パスワードを取得できるためです。

WSHttpBinding を使用すると、SSL を回避し、セキュリティをメッセージ レベルに置くことができます。

この記事、特にサービス資格情報とネゴシエーションの章を読むことを強くお勧めします。

相互認証とメッセージ保護をサポートするには、サービスが呼び出し元に資格情報を提供する必要があります。トランスポート セキュリティ (SSL) が使用されている場合、サービス資格情報はトランスポート プロトコルを介してネゴシエートされます。メッセージ セキュリティのサービス資格情報は、Windows 資格情報を使用する場合にもネゴシエートできます。それ以外の場合は、サービス証明書を指定する必要があります

ではUserNamePasswordValidator、サーバー上で証明書を構成して、クライアントが各メッセージに署名して暗号化できるようにする必要があります (証明書の公開キーを使用)。Windows 認証を使用していた場合は、必要ありません。

なぜあなたは証明書についてそんなに心配しているのですか?

于 2012-05-22T06:51:59.713 に答える