Não é possível Instalar o Certificado no Windows 7 usando CertEnroll
-
26-09-2019 - |
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?
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).