none
WCF Security (Certificate and Shared SSL RRS feed

  • Pergunta

  • Hi guys
    I'm studing WCF
    I host my service at https://my_domain.kinghost.net/~my_domain/Service.svc

    my web.config 
    [CODE]
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>

      <system.web>
        <compilation debug="false" />
        <authentication mode="Forms" />
        <anonymousIdentification enabled="true"/>
        <customErrors mode="Off"/>
      </system.web>
      <system.serviceModel>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
        <bindings>
          <wsHttpBinding>
            <binding name="wsHttpBindingWithMessageSecurity">
              <security mode="Message">
                <message clientCredentialType="UserName" />
    <!--            <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> -->
              </security>
            </binding>
          </wsHttpBinding>
        </bindings>
        <services>
          <service name="ServicoWCF.CalcService" behaviorConfiguration="ServicoWCF.CalculatorServiceBehavior">
            <endpoint address="" binding="wsHttpBinding" contract="ServicoWCF.ICalcService" bindingConfiguration="wsHttpBindingWithMessageSecurity">
    <!--          
              <identity>
                <dns value="localhost" />
              </identity>
    -->         
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8732/" />
              </baseAddresses>
            </host>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="ServicoWCF.CalculatorServiceBehavior">
              <serviceMetadata  httpGetEnabled="True" httpsGetEnabled="True"/>
              <serviceDebug includeExceptionDetailInFaults="False" />
              <serviceCredentials>
                <serviceCertificate
                    findValue="xx xx xx xx xx xx xx xx xx xx xx xx xx xx"
                    storeLocation="LocalMachine"
                    storeName="My"
                    x509FindType="FindBySerialNumber" />
                <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCFCustomAuthentication.CustomUsernamePasswordValidator, WCFCustomAuthentication" />
              </serviceCredentials>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>

    </configuration>
    [/CODE]

    Ao tentar acessá-lo obtenho o seguinte erro:
    When I try to access:

    Server Error in '/~my_domain' Application.

    Identificador inválido.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

    Exception Details: System.Security.Cryptography.CryptographicException: Identificador inválido.


    Source Error: 

    An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

    Stack Trace: 

    [CryptographicException: Identificador inválido.
    ]
     System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer) +9719295
     System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean 
    randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle) +75
     System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair() +89
     System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean
     useDefaultKeySize) +162
     System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey() +171
     System.ServiceModel.Security.SecurityUtils.EnsureCertificateCanDoKeyExchange(X509Certificate2 certificate) +68
    
    [ArgumentException: It is likely that certificate 'CN=*.kinghost.net, OU=EssentialSSL Wildcard, OU=Domain Control 
    Validated' may not have a private key that is capable of
     key exchange or the process may not have access rights for the private key. Please see inner exception for detail.]
     System.ServiceModel.Security.SecurityUtils.EnsureCertificateCanDoKeyExchange(X509Certificate2 certificate) +12263404
     System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateServerX509TokenProvider() +36
     System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateLocalSecurityTokenProvider
    (RecipientServiceModelSecurityTokenRequirement recipientRequirement) +63
     System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateSecurityTokenProvider(SecurityTokenRequirement 
    requirement) +48
     System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateTlsnegoServerX509TokenProvider
    (RecipientServiceModelSecurityTokenRequirement recipientRequirement) +191
    
    continua....


    Somebody knows what happened?
    Thanks

    Sorry bad English :D
    • Editado Fabiano Vilela quarta-feira, 18 de agosto de 2010 14:33 fora do Layout do forum
    terça-feira, 17 de agosto de 2010 20:56

Respostas

  • Boas Fabiano,

    Quando você utiliza um certificado no elemento serviceCertificate, o processo que gerencia a execução do seu serviço, possui uma identidade, que se for o IIS, na maioria das vezes esse usuário é o Network Service.

    Este usuário precisa ter acesso a chave privada do certificado, para que ele possa extraí-la para assim conseguir decriptografar as mensagens que chegam até o serviço. O problema é que para dar permissão ao certificado, exige privilégios administrativos (http://msdn.microsoft.com/en-us/library/aa717039.aspx), e não garanto que uma empresa de terceiro te dará essa flexibilidade.

    Acredito que o ideal seria mesmo você recorrer ao suporte técnico deles.
    http://www.israelaece.com
    quarta-feira, 18 de agosto de 2010 19:20
    Moderador

Todas as Respostas

  • Boas Fabiano,

    Pela mensagem, parece que a aplicação que hospeda o serviço não tem privilégios de acesso ao certificado (chave privada). Você está hospedando no IIS?
    http://www.israelaece.com
    quarta-feira, 18 de agosto de 2010 10:55
    Moderador
  • Boas Fabiano,

    Pela mensagem, parece que a aplicação que hospeda o serviço não tem privilégios de acesso ao certificado (chave privada). Você está hospedando no IIS?
    http://www.israelaece.com

     Olá Israel,

    Estou hospedando o serviço em meu subdominio na kinghost.com.br, e pelo painel de controle não tenho muito controle, somente criei a aplicação e upei o serviço.

    Estou começando agora com WCF, não tenho muito experiência nesta área. Tudo que tenho "aprendido" até agora devo a você xD. Seu blog foi o ponto de partida dos meus estudos. Até antes de implementar a parte de segurança foi tranquilo implementar o Serviço, mas esta parte de segurança, certificados e etc já comecei a ter muitos problemas, como eu seu blog quanto em todos os lugares que pesquisei só achei exemplos de serviços rodando localmente, tanto como self-host quanto no IIS, mas de qualquer forma estes exemplos me ajudaram a iniciar.

    Na kinghost fornece gratuitamente SSL Compartilhado e o endereço fica da seguinte forma https://fabianovilela.kinghost.net/~fabianovilela/CalcService.svc 

    Como faria para dar o privilégio de acesso ao certificado?

    Desde já agradeço;

     

    quarta-feira, 18 de agosto de 2010 14:22
  • Boas Fabiano,

    Quando você utiliza um certificado no elemento serviceCertificate, o processo que gerencia a execução do seu serviço, possui uma identidade, que se for o IIS, na maioria das vezes esse usuário é o Network Service.

    Este usuário precisa ter acesso a chave privada do certificado, para que ele possa extraí-la para assim conseguir decriptografar as mensagens que chegam até o serviço. O problema é que para dar permissão ao certificado, exige privilégios administrativos (http://msdn.microsoft.com/en-us/library/aa717039.aspx), e não garanto que uma empresa de terceiro te dará essa flexibilidade.

    Acredito que o ideal seria mesmo você recorrer ao suporte técnico deles.
    http://www.israelaece.com
    quarta-feira, 18 de agosto de 2010 19:20
    Moderador
  • Boas Fabiano,

    Quando você utiliza um certificado no elemento serviceCertificate, o processo que gerencia a execução do seu serviço, possui uma identidade, que se for o IIS, na maioria das vezes esse usuário é o Network Service.

    Este usuário precisa ter acesso a chave privada do certificado, para que ele possa extraí-la para assim conseguir decriptografar as mensagens que chegam até o serviço. O problema é que para dar permissão ao certificado, exige privilégios administrativos (http://msdn.microsoft.com/en-us/library/aa717039.aspx), e não garanto que uma empresa de terceiro te dará essa flexibilidade.

    Acredito que o ideal seria mesmo você recorrer ao suporte técnico deles.
    http://www.israelaece.com

     Obrigado Israel,

    Já abri um ticket junto ao suporte.

    Depois postarei um feed back sobre o problema.

     

     

    quarta-feira, 18 de agosto de 2010 20:31