none
Erro: Keyset does not exist RRS feed

  • Pergunta

  • Estou com o problema abaixo, ele parece achar o certificado mas não essa "chave", eu gerei a certificadora, importei para TrustedPeople e depois gerei o certificado.

    Comando para gerar certificadora:

    makecert -n "CN=PSCA" -r -sv PSCA.pvk PSCA.cer

    Comando para gerar certificado:

    makecert -pe -n "CN=CertificadoPS" -ss my -sky exchange -sk CertificadoPS  
             
    -iv PSCA.pvk -ic PSCA.cer -sr localmachine MyCert.cer

    Erro:

      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: Keyset does not exist


    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: Keyset does not exist
    ]
      System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer) +7715262
      System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle) +67
      System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair() +83
      System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize) +226
      System.Security.Cryptography.RSACryptoServiceProvider..ctor(CspParameters parameters) +9
      System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey() +202
      System.ServiceModel.Security.SecurityUtils.EnsureCertificateCanDoKeyExchange(X509Certificate2 certificate) +69
    
    [ArgumentException: The certificate 'CN=CertificadoPS' must have a private key that is capable of key exchange. The process must have access rights for the private key.]
      System.ServiceModel.Security.SecurityUtils.EnsureCertificateCanDoKeyExchange(X509Certificate2 certificate) +11594102
      System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateServerX509TokenProvider() +36
      System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateLocalSecurityTokenProvider(RecipientServiceModelSecurityTokenRequirement recipientRequirement) +63
      System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateSecurityTokenProvider(SecurityTokenRequirement requirement) +54
      System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateTlsnegoServerX509TokenProvider(RecipientServiceModelSecurityTokenRequirement recipientRequirement) +140
      System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateTlsnegoSecurityTokenAuthenticator(RecipientServiceModelSecurityTokenRequirement recipientRequirement, Boolean requireClientCertificate, SecurityTokenResolver& sctResolver) +466
      System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, SecurityTokenResolver& outOfBandTokenResolver) +661
      System.ServiceModel.Security.SessionRenewSecurityTokenManager.CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, SecurityTokenResolver& outOfBandTokenResolver) +85
      System.ServiceModel.Security.SymmetricSecurityProtocolFactory.OnOpen(TimeSpan timeout) +11298171
      System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout) +21
      System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +261
      System.ServiceModel.Security.SecurityProtocolFactory.Open(Boolean actAsInitiator, TimeSpan timeout) +23
      System.ServiceModel.Security.SecurityListenerSettingsLifetimeManager.Open(TimeSpan timeout) +80
      System.ServiceModel.Channels.SecurityChannelListener`1.OnOpen(TimeSpan timeout) +204
      System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +261
      System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout) +72
      System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +261
      System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) +107
      System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +261
      System.ServiceModel.Security.SecuritySessionSecurityTokenAuthenticator.OnOpen(TimeSpan timeout) +129
      System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout) +21
      System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +261
      System.ServiceModel.Security.CommunicationObjectSecurityTokenAuthenticator.Open(TimeSpan timeout) +20
      System.ServiceModel.Security.SecurityUtils.OpenTokenAuthenticatorIfRequired(SecurityTokenAuthenticator tokenAuthenticator, TimeSpan timeout) +34
      System.ServiceModel.Security.SecuritySessionServerSettings.OnOpen(TimeSpan timeout) +664
      System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout) +21
      System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +261
      System.ServiceModel.Security.SecurityListenerSettingsLifetimeManager.Open(TimeSpan timeout) +133
      System.ServiceModel.Channels.SecurityChannelListener`1.OnOpen(TimeSpan timeout) +204
      System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +261
      System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout) +72
      System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +261
      System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) +107
      System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +261
      System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath) +121
      System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) +479
    
    [ServiceActivationException: The service '/PSControllerUIBranch/Logon.svc' cannot be activated due to an exception during compilation. The exception message is: The certificate 'CN=CertificadoPS' must have a private key that is capable of key exchange. The process must have access rights for the private key..]
      System.ServiceModel.AsyncResult.End(IAsyncResult result) +11531006
      System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +194
      System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context, Boolean flowContext) +176
      System.ServiceModel.Activation.HttpModule.ProcessRequest(Object sender, EventArgs e) +278
      System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68
      System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
    


    Version Information: Microsoft .NET Framework Version:2.0.50727.4408; ASP.NET Version:2.0.50727.5053

    Server Error in '/PSControllerUIBranch' Application.

    Keyset does not exist

     


    Brandão .NET Developer
    quarta-feira, 19 de janeiro de 2011 16:32

