首页 文章

SSL握手失败 - 一个verisign链证书 - 包含两个CA签名证书和一个自签名证书

提问于
浏览
37

我遇到了问题并试图调试它 . 我们购买了Verisign证书 . 当我们使用时:

openssl> s_client -connect myweb.com:443 -showcerts

SSL握手永远不会完成,最后我们会看到错误:

Verify return code: 19 (self signed certificate in certificate chain)

它显示3个 ---BEGIN/END CERTIFICATE--- 标签 . 链中的两个证书是Verisign签署的,但其中一个是自签名的 .

  • 如果有人可以解释这个自签名证书如何出现在CA签名证书中?

  • 这个错误是 19 (self signed certificate in certificate chain) 良性吗?如果没有,可能导致什么?

  • 客户端在受信任存储区中具有CA证书,但自签名证书没有任何内容 . 你认为这可能导致问题吗?如果是,我该怎么做:

  • 如何从链证书中删除自签名证书,只留下链中的2个CA签名证书?

  • 在客户端信任存储上添加此自签名证书?

5 回答

  • 3

    CA颁发的根证书只是自签名证书(可以反过来用于颁发中间CA证书) . 除了在许多浏览器或操作系统信任锚中默认导入它们之外,它们没有太多特别之处 .

    虽然浏览器和一些工具被配置为默认情况下在位置中查找受信任的CA证书(其中一些可能是自签名的),但据我所知, openssl 命令不是 .

    因此,任何提供完整证书链的服务器,从其最终实体证书(服务器证书)到根CA证书(可能具有中间CA证书),都将在链中具有自签名证书:根CA .

    openssl s_client -connect myweb.com:443 -showcerts 没有't have any particular reason to trust Verisign'的根CA证书,因为它's self-signed you'将获得“证书链中的自签名证书” .

    如果你的系统有一个默认值信任的证书捆绑的位置(我认为在RedHat / Fedora上的 /etc/pki/tls/certs 和Ubuntu / Debian上的 /etc/ssl/certs ),你可以配置OpenSSL将它们用作信任锚,例如:

    openssl s_client -connect myweb.com:443 -showcerts -CApath /etc/ssl/certs
    
  • 1

    听起来好像缺少中间证书 . 截至2006年4月,VeriSign颁发的所有SSL证书都要求安装中级CA证书 .

    可能是您没有在服务器上加载整个证书链 . 某些企业不允许其计算机下载其他证书,导致无法完成SSL握手 .

    以下是关于中间链的一些信息:
    https://knowledge.verisign.com/support/ssl-certificates-support/index?page=content&id=AR657
    https://knowledge.verisign.com/support/ssl-certificates-support/index?page=content&id=AD146

    Intermediate CA Certificates

  • 3

    以下是VeriSign SSL证书安装检查器的链接:https://knowledge.verisign.com/support/ssl-certificates-support/index?page=content&id=AR1130

    输入您的URL,单击“测试此Web服务器”,它将告诉您中间证书颁发机构是否存在问题 .

  • 70

    关于服务器可以向客户端提供根证书与否,从RFC-5246“传输层安全性(TLS)协议版本1.2”文档中提取,它说:

    certificate_list这是证书的序列(链) . 发件人的证书必须在列表中排在第一位 . 以下每个证书必须直接证明其前面的证书 . 由于证书验证要求根密钥独立分发,因此可以在链中省略指定根证书颁发机构的自签名证书,前提是远程端必须已拥有它以便在任何情况下验证它 .

    关于术语“MAY”,摘自RFC-2119“最佳实践”,说:

    5.MAY这个词,或形容词“可选”,意味着一个项目是真正可选的 . 一个供应商可能会选择包含该项目,因为特定的市场需要它,或者因为供应商认为它增强了产品,而另一个供应商可能会省略相同的项目 . 不包含特定选项的实现必须准备好与包含该选项的另一个实现互操作,尽管可能具有减少的功能 . 同样,必须准备一个包含特定选项的实现,以便与不包括该选项的另一个实现进行互操作(当然,除了该选项提供的功能之外) .

    总之,根可以位于服务器在握手中提供的证书路径中 .

    实用 .
    考虑一下,不是在导航器用户术语中,而是在具有有限互联网访问权限的军事区域中的服务器上的传输工具上 .
    在传输时扮演客户端角色的服务器从服务器接收所有证书路径 .
    应检查链中的所有证书是否可信,包括根 .
    检查这一点的唯一方法是在传输时间中将根包含在certs路径中,并与先前声明的'trusted'本地副本进行匹配 .

  • 7

    当您看到“ Verify return code: 19 (self signed certificate in certificate chain) ”时,服务器实际上是在尝试使用自签名证书(客户端永远无法验证),或者OpenSSL没有't got access to the necessary root but the server is trying to provide it itself (which it shouldn' t因为它's pointless - a client can never trust a server to supply the root corresponding to the server'自己的证书) .

    再次,添加-showcerts将帮助您诊断哪些 .

相关问题