Impossibile installare certificati su Windows 7 utilizzando CertEnroll
-
26-09-2019 - |
Domanda
Abbiamo un programma certificato di emissione esistente (C #, ASP.NET, JavaScript) che emette i certificati per gli utenti di Windows XP utilizzando Xenroll in IE. Ho bisogno di estendere questo per supportare Windows Vista e Windows 7 gli utenti, anche utilizzando IE.
Per Vista e 7, Microsoft ha sostituito il controll Xenroll ActiveX con il nuovo controllo CertEnroll. Ho questo lavoro in Vista SP2, ma in 7 ottengo questo errore nella fase di installazione:
CertEnroll :: :: CX509Enrollment InstallResponse: Una catena certificati elaborata, ma terminata in un certificato radice che non è affidabile dal provider di fiducia. 0x800B0109 (-2.146,762487 millions)
Ecco un frammento del relativo codice HTML e 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>
Ora, è vero che il certificato principale non è attendibile, ma sto chiamando InstallResponse con il primo set di parametri a 4, che dovrebbe consentire l'installazione anche se il certificato di origine non è attendibile. Questo funziona come pubblicizzato in Vista, ma non sembra in Windows 7.
ho provato e funziona se il certificato di origine è attendibile. Sono sicuro che qualcuno dirà che, quindi mi anticipare che - viste le clienti si fidano del certificato principale non è realmente un'opzione per noi (noi vogliamo distribuire i certificati di autenticazione del client per i clienti, come una parte della loro autenticazione sulla nostra rete).
sto facendo qualcosa di sbagliato qui? Qualcun altro ha ottenuto questo lavoro in Windows 7?
Soluzione
La soluzione era quella di installare hotfix KB 2.078.942 .
Si noti che questa correzione non pretende di risolvere il problema, ma lo fa! Piuttosto annonying, o avrei incontrato molto prima: - /
Credo che questo sia un bug di regressione da Vista, come c'era un hotfix per Vista per risolvere il problema esatto che stavo vivendo.
Un ringraziamento e upvote va a Bruno per passare il tempo di ieri cercando di aiuto a risolvere questo.
Altri suggerimenti
questo script qualche tempo fa per una demo (in combinazione con questa pagina ). Supporta <keygen/>
e lo sostituisce con XEnroll o CertEnroll chiamate su Internet Explorer. Il progetto si è evoluto un po 'perché, ma ho appena testato questo ramo con IE8 su Windows 7 e ha funzionato. Il certificato CA non era sulla macchina client a tutti. Ho dovuto abbassare le impostazioni di sicurezza a 'basso' per l'esecuzione ActiveX (in caso contrario, non sarebbe nemmeno inviare la richiesta, quindi, anche meno installare il certificato nella risposta).
Se questo aiuta, faccio questo:
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.");
}
}
Devo ammettere che non ho prova di quale di questi due casi è stato utilizzato (come è lo stesso messaggio di avviso).