Howto Serviço WCF HTTPS vinculação e configuração de ponto de extremidade no IIS com o Load Balancer?

7

Temos um serviço WCF que está sendo hospedado em um conjunto de 12 máquinas. Existe um balanceador de carga que é um gateway para essas máquinas.

Agora o site está configurado como SSL; como em um usuário acessa através de um URL com https. Eu sei o quanto, a URL que aborda o site é https, mas nenhum dos servidores tem uma ligação https ou está configurado para exigir SSL. Isso me leva a acreditar que o balanceador de carga lida com o https e a conexão do balanceador para os servidores não é criptografada (isso acontece atrás do firewall, portanto não há nada de mais).

O problema que estamos tendo é que, quando um cliente Silverlight tenta acessar um serviço WCF, está recebendo um erro "Não encontrado". Configurei um site de teste junto com nossas máquinas de desenvolvedor e certifiquei-me de que as ligações e os terminais no web.config funcionem com o cliente. Parece ser o caso no ambiente de produção que recebemos esse erro.

Há algo de errado com o seguinte web.config? Devemos estar configurando como o https é tratado de uma maneira diferente?

Estamos perdidos neste momento desde que eu tentei todas as soluções programáticas com endpoints e bindings. Nenhuma das soluções que encontrei lidam com um balanceador de carga da maneira como estamos lidando.

Informações do modelo de serviço Web.config:

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="TradePMR.OMS.Framework.Services.CRM.CRMServiceBehavior">
          <serviceMetadata httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
        <behavior name="TradePMR.OMS.Framework.Services.AccountAggregation.AccountAggregationBehavior">
          <serviceMetadata httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>          
      <customBinding>    
        <binding name="SecureCRMCustomBinding">
          <binaryMessageEncoding />
          <httpsTransport />
        </binding>

        <binding name="SecureAACustomBinding">
          <binaryMessageEncoding />
          <httpsTransport />
        </binding>
      </customBinding>
      <mexHttpsBinding>
        <binding name="SecureMex" />
      </mexHttpsBinding>
    </bindings>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

    <!--Defines the services to be used in the application-->
    <services>
      <service behaviorConfiguration="TradePMR.OMS.Framework.Services.CRM.CRMServiceBehavior"
        name="TradePMR.OMS.Framework.Services.CRM.CRMService">

        <endpoint address="" binding="customBinding" bindingConfiguration="SecureCRMCustomBinding"
          contract="TradePMR.OMS.Framework.Services.CRM.CRMService" name="SecureCRMEndpoint" />

        <!--This is required in order to be able to use the "Update Service Reference" in the Silverlight application-->
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>

      <service behaviorConfiguration="TradePMR.OMS.Framework.Services.AccountAggregation.AccountAggregationBehavior"
        name="TradePMR.OMS.Framework.Services.AccountAggregation.AccountAggregation">

        <endpoint address="" binding="customBinding" bindingConfiguration="SecureAACustomBinding"
          contract="TradePMR.OMS.Framework.Services.AccountAggregation.AccountAggregation" name="SecureAAEndpoint" />

        <!--This is required in order to be able to use the "Update Service Reference" in the Silverlight application-->
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>
</configuration>

O ServiceReferences.ClientConfig tem esta aparência:

<configuration>
    <system.serviceModel>
        <bindings>
            <customBinding>
                <binding name="StandardAAEndpoint">
                    <binaryMessageEncoding />
                    <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
                <binding name="SecureAAEndpoint">
                    <binaryMessageEncoding />
                    <httpsTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
                <binding name="StandardCRMEndpoint">
                    <binaryMessageEncoding />
                    <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
                <binding name="SecureCRMEndpoint">
                    <binaryMessageEncoding />
                    <httpsTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
            </customBinding>
        </bindings>
        <client>
            <endpoint address="https://Service2.svc"
                binding="customBinding" bindingConfiguration="SecureAAEndpoint"
                contract="AccountAggregationService.AccountAggregation" name="SecureAAEndpoint" />
            <endpoint address="https://Service1.svc"
                binding="customBinding" bindingConfiguration="SecureCRMEndpoint"
                contract="CRMService.CRMService" name="SecureCRMEndpoint" />
        </client>
    </system.serviceModel>
</configuration>

(Os endereços são irrelevantes, pois são construídos dinamicamente para que apontem para a máquina do desenvolvedor ou para o servidor de produção)

    
por Mike G 02.11.2009 / 23:42

3 respostas

3

Estou respondendo isso como algumas pessoas sabem que o aplicativo está em produção, mas não encontrei resposta aqui.

Não conseguimos resolver isso no cenário acima. HTTPS do cliente para o balanceador de carga está OK. O problema é quando o balanceador de carga faz essa conexão e aponta para um servidor da Web em um formato não criptografado. Isso aparentemente quebra o protocolo WCF. O cliente está enviando comunicações HTTPS, mas o servidor está recebendo comunicação não criptografada.

Resolvemos o problema passando por todas as comunicações SSL.

A melhor "solução" seria verificar se o seu serviço WCF não estava usando o método HTTP de transmissão e configurando seu balanceador de carga para passar essas comunicações sem alterações. O balanceador de carga poderia, então, fazer seu procedimento operacional padrão no tráfego HTTPS regular gerado a partir do site.

Eu não testei isso, pois nosso cenário de aplicativos exige que o serviço WCF seja compatível com o ASP.NET.

Espero que alguém possa elaborar mais algumas informações.

    
por 18.02.2010 / 20:08
1

Eu percebi isso como uma pergunta muito antiga, mas recentemente encontrei esse problema e o resolvi usando as etapas fornecidas aqui:

link

Como uma das outras respostas aqui, ele requer a subclassificação de HttpTransportElement e seu BindingElementType, para que ele retorne um ISecurityCapabilities que "engana o WCF" para pensar que a conexão é segura. Você pode então usar este elemento tranport em um customBinding.

    
por 05.03.2018 / 17:19
0

Tivemos o mesmo problema e optamos por uma solução fornecida por um desenvolvedor da Microsoft. Essa solução é criar um HttpTransport personalizado que substitui o requisito de ter SSL do balanceador de carga para o servidor.

    
por 11.05.2010 / 21:21