none
Problema servicio WCF internet RRS feed

  • Pregunta

  • Hola a todos:

    Estoy desarrollando un servicio wcf que va a ser llamado por clientes en un escenario internet. El servicio está alojado en IIS7 y acepta sólo http. Para que los clientes nos llamen desde https lo que hacemos es tener un proxy inverso que redirige la petición de https a la aplicación http. Al cliente le damos una url https para que se conecte y lo hace sin problemas, añadiendo la referencia a dicho servicio correctamente. El problema viene cuando intenta crear un cliente y añade en su endpoint la dirección https, ya que le dice lo siguiente:

    System.ArgumentException: El esquema de URI proporcionado 'https' no es válido; se esperaba 'http'.
    Nombre del parámetro: via.

    Os dejo la parte del web.config del servicio:

    <bindings>
      <wsHttpBinding>
        <binding name="ConfigEP">
          <security mode="Message">
            <transport clientCredentialType="None" />
            <message clientCredentialType="Certificate" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true">
      <baseAddressPrefixFilters>
        <add prefix="http://serverInterno/App/"/>
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    <services>
      <service behaviorConfiguration="App.AppM_NameBehavior" name="App.AppM_Name">
        <endpoint address="" behaviorConfiguration="App.AppM_NameEPBehavior" binding="wsHttpBinding" bindingConfiguration="ConfigEP" name="App.AppM_NameEP" bindingNamespace="http://siteName/AppM_Name" contract="App.IAppM_Name" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="App.AppM_NameEPBehavior">
          <wsdlExtensions location="https://urlsegura/App/Appm_Name.svc" singleFile="true" />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="App.AppM_NameBehavior">
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" />
          <serviceCredentials>
            <clientCertificate>
              <authentication customCertificateValidatorType="App.Validador, App" certificateValidationMode="Custom" />
            </clientCertificate>
            <serviceCertificate findValue="XX XX XX XX XX XX XX XX XX XX" x509FindType="FindBySerialNumber" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <extensions>
      <behaviorExtensions>
        <add name="wsdlExtensions" type="WCFExtras.Wsdl.WsdlExtensionsConfig, WCFExtras, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
      </behaviorExtensions>
    </extensions>

    y aquí el app.config del cliente:

    <system.serviceModel>
      <behaviors>
        <endpointBehaviors>
          <behavior name="NewBehavior">
            <clientCredentials>
              <clientCertificate findValue="XX XX XX XX XX XX XX XX XX XX" x509FindType="FindBySerialNumber" />
            </clientCredentials>
          </behavior>
        </endpointBehaviors>
      </behaviors>
      <bindings>
        <wsHttpBinding>
          <binding name="App.AppM_NameEP" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
            <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="None" proxyCredentialType="None" realm="" />
              <message clientCredentialType="Certificate" negotiateServiceCredential="true" algorithmSuite="Default" establishSecurityContext="true" />
            </security>
          </binding>
        </wsHttpBinding>
      </bindings>
      <client>
        <endpoint address="https://urlsegura/App/Appm_Name.svc" binding="wsHttpBinding" bindingConfiguration="App.AppM_NameEP" contract="App.IAppM_Name" name="App.AppM_NameEP">
          <identity>
            <certificate encodedValue="XXXX" />
          </identity>
        </endpoint>
      </client>
    </system.serviceModel>



    Gracias de antemano.

    Un saludo.
    jueves, 18 de agosto de 2011 8:02

Respuestas

  • Hola,

    Creo que con wsHttpBinding, por los link que te pase  y por lo que he leido no lo vas a porder hacer.

    Yo he realizado esto sin instalar certificados en los clientes pero configurando IIS y con otros tipos de Binding, concreatemente con webHttpBinding.

    Te recomiendo que traslades esto a http://connect.microsoft.com/ y esperemos su respuesta.

    Saludos,


    phurtado
    • Marcado como respuesta programadoral jueves, 18 de agosto de 2011 12:41
    jueves, 18 de agosto de 2011 12:11

Todas las respuestas

  • Hola,

     

    Mira esta linea en el config del servidor 

     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" />
    

     

    Como ves httpsGetEnabled marca false.

     

    Otra cosa, que puede ser es la forma en la que tienes establecido el Binding.

     

    <bindings>
     <wsHttpBinding>
      <binding name="ConfigEP">
       <security mode="Message">
        <transport clientCredentialType="None" />
        <message clientCredentialType="Certificate" />
       </security>
      </binding>
     </wsHttpBinding>
    </bindings>
    


    Fijate en estos link

     

    http://www.codeproject.com/KB/WCF/WCF.aspx

    http://msdn.microsoft.com/en-us/library/ms789011.aspx

    http://social.msdn.microsoft.com/Forums/en/wcf/thread/b4d04480-0ed6-4ab2-a737-2deb4218e08c

     

    Ninguno estable el modo de seguridad en mensaje, sino basado en transporte.

     

    Saludos,

     


    phurtado
    jueves, 18 de agosto de 2011 8:55
  • Gracias por tu respuesta.

    En teoría y por lo que yo sé, con habilitar "httpsGetEnabled" a true, lo único que conseguría es que el cliente pudiera ver los metadatos (wsdl) desde https (cosa que ya puede hacer accediendo desde https://urlsegura/App/Appm_Name.svc?wsdl), así que no tendría nada que ver con mi problema.

    En cuanto al resto, ya me he leído estos artículos y no me dicen cómo puedo resolver mi problema, que al fin y al cabo es como llamar a un servicio por https con security mode="Message" sin tener mi website en IIS configurado para https.

    Resumiendo, necesito llamar a mi servicio "https://urlsegura/App/Appm_Name.svc" sin tener que usar el securityMode="Transport" porque me exige que mi aplicación permita SSL cuiando no lo necesito al tener el proxy inverso, ya que dicha url ("https://urlsegura/App/Appm_Name.svc") redirige a "http://serverInterno/App/Appm_Name.svc" que como ves es http.

    Además, no puedo establecer la seguridad a securityMode="Transport" porque mi escenario de internet no me lo permite, ya que mi aplicación es llamada por varios clientes y no puedo establecer una vpn con cada uno, es decir, no puedo depender de basar la autenticación de los clientes en el transporte e instalar un certificado en cada uno (los identifico de manera individual cun una clase customizada que los identifica mediante el certificado de cada uno).

    Un saludo.





    jueves, 18 de agosto de 2011 9:41
  • Hola,

    Creo que con wsHttpBinding, por los link que te pase  y por lo que he leido no lo vas a porder hacer.

    Yo he realizado esto sin instalar certificados en los clientes pero configurando IIS y con otros tipos de Binding, concreatemente con webHttpBinding.

    Te recomiendo que traslades esto a http://connect.microsoft.com/ y esperemos su respuesta.

    Saludos,


    phurtado
    • Marcado como respuesta programadoral jueves, 18 de agosto de 2011 12:41
    jueves, 18 de agosto de 2011 12:11
  • Ok, muchas gracias por la respuesta. En realidad lo que quería saber es si debo habilitar SSL en mi aplicación del IIS.

    Supongo que usaré "TransportWithMessageCredential" para poder mantener la encriptación del mensaje además del "https".

    Un saludo.

    viernes, 19 de agosto de 2011 9:34