Невозможно установить сертификат в Windows 7 с помощью CertEnroll
У нас есть приложение для выдачи сертификатов (C#, ASP.NET, JavaScript), которое выдает сертификаты пользователям Windows XP, использующим XenRoll в IE. Мне нужно расширить это для поддержки пользователей Windows Vista и Windows 7, также использующих IE.
Для Vista и 7 Microsoft заменила элемент управления XenRoll ActiveX новым элементом управления CertEnroll. У меня это работает в Vista SP2, но в 7 я получаю эту ошибку на этапе установки:
CertEnroll:: CX509Enrollment:: InstallResponse: Цепочка сертификатов обработана, но завершена корневым сертификатом, который не является доверенным поставщиком доверия. 0x800b0109 (-2146762487)
Вот фрагмент соответствующего 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>
Теперь верно, что корневой сертификат не является доверенным, но я вызываю InstallResponse с первым параметром, установленным в 4, что должно разрешить установку, даже если корневой сертификат не является доверенным. Это работает как рекламируется в Vista, но не похоже на Windows 7.
Я проверил, и это работает, если корневой сертификат является доверенным. Я уверен, что кто-то скажет это, поэтому я упреждаю это - доверие клиентов корневому сертификату на самом деле не вариант для нас (мы хотим распространять сертификаты аутентификации клиентов среди клиентов, как часть их аутентификации в нашей сети).
Я что-то здесь не так делаю? Кто-нибудь еще получил это работает в Windows 7?
2 ответа
Решением было установить исправление KB 2078942.
Обратите внимание, что это исправление не претендует на исправление этой проблемы, но это делает! Скорее раздражает, иначе я бы наткнулся на это гораздо раньше:-/
Я полагаю, что это ошибка регрессии в Vista, поскольку в Vista было исправление, чтобы точно решить проблему, с которой я столкнулся.
Вчера Бруно благодарит и благоволит за то, что провел время, пытаясь помочь мне решить эту проблему.
Я написал этот сценарий некоторое время назад для демонстрации (вместе с этой страницей). Поддерживает <keygen/>
и заменяет его вызовами XEnroll или CertEnroll в Internet Explorer. С тех пор проект немного изменился, но я только что протестировал эту ветку с IE8 на Windows 7, и она сработала. Сертификат CA вообще не был на клиентской машине. Мне пришлось понизить параметры безопасности до "низкого", чтобы он запускал ActiveX (иначе он даже не отправил бы запрос, поэтому еще меньше устанавливал сертификат в ответе).
Если это поможет, я делаю это:
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.");
}
}
Должен признать, что я не проверял, какой из этих двух случаев использовался (так как это одно и то же предупреждающее сообщение).