Exemplo de FindPrivateKey
Pode ser difícil encontrar o local e o nome do arquivo de chave privada associado a um certificado X.509 específico no repositório de certificados. A ferramenta FindPrivateKey.exe facilita esse processo.
Importante
Você deve criar o exemplo de FindPrivateKey antes de usá-lo.
Os certificados X.509 são instalados por um Administrador ou qualquer usuário no computador. No entanto, o certificado pode ser acessado por um serviço em execução em uma conta diferente. Por exemplo, a conta SERVIÇO DE REDE.
Essa conta pode não ter acesso ao arquivo de chave privada porque o certificado não foi instalado originalmente por ela. A ferramenta FindPrivateKey fornece a localização de um determinado arquivo de chave privada do Certificado X.509. Você pode adicionar ou remover permissões para esse arquivo depois de saber o local do arquivo de chave privada dos certificados X.509 específicos.
Os exemplos que usam certificados para segurança empregam a ferramenta FindPrivateKey no arquivo Setup.bat. Depois que o arquivo de chave privada for encontrado, você poderá usar outras ferramentas, como Cacls.exe, para definir os direitos de acesso apropriados para o arquivo.
Ao executar um serviço WCF (Windows Communication Foundation) em uma conta de usuário, como um executável auto-hospedado, verifique se a conta de usuário tem acesso somente leitura ao arquivo. Ao executar um serviço WCF nos Serviços de Informações da Internet (IIS), as contas padrão em que o serviço é executado são o SERVIÇO DE REDE no IIS 7 e versões anteriores ou a Identidade do Pool de Aplicativos no IIS 7.5 e versões posteriores. Para obter mais informações, consulte Identidades do pool de aplicativos.
Privilégios de leitura
Ao acessar um certificado para o qual o processo não tem privilégio de leitura, você verá uma mensagem de exceção semelhante ao exemplo a seguir:
System.ArgumentException was unhandled
Message="The certificate 'CN=localhost' must have a private key that is capable of key exchange. The process must have access rights for the private key."
Source="System.ServiceModel"
Quando isso ocorrer, use a ferramenta FindPrivateKey para localizar o arquivo de chave privada e defina o direito de acesso para o processo em que o serviço está em execução. Por exemplo, isso pode ser feito com a ferramenta Cacls.exe, conforme mostrado no exemplo a seguir:
cacls.exe "C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\8aeda5eb81555f14f8f9960745b5a40d_38f7de48-5ee9-452d-8a5a-92789d7110b1" /E /G "NETWORK SERVICE":R
Convenções – entradas de linha de comando
"[option]" representa um conjunto opcional de parâmetros.
"{option}" representa um conjunto obrigatório de parâmetros.
"option1 | option2" representa uma opção entre conjuntos de opções.
"<value>" representa um valor de parâmetro a ser inserido.
Uso
FindPrivateKey <storeName> <storeLocation> [{ {-n <subjectName>} | {-t <thumbprint>} } [-f | -d | -a]]
Em que:
Parâmetro | Descrição |
---|---|
<subjectName> |
O nome do assunto do certificado |
<thumbprint> |
A impressão digital do certificado (você pode usar a ferramenta Certmgr.exe para encontrá-la) |
-f |
somente nome do arquivo de saída |
-d |
somente diretório de saída |
-a |
nome absoluto do arquivo de saída |
Se nenhum parâmetro for especificado no prompt de comando, será exibido o texto da ajuda com essas informações.
Exemplos
Este exemplo localiza o nome do arquivo do certificado com um nome de assunto "CN=localhost", no repositório pessoal do usuário atual.
FindPrivateKey My CurrentUser -n "CN=localhost"
Este exemplo localiza o nome do arquivo do certificado com um nome de assunto "CN=localhost", no repositório pessoal do usuário atual e dá a saída dp caminho completo do diretório.
FindPrivateKey My CurrentUser -n "CN=localhost" -a
Este exemplo localiza o nome do arquivo do certificado com uma impressão digital de "03 33 98 63 d0 47 e7 48 71 33 62 64 76 5c 4c 9d 42 1d 6b 52", no repositório Pessoal do Computador Local.
FindPrivateKey My LocalMachine -t "03 33 98 63 d0 47 e7 48 71 33 62 64 76 5c 4c 9d 42 1d 6b 52"