我已经创build了一个API(在nginx服务器上运行,让我知道是否有任何细节,你认为是相关的),当他们尝试调用我的服务时收到这个错误:
Notice: SSL certificate problem: self signed certificate in certificate chain in /usr/local/zend/apache2/htdocs/PefcSCS/components/ \ com_pefcscs/views/simplesearchs/tmpl/default.php on line 9
我无法重现此错误,并且没有自签名证书。 在日志中查看我有:
$ sudo tail -n 100 /var/log/nginx/error.log 2014/05/04 07:17:09 [crit] 24027#0: *844 SSL_do_handshake() failed (SSL: error:05066066:Diffie-Hellman routines:COMPUTE_KEY:invalid public key error:1408B005:SSL routines:SSL3_GET_CLIENT_KEY_EXCHANGE:DH lib) while SSL handshaking, client: xx.169.xx.141, server: 0.x.0.x:443
其中说: invalid public key error 。 这是否意味着他们提供了一个无效的公钥? 有人可以解释错误的含义以及如何解决这个问题? 谢谢。
编辑:PS我只是假设这两点是相关的,这可能是一个巧合,我推断之间的连接僵化的公钥交换和我的客户奇怪的错误,说明我们有一个自签名证书。
也许不是一个答案,但比我可以在评论中可读:
该错误代码(和string)是关于Diffie-Hellman公钥。 除非你使用的是静态DH,这是非常不寻常的 – 我甚至从来没有见过一个DHauthentication的公共CA问题 – 这个DHE密码必须是客户的临时DH密钥。 因为它是无效的,表明客户端SSL堆栈中有些奇怪的东西,会话中的“攻击”(或者至less是破坏),或者服务器中的DH参数被破坏 – 所有这些都不应该发生。 如果客户声称“自签名证书”,而你没有使用,那是不应该相关的一个不同的问题,但可能是通过一些奇怪的错误。
客户端似乎是PHP中的一些我不熟悉的东西,但我猜测可能是使用openssl来build立客户端SSL连接(在这个例子中就是给你)(就像nginx AFAIK在服务器端使用openssl一样) 。 如果您将服务器configuration为提供完整的包含根的证书链,并且openssl客户端在其使用的信任库中没有该根(可能是可configuration的),则可能会混淆地报告“自签名证书”而不是更确切地报告'不信任的根'。
如果我是正确的,它可以(你问)客户端人尝试使用命令行openssl s_client ,与他们的程序使用相同的信任库,和相同的密码列表(可能是默认)尝试一个连接 – 看看是否得到任何错误,如果是这样(更详细的)错误信息s_client给出? 换句话说,命令会是这样的
openssl s_client -connect $yourhost:$yourport -CAfile $file_if_any -CApath $dir_if_any -cipher $string_if_any
(如果它连接,只需要控制-D退出而不发送任何东西。)如果s_client表示类似于verify error: ... self-signed ,他们应该修复他们正在使用的信任库,以包含您的链的根证书使用。 (这可能意味着改变使用不同的信任库,如果他们不能或不想修改他们当前使用的信任库。)
在此期间什么(如果有的话)在您的服务器configurationssl_dhparam ? 为了dhparam -check -noout万一,试试openssl dhparam -check -noout ,尽pipe在握手过程中的任何错误都会失败。
当其他(客户)连接成功时,你能否检查他们是否与DHE谈判? 请记住,目前最常见的RSA证书可以支持plain-RSA DHE-RSA和ECDHE-RSA密码。 某些客户端可以显示选定的密码,尤其是大多数浏览器(如果您的服务器接受浏览器https请求)。 我自己不使用nginx,但http://osdir.com/ml/nginx/2010-07/msg00033.html表示可以logging这个。 s_client总是告诉你密码以及其他许多东西。
如果问题仍然存在,您可以(或他们或某人)使用wireshark / tshark,tcpdump或类似的方式获取networking捕获 – 连接失败吗? 这将确认使用的密码组和其他选项,并显示DHE交换失败,至less应该缩小问题的范围。 (IMO)最简单的方法是在wireshark中显示(即使用其他方法捕获),展开ServerHello并获取CipherSuite,然后展开ServerKeyExchange和ClientKeyExchange并获取所有详细信息。