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

1
Cocowalla 2 Сен 2010 в 18:49

2 ответа

Лучший ответ

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

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

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

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

2
Cocowalla 3 Сен 2010 в 14:31

Я написал ). Он поддерживает <keygen/> и заменяет его вызовами XEnroll или CertEnroll в Internet Explorer. С тех пор проект немного изменился, но я только что протестировал эту ветку с IE8. на Windows 7, и это сработало. Сертификата ЦС вообще не было на клиентской машине. Мне пришлось снизить настройки безопасности до «низкого», чтобы он мог запустить 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.");
    }
}

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

1
Bruno 2 Сен 2010 в 16:34