Pergunta

Temos um certificado existente emissão de aplicação (C#, ASP.NET, JavaScript) que emite certificados para usuários do Windows XP usando o XenRoll no IE.Eu preciso estender isso para oferecer suporte ao Windows Vista e Windows 7 usuários, também usando o IE.

Para o Vista e o 7, a Microsoft substituiu o XenRoll controle ActiveX com o novo controle CertEnroll.Eu tenho isso funcionando no Vista SP2, mas em 7 recebo este erro na etapa de instalação:

CertEnroll::CX509Enrollment::InstallResponse:Uma cadeia de certificados foi processada, mas terminou em um certificado raiz que não é confiável para o provedor de confiança.0x800b0109 (-2146762487)

Aqui está um trecho de relevante HTML & JavaScript:

<object id="classFactoryObj" classid="clsid:884e2049-217d-11da-b2a4-000e7bbb2b09"></object>

<script type="text/javascript">
    function InstallCert() 
    {  
        try
        {
            var classFactory = document.getElementById("classFactoryObj");
            var objEnroll = classFactory.CreateObject("X509Enrollment.CX509Enrollment");

            var signedCert = '-----BEGIN CERTIFICATE-----' + 
                'REMOVED FOR BREVITY' + 
                '-----END CERTIFICATE-----';

            objEnroll.Initialize(1); // User context
            objEnroll.InstallResponse(4, signedCert, 6, ""); // AllowUntrustedRoot = 4

            alert('Certificate installed');
        }
        catch (ex)
        {
            alert('Unable to install certificate: ' + ex.description);
        }
     }

    InstallCert();
</script>

Agora, é verdade que o certificado raiz não é confiável, mas eu estou chamando de InstallResponse com o primeiro conjunto de parâmetros para 4, que é suposto para permitir a instalação, mesmo que o certificado raiz não é confiável.Isso funciona como anunciado em Vista, mas não parece no Windows 7.

Eu testei, e funciona se o certificado raiz confiável.Eu tenho certeza que alguém vai dizer, então vou antecipar-se a ele - ter a confiança de seus clientes o certificado raiz não é realmente uma opção para nós (nós queremos distribuir certificados de autenticação de cliente para clientes, como parte de autenticar-los em nossa rede).

Estou fazendo algo de errado aqui?Tem mais alguém tem esse trabalho no Windows 7?

Foi útil?

Solução

A solução foi instalar Hotfix KB 2078942.

Observe que este hotfix não afirma corrigir esse problema, mas sim! Anotendo, ou eu teria me deparado muito mais cedo:-/

Eu acredito que este é um bug de regressão do Vista, pois havia um hotfix Para o Vista resolver o problema exato que eu estava enfrentando.

Um agradecimento e o Upvote vão para Bruno por passar tempo ontem, tentando me ajudar a resolver isso.

Outras dicas

Eu escrevi este script há um tempo atrás para uma demonstração (em conjunto com nesta página).Ele suporta <keygen/> e substitui-lo com XEnroll ou CertEnroll chama no Internet Explorer.O projeto evoluiu um pouco, uma vez, mas eu apenas testado este ramo com o IE8 no Windows 7 e funcionou.O certificado de autoridade de CERTIFICAÇÃO não estava na máquina do cliente em todos os.Eu tive que diminuir as definições de segurança para 'baixo' para executar o ActiveX (caso contrário, não teria mesmo de enviar a solicitação, por isso mesmo, menos de instalar o certificado na resposta).

Se isso ajuda, eu faço isso:

try {
    enrollObj.InstallResponse(4, xmlHttpRequest.responseText,
            0, "");
    window.alert("A certificate has been installed.");
} catch (e1) {
    try {
        enrollObj.InstallResponse(0,
                xmlHttpRequest.responseText, 0, "");
        window.alert("A certificate has been installed.");
    } catch (e2) {
        window
                .alert("You're probably using Vista without SP1 or above, in which case you need to add the certificate of this authority as a trusted root certificate.");
    }
}

Eu devo admitir que eu não testar qual dos dois casos foi utilizado, como se a mesma mensagem de alerta).

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