我正在使用WatiN(2.0.10.928)与C#和Visual Studio 2008来测试需要证书的SSL安全网站。当您导航到主页时,会显示“选择数字证书”对话框,并要求您选择有效的证书并单击“确定”按钮。
我正在寻找一种自动化证书选择的方法,以便每次执行新的测试或夹具(以及我的浏览器重新启动)时,我都不必手动干扰自动测试并选择证书。我尝试过使用各种WatiN Dialog Handler类,甚至考虑使用Win32 API来自动化这个但是运气不好。
我终于找到了一个解决方案,但它为解决方案添加了另一个依赖项(一个名为AutoIT的第三方库)。由于这个解决方案并不理想,但确实有效并且是我能找到的最好的解决方案,我会发布解决方案并将其标记为答案,但我仍在寻找“开箱即用”的WatiN解决方案这与我的其他代码和测试装置更加一致。
感谢您的回复!
答案 0 :(得分: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中不起作用。
编辑:我忘了有用的东西。当我发现此解决方案在Windows 7中不起作用时,我在“自定义级别”中的某个地方的IE Internet选项中发现了非常有趣的选项:当没有证书或仅存在一个证书时,不提示选择客户端证书。所以我已将我的网站添加到受信任的网站和已编辑的设置,现在我无需使用此DialogHandler
,但即使没有出现对话框,它仍然可以使用。如果不清楚,我写了什么,这里是Enable Prompt for Certificate in Internet Explorer如何显示证书对话框。
答案 1 :(得分:0)
到目前为止我能找到的最佳解决方案发布在这里: http://andrey-zhukov.blogspot.com/2009/10/recently-i-wanted-to-choose-digital.html
如帖子所述,它需要引用AutoIT库:http://www.autoitscript.com/autoit3/index.shtml
答案 2 :(得分:0)
我采取了@ 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);
我不确定这是否适用于所有人,或者您是否需要管理员权限或其他内容,但它适用于我。