Pergunta

Eu estou tentando usar a classe HttpListener em uma aplicação C # para ter um mini servidor web servem conteúdo através de SSL. Para fazer essa necessidade eu usar a ferramenta httpcfg. Eu tenho um arquivo .pfx com o meu público e par de chaves privada. Se eu importar este par de chaves manualmente usando mmc para o armazenamento do computador local, tudo funciona bem. No entanto, se eu importar este par de chaves por meio de programação usando a classe X509Store, eu não sou capaz de se conectar ao meu mini servidor web. Note-se que em ambos os métodos o certificado está sendo importado para a minha loja em LocalMachine. Estranhamente, eu sou capaz de ver o certificado no MMC quando eu programaticamente importá-lo e quando eu vê-lo, a interface do usuário indica que uma chave privada também está disponível para este certificado.

Indo um pouco mais profundo, noto que quando eu importar manualmente o par de chaves, eu posso ver um novo arquivo aparecer em C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys, mas não aparece quando eu importar programaticamente. Em uma nota relacionada, quando eu apagar um certificado importado manualmente, ele não remove o arquivo de chave privada correspondente do diretório mencionado anteriormente.

Em última análise, a minha pergunta é esta: Quando eu programaticamente adicionar o certificado ao armazenamento, onde está a chave privada que está sendo armazenado e por isso não é acessível para a classe HttpListener (HttpApi)

?

Note que esta questão é ligeiramente relacionado, mas eu não acho que permissioning é o problema, já que tudo isto é que está sendo feito como o mesmo usuário do Windows: como definir permissão de leitura no arquivo de chave privada de X.509 certificado do .NET

Foi útil?

Solução

Ok, eu percebi isso. Tinha a ver com os parâmetros de armazenamento de chaves para o objeto de certificado. Para qualquer outra pessoa que corre para este problema, certifique-se de construir seus objetos X509Certificate2 que você está adicionando para a loja usando as bandeiras X509KeyStorageFlags.PersistKeySet e X509KeyStorageFlags.MachineKeySet. Isto irá forçar a chave privada para persistir no local definido chave de máquina que é exigido por HttpApi (HttpListener envolve este).

Outras dicas

Este é um 2 vias SSL? Se for, então você enviar mais de um arquivo de solicitação de certificado SSL gerado em sua máquina? Este arquivo solicitação de certificado será usado para criar o SSL e eles juntos formam um par de chaves público-privada.

Além disso você tentou atribuir a permissão cert para a conta de usuário que está sendo usado para executar o aplicativo web? Você pode fazer isso usando a ferramenta Microsoft WSE 3.0.

Não é exatamente a resposta à sua pergunta, mas aqui para referência de outras pessoas que vão por esse caminho:

Aqui é um link para um bate-papo MS que dá amostra C # código para fazer o que httpcfg faz, eliminando assim a necessidade da ferramenta de implantação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top