本篇简介:
本篇的小目标:
挑战通过Qt WebEngine实现与服务端的Https双向认证
双向认证,Qt WebEngine和Chromium
这里先说结论:挑战失败了。至少使用Qt WebEngine目前已实现的组件没有办法直接实现双向认证。
先来简要分析一下实现双向认证需要做些什么。首先,服务端和客户端——客户端也就是我们的定制浏览器——各自需要向对方提供自己的安全证书,并检查对方所提供的安全证书是否在自己的信任库中。Qt提供了设置这样的安全环境的组件QSslConfiguration,普通的加密通信如果要实现双向认证,可以很方便地使用这个组件完成客户端证书和信任库的设置(具体可以参考我的另一篇文章:QSslSocket双向认证设置)。
然而比较坑的地方是,就目前的5.10版而言,Qt WebEngine并不能直接载入QSslConfiguration里的设置。因为使用了Chromium作为内核,WebEngine在加载页面时走的是Chromium自己的一条网络栈,并没使用Qt的安全环境设置。而Chromium在处理Https请求时,默认是直接读取操作系统中设置的证书作为客户端自己的安全证书,现有版本的WebEngine对此没有进行更改。更坑的地方是,Chromium本身是提供了选择客户端证书的接口的,在使用Chrome浏览器第一次访问需要认证客户端的https页面时,会弹出一个选择客户端证书的框,如下图所示:
certselect.png
而WebEngine似乎会直接略过客户端证书的加载。这个bug已经被提交到了官方,已经有相应的补丁出炉,但是要整合到