Respostas

  • Boas Brandão,

    Usa o FindPrivateKey, que ele apontará para um arquivo nomeado com um GUID em algum lugar oculto no seu sistema. O arquivo *.pvk é a chave privada do certificado raiz. Tente seguir os passos:

    - Baixe os samples do WCF aqui: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=0043041F-95D6-4EB7-966A-C21A737E193A&amp%3Bdisplaylang=en
    - Descompacte
    - Na pasta Tools, você terá um projeto chamado FindPrivateKey. Compile-o para dar origem ao utilitário
    - Vá no prompt de comando e rode o seguinte comando:

    C:\FindPrivateKey My LocalMachine -n "CN=NomeDoCertificado"

    Ele mostrará um arquivo no disco, em uma pasta oculta nomeado com um GUID. Com o endereço dele, você vai até ele através do Windows Explorer e dá a permissão de leitura para este arquivo para o usuário do IIS (conceda também ao ASPNET, pois no Windows XP, deve ser este usuário que é utilizado).

    Com isso, tente rodar o projeto para ver se está OK.


    http://www.israelaece.com
    • Marcado como Resposta BrandãoMVP segunda-feira, 31 de janeiro de 2011 19:02
    quinta-feira, 20 de janeiro de 2011 17:43
    Moderador

Todas as Respostas

  • Boas Brandão,

    Você está hospedando o serviço no IIS? Se sim, você conseguiu conceder as permissões de acesso (ACL) à chave privada do certificado (via FindPrivateKey)?
    http://www.israelaece.com
    quinta-feira, 20 de janeiro de 2011 00:00
    Moderador
  • Israel,

    Antes de ver sua resposta eu alterei o Web.Config que estava assim:

    <bindings>
     <wsHttpBinding>
    	<binding name="LogonBiding">
    	 <security mode="Message">
    		<message clientCredentialType="Certificate"/>
    
    	 </security>
    	</binding>
     </wsHttpBinding>
    </bindings>
    

    para:

    <bindings>
     <wsHttpBinding>
    	<binding name="LogonBiding">
    	 <security mode="TransportWithMessageCredential">
    		<transport clientCredentialType="Certificate"/>
    		<message clientCredentialType="UserName"/>
    	 </security>
    	</binding>
     </wsHttpBinding>
    </bindings>

    Feito isso o erro que eu postei que aconteceia ao acessar o arquivo .SVC em modo debug parou de acontecer. Mas ao executar o método do serviço um novo erro aconteceu:

    Test method Inst.PS.ControllerUI.Test2.LogonTest.Faz_Autenticacao_Com_Certificado threw exception: System.ServiceModel.CommunicationException: An error occurred while making the HTTP request to https://localhost/PSControllerUIwcfBranch/Logon.svc. This could be due to the fact that the server certificate is not configured properly with HTTP.SYS in the HTTPS case. This could also be caused by a mismatch of the security binding between the client and the server. ---> System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send. ---> System.IO.IOException: Authentication failed because the remote party has closed the transport stream..

    Tentei agora o procedimento que você recomendou:

    1. Não tenho o FindPrivateKey, e neste momento não consigo baixar.
    2. Mas sei onde esta o arquivo .PVK
    3. Não consegui achar o icacls ou cacls, estou usando Win XP Pro
    4. Mas tentei alterar pelo Windows Explorer
    5. Adicionei o usuário "Network Service" com Read e Read & Execute, mas deu o mesmo erro

    Você comentou alguma alteração no IIS...


    Brandão .NET Developer
    quinta-feira, 20 de janeiro de 2011 13:49
  • Boas Brandão,

    Qual a versão do IIS do Windows XP? IIS5? Se sim, o usuário que gerencia o processo do IIS não é diferente de Network Service? IUSR_NomeDaMaquina?
    http://www.israelaece.com
    quinta-feira, 20 de janeiro de 2011 15:03
    Moderador
  • Você esta certo quanto ao usuário, estou no IIS5, do WinXP. Porém o erro persiste!

    O arquivo da chave privada do certificado é o .PVK? Gerado quando o certificado é criado, certo?

    Vou postar o meu Web.Config e o App.Config, do projeto de teste.

    Web.Config, do projeto do serviço

    <system.serviceModel>
      <services>
       <service name="Inst.PS.ControllerUI.Logon"
            behaviorConfiguration="LogonBehavior">
        <endpoint address="" 
             binding="wsHttpBinding" 
             bindingConfiguration="LogonBiding"
             contract="Inst.PS.ControllerUI.ILogon">
         <identity>
          <dns value=""/>
         </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
       </service>
      </services>
      <behaviors>
       <serviceBehaviors>
        <behavior name="LogonBehavior">
         <serviceMetadata httpGetEnabled="true"/>
         <serviceCredentials>
          <userNameAuthentication userNamePasswordValidationMode="Custom"
                      customUserNamePasswordValidatorType="Inst.PS.ControllerUI.CustomUserValidator, Inst.PS.ControllerUI"/>
          <serviceCertificate findValue="InstPS"
                    x509FindType="FindBySubjectName"
                    storeLocation="LocalMachine"
                    storeName="My"/>
          <clientCertificate>
           <authentication certificateValidationMode="PeerOrChainTrust"
                   revocationMode="NoCheck"/>
          </clientCertificate>
         </serviceCredentials>
         <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
       </serviceBehaviors>
      </behaviors>
      <bindings>
       <wsHttpBinding>
        <binding name="LogonBiding">
         <security mode="TransportWithMessageCredential">
          <transport clientCredentialType="Certificate"/>
          <message clientCredentialType="UserName"/>
         </security>
        </binding>
       </wsHttpBinding>
      </bindings>
     </system.serviceModel>
    

    App.Config, do projeto de teste

    <system.serviceModel>
      <bindings>
       <wsHttpBinding>
        <binding name="WSHttpBinding_ILogon" 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="TransportWithMessageCredential">
          <transport clientCredentialType="None" proxyCredentialType="None"
           realm="" />
          <message clientCredentialType="UserName" negotiateServiceCredential="true"
           algorithmSuite="Default" establishSecurityContext="true" />
         </security>
        </binding>
       </wsHttpBinding>
      </bindings>
      <client>
       <endpoint address="https://localhost/PSControllerUIwcfBranch/Logon.svc"
        binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ILogon"
        contract="ControllerUIService.ILogon" name="WSHttpBinding_ILogon">
        <identity>
         <dns value="" />
        </identity>
       </endpoint>
      </client>
     </system.serviceModel>
    

    Brandão .NET Developer
    quinta-feira, 20 de janeiro de 2011 16:16
  • Boas Brandão,

    Usa o FindPrivateKey, que ele apontará para um arquivo nomeado com um GUID em algum lugar oculto no seu sistema. O arquivo *.pvk é a chave privada do certificado raiz. Tente seguir os passos:

    - Baixe os samples do WCF aqui: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=0043041F-95D6-4EB7-966A-C21A737E193A&amp%3Bdisplaylang=en
    - Descompacte
    - Na pasta Tools, você terá um projeto chamado FindPrivateKey. Compile-o para dar origem ao utilitário
    - Vá no prompt de comando e rode o seguinte comando:

    C:\FindPrivateKey My LocalMachine -n "CN=NomeDoCertificado"

    Ele mostrará um arquivo no disco, em uma pasta oculta nomeado com um GUID. Com o endereço dele, você vai até ele através do Windows Explorer e dá a permissão de leitura para este arquivo para o usuário do IIS (conceda também ao ASPNET, pois no Windows XP, deve ser este usuário que é utilizado).

    Com isso, tente rodar o projeto para ver se está OK.


    http://www.israelaece.com
    • Marcado como Resposta BrandãoMVP segunda-feira, 31 de janeiro de 2011 19:02
    quinta-feira, 20 de janeiro de 2011 17:43
    Moderador
  • Israel,

    Consegui executar todo o procedimento, mas foi sem sucesso... Mesmo erro!


    Brandão .NET Developer
    quinta-feira, 20 de janeiro de 2011 20:36
  • Boas Brandão,

    Já tentou dar permissão de Everyone (apenas para testes) para a chave privada do certificado?
    http://www.israelaece.com
    sexta-feira, 21 de janeiro de 2011 09:56
    Moderador
  • Sim, eu esqueci de comentar no post anterior que já tentei fazer isso... Sem sucesso. Seria só esse arquivo? Esgotei todas as possibilidades, talvez seja alguma restrição na minha máquina, já que devem existir políticas de segurança. Por exemplo, apesar de ser Administrador a maioria dos itens do painel de controle não esta disponível para mim.
    Brandão .NET Developer
    sexta-feira, 21 de janeiro de 2011 16:22
  • Boas Brandão,

    Não consegue criar uma máquina virtual como laboratório?

    - Qual versão do Windows XP está utilizando?
    - Qual a versão do IIS?
    - Qual a versão do .NET Framework?
    - Está querendo fazer uma autenticação via username/password para o seu serviço?


    http://www.israelaece.com
    segunda-feira, 24 de janeiro de 2011 09:24
    Moderador
  • Israel,


    Estou usando o Win XP Pro, com o IIS 5, .Net Framework 3.5, tudo devidamente com updates.

    Sim, eu quero passar um username/password, que vai ser validado através de um WS legado.

    Vou tentar isolar um ambiente para testes, e dou um feedback por aqui.

    Valeu!

    Brandão


    Brandão .NET Developer
    quinta-feira, 27 de janeiro de 2011 01:23
  • Israel,

    Só para comunicar que refiz minha PoC e deu certo! Obrigado pelas dicas e pelos posts do seu blog, me ajudaram bastante.

    Os passos nesta thread também são pertinentes, por isso estou marcando como resposta.

    Brandão


    Brandão .NET Developer
    segunda-feira, 31 de janeiro de 2011 19:02