Невозможно установить сертификат в Windows 7 с помощью CertEnroll - PullRequest
1 голос
/ 02 сентября 2010

У нас есть приложение для выдачи сертификатов (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 ]

2 голосов
/ 03 сентября 2010

Решением было установить исправление KB 2078942 .

Обратите внимание, что это исправление не претендует на исправление этой проблемы, но оно исправлено! Скорее раздражает, иначе я бы столкнулся с этим гораздо раньше: - /

Я считаю, что это ошибка регрессии в Vista, поскольку было исправление для Vista, чтобы точно решить проблему, с которой я столкнулся.

Спасибо и благосклонность идет к Бруно за вчерашнее время, пытаясь помочь мне решить эту проблему.

1 голос
/ 02 сентября 2010

Я написал этот сценарий некоторое время назад для демонстрации (вместе с этой страницей ).Он поддерживает <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.");
    }
}

Я должен признать, что я не проверял, какой из этих двух случаев использовался (так как это одно и то же сообщение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...