我有一个使用 SSL 客户端证书授权的网站。所有客户端证书均使用 OpenSSL 生成并且是自签名的。一切都适用于所有网络浏览器,但推荐的是谷歌浏览器,因为它使用与 IE 相同的 SSL 仓库,因此证书安装非常简单(点击-点击-密码-完成!)。上次更新谷歌“Chrome 29.0.1547.57 m”后,没有人可以访问我的网络服务器,即使是我。仅限谷歌浏览器错误!IE 和 FF 工作正常。错误是:ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED。服务器错误日志中的相同。你有什么建议吗?问题是大多数客户不熟悉个人电脑,他们对这种情况感到非常害怕。因此,电话支持人员正处于电话的浪潮中。
6 回答
我们遇到了同样的问题。正如 Sean 所报道的,Windows XP 上的 Chrome 似乎在协商 TLSv1.2,即使操作系统不支持 SHA-2(例如,SHA-256 或 SHA-384)哈希函数。
我们发现 Chrome 在收到 SERVER HELLO 之后的“客户端证书请求”时失败。SERVER HELLO 本身协商 RC4-SHA1(在我们的环境中)应该会成功。有问题的数据包似乎是“客户端证书请求”,其中包括用于散列的 SHA-2(以及 SHA1)函数。
使用“--enable-logging --log-level=0”调用 Chrome 会输出以下消息: ERROR:nss_ssl_util.cc(193)] ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED: NSS error -12222, OS error -2146893816
这是对应于 CryptSignHash 函数的“NTE_BAD_ALGID”的操作系统错误:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa380280 (v=vs.85).aspx
在服务器上禁用 TLSv1.2 应该可以解决问题。但我认为 Chrome 应该更喜欢 Windows XP 上的 SHA1。
我在这里遇到了同样的事情,Windows7 客户端系统无法针对我们的某些系统使用客户端证书进行身份验证,但其他系统则不然。受影响的服务器正在运行 Apache Tomcat,而未受影响的服务器正在运行 IIS7,尽管我不愿将这种差异确定为罪魁祸首。
还有人看到这个吗?
编辑:
我可以通过在服务器上禁用 TLSv1.2 来解决这个问题。有其他人能够复制这种经验吗?
我也很想知道是否有其他人在 Windows 平台以外的平台上看到了这个,因为它是这里唯一发生的地方(相同版本的 OSX 没有问题)。
编辑2:
Chrome 错误报告在这里:https ://code.google.com/p/chromium/issues/detail?id=278370
编辑3:
应该在最新的 Chrome 稳定版中再次工作。Chrome 30 将有更强大的修复,但 29.x 现在也应该可以工作了。
我最近在 Mac OS 上的 Chrome 中遇到了类似的问题。它在 Firefox 上运行良好,但在更改我的公司 (AD) 凭据后开始在 Chrome 和 Safari 中失败——我猜问题是系统凭据和钥匙串凭据不匹配。
我的解决方案是重置钥匙串访问应用程序中的私钥访问权限。
要进行重置:
- 在钥匙串访问应用程序中,右键单击每个失败的私钥,然后选择“获取信息”。
- 转到“访问控制”选项卡并设置“允许所有应用程序访问此项目” - 即使已设置,也请单击该选项。然后单击保存更改。
- 刷新失败的网站,系统会提示您输入钥匙串密码 - 输入并选择始终允许。
它是 Win XP 和 Google Chrome 的组合 29.0.1547.57 m 在 Win 7/8 上不会出现此问题。
您可以安装较旧的工作版本 28.0.1500.95 http://www.filehippo.com/download_google_chrome/15657/
但是禁用更新的设置并不那么容易。 http://dev.chromium.org/administrators/turning-off-auto-updates
该问题是由在 Windows XP 上运行 TLSv1.2 的 Chrome 引起的。
这可以在服务器端禁用,也可以在客户端禁用。
要使用较低版本的 TLS 运行 Chrome,请使用命令行选项 --ssl-version-max=tls1.1 启动它
我有这个问题将 Chrome 与 WebSockets 连接到 apache throw proxy_wstunnel_module。
我的解决方案是配置 httpd.conf
ProxyPass /wss2/ ws://127.0.0.1:8080/ retry=0 keepalive=On
ProxyPassReverse /wss2/ ws://127.0.0.1:8080/ retry=0
<Location /wss2/>
SSLRequireSSL On
SSLVerifyClient none
SSLVerifyDepth 1
SSLOptions +StdEnvVars +StrictRequire
SSLRenegBufferSize 10486000
</Location>
Chrome WebSockets 不喜欢参数 SSLVerifyClient 可选
我希望这有帮助。