Автоматизация диалогового окна «Выбор цифрового сертификата»

Я использую WatiN (2.0.10.928) с C# и Visual Studio 2008 для тестирования защищенного SSL веб-сайта, для которого требуется сертификат. При переходе на домашнюю страницу отображается диалоговое окно «Выберите цифровой сертификат», в котором требуется выбрать действительный сертификат и нажать кнопку «ОК».

Я ищу способ автоматизировать выбор сертификата, чтобы каждый раз, когда выполняется новый тест или прибор (и мой браузер перезагружается), мне не приходилось вручную вмешиваться в автоматический тест и выбирать сертификат. Я пытался использовать различные классы WatiN Dialog Handler и даже изучил использование Win32 API для автоматизации этого, но мне не повезло.

Наконец-то я нашел решение, но оно добавляет к решению еще одну зависимость (сторонняя библиотека под названием AutoIT). Поскольку это решение не идеально, но работает и является лучшим, которое я смог найти, я опубликую решение и отмечу его как ответ, но я все еще ищу готовое решение WatiN это больше соответствует остальному моему коду и тестовым приборам.

Спасибо за ваши ответы!


person MoMo    schedule 06.04.2010    source источник


Ответы (3)


В моей ситуации у меня есть только один прикрепленный сертификат, поэтому я должен выбрать единственный существующий в списке, поэтому для этого у меня есть очень простой DialogHandler - он нажимает кнопку только в том случае, если он может обрабатывать диалог:

public class CertificateChoosingHandler : BaseDialogHandler
{
    public override bool HandleDialog(Window window)
    {
        new WinButton(1, window.Hwnd).Click();
        return true;
    }

    public override bool CanHandleDialog(Window window)
    {
        return window.StyleInHex == "94C808CC";
    }
} 

AFAIR это решение не будет работать в Windows 7.

EDIT: я забыл кое-что полезное. Когда я обнаружил, что это решение не работает в Windows 7, я обнаружил очень интересную опцию в IE Internet Options где-то на «Пользовательском уровне»: Не запрашивать выбор сертификата клиента, когда нет сертификатов или существует только один сертификат. Итак, я добавил свой сайт в надежные сайты и отредактировал настройки, и теперь мне не нужно использовать этот DialogHandler, но его все равно можно использовать, даже если диалоговое окно не появляется. Если непонятно, что я написал, вот как Включить запрос сертификата в Internet Explorer для отображения диалогового окна сертификата.

person prostynick    schedule 20.04.2010
comment
Спасибо за ответ! Ваша ситуация похожа на мою. На самом деле, я изменил свое исходное решение, просто нажав «ОК». Я использую ваше решение, потому что это готовое решение WatiN, и оно не имеет сторонних зависимостей. - person MoMo; 20.04.2010

Лучшее решение, которое я смог найти, было опубликовано здесь: http://andrey-zhukov.blogspot.com/2009/10/recently-i-wanted-to-choose-digital.html

Как указано в сообщении, для этого требуется ссылка на библиотеку AutoIT: http://www.autoitscript.com/autoit3/index.shtml

person MoMo    schedule 06.04.2010
comment
Если у вас есть несколько сертификатов, из которых вам нужно выбрать, вам может потребоваться добавить части этого решения в решение «Принятый ответ». - person MoMo; 20.04.2010
comment
Похоже, что этот блог мертв, вы можете добавить эту информацию сюда? - person John; 13.04.2011
comment
Извините за неработающую ссылку... Я не могу найти этот пост (или даже его кешированную версию). В любом случае вам, вероятно, лучше использовать принятый ответ или использовать библиотеку AutoIT. - person MoMo; 27.07.2011

Я понял подсказку @prostynick и автоматизировал ее. По сути, если вы ВКЛЮЧИТЕ параметр «Не запрашивать выбор сертификата клиента, когда нет сертификатов или существует только один сертификат» в настройках безопасности IE, то весь диалог не появится (если вы только иметь один или не иметь сертификата, то есть).

Итак, нам просто нужно убедиться, что у пользователя включен этот параметр, прежде чем мы инициализируем ваш объект WebBrowser. А так как эти настройки удобно хранятся в реестре, мы можем сделать это сами, не утруждая пользователя. Вот код, который делает именно это:

// What this does is changes this setting in Internet Explorer: 
//   Tools -> Internet Options -> Security -> Custom Level -> 
//   Don't prompt for client certificate selection when no certificates 
//   or only one certificate exists -> ENABLE
//
// If you're not convinced that we need this, please reset all the security 
// levels in IE to the default settings, comment out this code, and try to fetch 
//    <your url>. 
//
// If it finishes, great! Then leave it commented out. Otherwise, curse and accept
// that we need this ugly hack OR that we need to instruct people to find & change 
// some unholy IE setting...
RegistryKey stupidBrokenDefaultSetting = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Zones\\3", true);
stupidBrokenDefaultSetting.SetValue("1A04", "0", RegistryValueKind.DWord);

Я не уверен, что это работает для всех, или вам нужны права администратора или что-то в этом роде, но это работает для меня.

person Edward    schedule 27.11.2012