Permissão para IUSR para CertOpenSystemStore ()

2

Meu aplicativo CGI está tentando usar o SSPI Schannel para criar uma conexão TLS com outro servidor. link

O processo de handshake começa pela verificação de um certificado no armazenamento de certificados "MY" link

Esta função retorna zero e GetLastError também retorna zero! Eu suponho que isso é um problema de permissões. Como faço para que isso funcione sem elevar a IUSR ao administrador, por exemplo?

ADICIONADO

O acesso aos certificados do usuário requer a execução como usuário específico e o acesso à chave privada do usuário requer que o usuário tenha feito logon localmente com a senha ou que o servidor esteja habilitado para delegação.

Certificados de máquina são legíveis por todos, mas o acesso à chave privada requer direitos de administrador (ou usuário local), a menos que você ajuste a ACL.

ADICIONADO

Nesta situação, não há restrições nos certificados, mas o armazenamento de certificados "MY" está vazio e não quero comprar um certificado apenas para isso.

Atualmente estou usando o WS2003. O servidor ao qual estou me conectando é gmail.com para enviar e-mails usando o TLS. Meu código pode procurar por um certificado, mas eu não tenho um. Na leitura que fiz, parece uma grande dor de cabeça obter um certificado, com registro e compra e instalação, caso contrário, você acaba de obter uma solução temporária que não ajuda. A menos que você saiba de uma maneira fácil de obter um certificado, isso é muito mais problemático do que eu quero ir apenas para enviar e-mail de um aplicativo CGI. Existe alguma outra maneira?

Eu aprecio muito sua ajuda Joe, mas US $ 30 / ano x nServers não é apenas uma opção. Eu estou querendo saber se há uma maneira de entregar a tarefa para outro processo que está sendo executado com privildeges Admin, como um serviço, talvez? Eu poderia até mesmo criar um aplicativo que está programado para ler de uma determinada pasta e enviar e-mails encontrados lá. Além disso, eu teria que tentar elevar o aplicativo CGI para o Administrador.

ADICIONADO

Goyuix, obrigado pelas sugestões. O desafio é fornecer uma solução autônoma sem recorrer a outras bibliotecas como .NET (60MB) ou ASP com seus problemas de atendimento.

Você está correto, eu só preciso de autenticação do servidor. Eu não sabia que era possível autenticar apenas um lado. sua declaração: "Não ter certificado de cliente não deve impedi-lo de estabelecer um canal seguro para SMTP. Você pode precisar codificar em torno dessa parte do handshake". acabou por ser a solução.

Isso me lembra da velha piada do encanador. O encanador é chamado para desbloquear o dreno. Ele dá uma olhada, pega um martelo e bate no cano uma vez. Ele pede US $ 180 para 5 minutos de trabalho discriminados como, $ 30 callout charge e US $ 150 para comprar o cachimbo.

Obrigado a ambos. Este tem sido um longo dia de luta.

    
por Mike Trader 21.01.2010 / 22:51

2 respostas

1

A única razão pela qual o código schannel está tentando abrir o armazenamento "MY" é procurar um certificado em potencial que possa ser usado para autenticação de cliente como parte do handshake inicial. No seu exemplo, imagino que você realmente se importa apenas com a autenticação do servidor (por exemplo, certifique-se de que seu cliente esteja falando com o servidor que ele acha que é). Não ter certificado de cliente não deve impedi-lo de estabelecer um canal seguro para SMTP. Você pode apenas precisar codificar essa parte do handshake.

Se você precisar de autenticação de cliente, provavelmente terá que:

  • eleve a conta IUSR e instale um certificado na loja de máquinas
  • alterar o pool de aplicativos para ser executado como um usuário diferente e combater isso

Quanto a consertar o código vinculado ... bem - eu sugeriria tentar o código SmtpClient que vem com o .NET framework, se isso for uma opção. Suporta comunicações encriptadas e deveria, em teoria, "apenas funcionar". O C ++ gerenciado é mesmo uma opção? Ou melhor ainda, basta escrever um manipulador ASP.NET para isso?

link

Você também pode tentar fazer algumas perguntas relacionadas ao código em StackOverflow.com , as pessoas podem ajudar também.

    
por 26.01.2010 / 23:57
1

A melhor opção eu é usar um certificado de máquina e conceder permissão à conta IUSR para ler a chave privada do certificado. Este é um passo manual, mas muito fácil, que só precisa ser feito uma vez.

Existem outros requisitos em sua situação que impediriam a alteração das permissões do certificado?

Instruções para começar

Primeiro, você precisa de um certificado. Você pode gerar o seu próprio, mas dependendo de como você quer usá-lo e do outro lado que irá validá-lo, você pode precisar comprar um. Não vou cobrir como gerar um certificado. Se você nunca trabalhou com certificados e autoridades de certificação antes, recomendo aprender sobre eles primeiro.

Suponho que você esteja no Windows Server 2003, a menos que você comente o contrário.

1) Instale o certificado no armazenamento da máquina. Vá para Iniciar | Executar e insira no MMC para obter um console do MMC em branco. Vá para Arquivo | Adicionar / Remover Snap-in. Clique no botão Adicionar para selecionar o snap-in. Escolha Certificados na lista e clique em Adicionar. Escolha a opção Conta do computador, depois, Concluir, Fechar e finalmente OK.

2) Importando o certificado para o Armazenamento de Máquinas. Expanda a árvore e escolha a pasta Pessoal. Clique com o botão direito do mouse em Pessoal e escolha Todas as Tarefas, Importar. Siga o assistente para concluir o processo. O certificado deve estar agora no armazenamento da máquina.

3) Ajustando as permissões da chave privada. No Windows 2008, isso é adicionado à GUI do Gerenciador de Certificados. No Windows 2003, você precisará fazer o download do Windows Server 2003 Resource Kit Tools . Use o seguinte formato de comando para definir permissões:

C:\Program Files\Windows Resource Kits\Tools\winhttpcertcfg.exe -g -c LOCAL_MACHINE\My -s "mycert" -a "USER_ACCOUNT" 

Onde 'LOCAL_MACHINE \ My' é o armazenamento de Certificado Pessoal na máquina local, 'mycert' é o nome do seu certificado e USER_ACCOUNT é a conta que receberá permissões de leitura para a chave privada. Você pode tentar a conta IUSR, mas pode ser necessário usar o 'NETWORK SERVICE' dependendo do contexto exato em que seu aplicativo CGI está sendo executado. Você precisará reiniciar o IIS para que as alterações entrem em vigor. A documentação do WinHttpCertCfg cobre o que está sendo feito.

Agora você deve ter permissões para acessar a chave privada. Você ainda usará CertOpenSystemStore com o sinalizador MY.

Espero que ajude.

Editar 2:

Um lugar fácil para obter um certificado com uma autoridade reconhecida é o GoDaddy. Você pode obter um certificado SSL válido por 1 ano por US $ 30. Existem outros lugares que podem ser mais baratos se você procurar um pouco. Não é muito difícil de fazer. A maioria dos sites é muito amigável e facilita a compra de um certificado.

Como você está fazendo a autenticação mútua, você precisará de um certificado com uma autoridade válida, e não apenas uma auto-assinada, que pode ser criada porque o servidor do Gmail não teria como confirmá-la.

    
por 24.01.2010 / 23:29