1

У нас есть существующее приложение для выдачи сертификатов (C#, ASP.NET, JavaScript), которое выдает сертификаты пользователям Windows XP с использованием XenRoll в IE. Мне нужно расширить это для поддержки пользователей Windows Vista и Windows 7, также используя IE.Не удается установить сертификат в Windows 7 с помощью CertEnroll

Для Vista и 7 Microsoft заменила XenRoll ActiveX controll новым элементом управления 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

Решение должно было установить hotfix KB 2078942.

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

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

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

1

Я написал (а) this script некоторое время назад для демонстрации (в сочетании с this page). Он поддерживает <keygen/> и заменяет его XEnroll или CertEnroll вызывает в Internet Explorer. Проект немного изменился с тех пор, но я только что протестировал this branch с 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."); 
    } 
} 

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

+0

У меня нет проблем с настройками ActiveX - если вы запустите CertEnroll через HTTPS, вы не получите этого. – Cocowalla

+0

Действительно, я просто запускал это на тестовом простом HTTP-сервере сегодня. – Bruno

+0

Я только что проверил, это первый, который работает для меня 'enrollObj.InstallResponse (4, xmlHttpRequest.responseText, 0," ");' Может быть, что-то еще в остальной части инициализации. (Извините, я не могу вспомнить все подробности прямо сейчас.) – Bruno

Смежные вопросы