4

メッセージ セキュリティとユーザー名認証を備えた NetTcpBinding を使用する WCF サービスがあります。それまでは WsHttpBinding を使っていましたが、コールバックが使えるようになったので NetTcp に切り替えました。

私のサービス構成は次のようになります。

<service behaviorConfiguration="WcfServiceLibrary1.ServiceBehavior" name="WcfServiceLibrary1.Service">

    <endpoint
            address="net.tcp://localhost:9000/Design_Time_Addresses/WcfServiceLibrary1/Service/"
            binding="netTcpBinding"
            bindingConfiguration="NetTCPbinding"
            contract="WcfServiceLibrary1.IService"
            name="NetTCPBinding">
    </endpoint>
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8732/Design_Time_Addresses/WcfServiceLibrary1/Service/" />
      </baseAddresses>
    </host>
  </service>
</services>
<bindings>
  <netTcpBinding>
    <binding name="NetTCPbinding">
      <security mode="Message">
        <message clientCredentialType="UserName"/>
      </security>
    </binding>
  </netTcpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="WcfServiceLibrary1.ServiceBehavior">
      <serviceCredentials>
        <serviceCertificate findValue="ServerCert" 
                            storeLocation="CurrentUser" 
                            storeName="TrustedPeople" 
                            x509FindType="FindBySubjectName" />
        <userNameAuthentication 
          userNamePasswordValidationMode="MembershipProvider" 
          membershipProviderName="CustomMembershipProvider" />
      </serviceCredentials>
      <!-- To avoid disclosing metadata information, 
      set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="True" />
      <!-- To receive exception details in faults for debugging purposes, 
      set the value below to true.  Set to false before deployment 
      to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="MyRoleProvider" />
      <!-- Logs when an authentication failure -->
      <serviceSecurityAudit auditLogLocation="Application" 
                            suppressAuditFailure="true" 
                            serviceAuthorizationAuditLevel="Failure" 
                            messageAuthenticationAuditLevel="SuccessOrFailure" />
    </behavior>
  </serviceBehaviors>
</behaviors>

サービス資格情報 (この場合は証明書) を使用して、サービスがクライアントに送信するすべてのデータに署名できるため、クライアントは正しいサービスと通信していることを認識できると思います。

クライアント構成は次のとおりです。

<behaviors>
  <endpointBehaviors>
    <behavior name="messageSecurityBehavior">
      <clientCredentials>
        <clientCertificate storeLocation="CurrentUser" 
                           storeName="TrustedPeople" 
                           x509FindType="FindBySubjectName" 
                           findValue="ClientCert" />
        <serviceCertificate>
          <authentication certificateValidationMode="None" />
        </serviceCertificate>
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>
<bindings>
  <netTcpBinding>
    <binding name="NetTCPBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
                receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
                transferMode="Buffered" transactionProtocol="OleTransactions"
                hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
                maxReceivedMessageSize="65536">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
          enabled="false" />
      <security mode="Message">
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
        <message clientCredentialType="UserName" />
      </security>
    </binding>
  </netTcpBinding>

</bindings>
<client>
  <endpoint address="net.tcp://localhost:9000/Design_Time_Addresses/WcfServiceLibrary1/Service/"
            binding="netTcpBinding" bindingConfiguration="NetTCPBinding"
            contract="IService" name="NetTCPBinding" behaviorConfiguration="messageSecurityBehavior">
    <identity>
      <certificate encodedValue="AwAAAAEAAAAUAAAAQerRMlEg2a66HMxD/8El6LutassgAAAAAQAAAOwBAAAwggHoMIIBVaADAgECAhAzOWVhNWUzM2Y5MzUwNzFhMAkGBSsOAwIdBQAwIjELMAkGA1UEBhMCVVMxEzARBgNVBAMTClNlcnZlckNlcnQwHhcNMTIwMTE3MTk1NDQ2WhcNMjUwOTI1MTk1NDQ2WjAiMQswCQYDVQQGEwJVUzETMBEGA1UEAxMKU2VydmVyQ2VydDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAs6SaYi3pDDIOuXeCe7HgOOTvOpwajKdxM8MzZpkK3l+DqkriMQUx9DT5I9WZvNK5FMuorLueG5adWkTgWpvttC7Sp8CJ//A+PbPewiAU4L3Txln6dX3jHZFd99LY/58/2AzY8ln2NykQFzz1DdmVeyShG9ktVsX82Ogz60lzpeUCAwEAAaMnMCUwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDgYDVR0PBAcDBQD6AAAAMAkGBSsOAwIdBQADgYEAMGQ7fIW34CYjybCc0gWOLaxeRFiNHmX/dgxqPIWGgg3uc0avz1GHJ3uMHcPAZBKcw9QpbccALpqZxZzkDBxufWjRni+8XCzeAKUqaB7XaJTYYUYBbz7/2+EuaAw7/vF4JTtZGWhPkHZZcX5+Oyo2ktK0z24MfXP2Ggy+IsQJ2JM=" />
    </identity>
  </endpoint>
</client>

これはすべて正常に機能します。クライアント資格情報とメッセージを暗号化するためにサービス証明書が使用されていることを読みました。では、なぜ AlgorithmSuite で指定されたアルゴリズムが必要なのでしょうか? それは何を暗号化しますか?

論文で説明できるように、これをよく理解する必要があります。

4

1 に答える 1

1

証明書は、メッセージの暗号化に使用されるキーにつながります(それがキー自体として直接使用されているのか、キーのネゴシエーションに使用されているのかはわかりません)。AlgorithmSuiteは、メッセージを暗号化するためにそのキーを使用するアルゴリズムを決定します。


なぜアルゴリズムを指定する必要があるのですか?メッセージを暗号化する方法
をWCFに指示する必要があるためです受信側はメッセージの復号化に使用するアルゴリズムを知っている必要があるため、使用されるアルゴリズムはSOAPメッセージでも識別されます。アルゴリズムを明示的に設定しない場合でも、NetTcp(ソース)のデフォルトのBasic256という値が設定されていることに注意してください。

メッセージトレースを有効にすると、サービス操作に適切な(暗号化された)アクションのSOAP本文に次の行が表示されます。

<e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />

AlgorithmSuiteをBasic128上記に変更するaes128-cbcと、Algorithm属性の後半のビットに表示されます。

メッセージトレースでは、サービス操作に対応するアクションの直前に、http://schemas.xmlsoap.org/ws/2005/02/trust/...すべてのセキュリティオプションをネゴシエートするための範囲内のいくつかのアクションがあります。WCFのメッセージセキュリティのMSDNページで、WCFがWS-Security仕様を使用していることがわかります。この仕様の詳細については、 WS-Security 2004仕様(pdf)を見つけたこのページにアクセスしてください。これは、論文の公式参照が必要な場合にも役立つことがあります。

を暗号化しますか?
アルゴリズムは、すでに述べたように、(証明書の助けを借りて取得したキーを使用して)資格情報とメッセージの両方を暗号化します:-)。メッセージトレースを有効にすると、これを確認でき。資格情報とメッセージ本文の両方が、選択したアルゴリズムで暗号化されます。


免責事項:私はまだWCFの学習曲線のどこかにいるので、論文の成績がこれに依存している場合は、私の主張を再確認することをお勧めします:D

于 2012-09-11T22:35:46.363 に答える