使用Node的HTTPS / TLS与OpenSSL s_client时的不同证书链顺序

时间:2016-08-22 20:06:46

标签: node.js ssl https openssl tls1.2

我正在尝试使用Node的HTTPS请求解析证书链。我在npmjs.com上测试它(不是www.npmjs.com)。当我在OpenSSL上测试它时,它向我显示链的顺序不正确。

openssl s_client -connect npmjs.com:443 -showcerts 

OpenSSL响应优先证书

subject: /OU=GT40876434/OU=See www.rapidssl.com/resources/cps (c)14/OU=Domain Control Validated - RapidSSL(R)/CN=*.npmjs.com

issuer: /C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G3

下一个证书 - >

subject: /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA

issuer: /C=US/O=Equifax/OU=Equifax Secure Certificate Authority

下一个证书 - >

subject: /C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G3

issuer: /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA

但是,当我使用我的Node的HTTPS请求逐步浏览证书链时,当发出套接字时我会这样做

socket.getPeerCertificate(true) 

链的顺序正确,我在Node请求上获得的证书与openssl请求上的证书不同。

节点的响应第一证书:

subject
{ OU: 
   [ 'GT40876434',
 'See www.rapidssl.com/resources/cps (c)14',
 'Domain Control Validated - RapidSSL(R)' ],
  CN: '*.npmjs.com' }
issuer
{ C: 'US', O: 'GeoTrust Inc.', CN: 'RapidSSL SHA256 CA - G3' }

下一个证书 - >

subject
{ C: 'US', O: 'GeoTrust Inc.', CN: 'RapidSSL SHA256 CA - G3' }
issuer
{ C: 'US', O: 'GeoTrust Inc.', CN: 'GeoTrust Global CA' }

下一个证书 - >

subject
{ C: 'US', O: 'GeoTrust Inc.', CN: 'GeoTrust Global CA' }
issuer
{ C: 'US', O: 'GeoTrust Inc.', CN: 'GeoTrust Global CA' }

为什么会这样?

1 个答案:

答案 0 :(得分:5)

看起来节点正在重新排序证书以便在getPeerCertificates中返回,以便它们反映信任链(*)中的正确顺序。但实际上证书的顺序错误,openssl s_client以及analysis of SSLLabs中也可以看到:

Chain issues    Incorrect order

(*)node-4.5.0(LTS)中的相关代码位于src/node_crypto.cc函数void SSLWrap<Base>::GetPeerCertificate中。在那里,它使用SSL_get_peer_certificate(叶子证书)和SSL_get_peer_cert_chain(链)从openssl库中检索叶证书和原始对等证书。然后它不返回原始链顺序中的证书,而是扫描链并通过检查X509_check_issued按顺序添加证书。

这样,它以适当的依赖顺序返回证书,而不是由对等方发送的原始顺序。它还会自动跳过不属于链中的任何证书。

它也会添加证书的发行者,即使它不包含在链中(通常它不是)。这样,您不仅可以获得不同的证书顺序,如示例中所示,而且实际上是不同的证书。服务器按以下顺序发送以下证书:

[A] /OU=GT40876434/OU=See www.rapidssl.com/resources/cps (c)14/OU=Domain Control Validated - RapidSSL(R)/CN=*.npmjs.com
[B] /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA, issued by Equifax
[C] /C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G3

getPeerCertificate会返回以下内容:

[A] /OU=GT40876434/OU=See www.rapidssl.com/resources/cps (c)14/OU=Domain Control Validated - RapidSSL(R)/CN=*.npmjs.com
[C] /C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G3
[R] CA/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA, self-signed

因此,不包括证书[B],而是包含证书[R],证书[R]是信任库中包含的根证书。两者都有相同的主题和密钥,但由不同的实体签名。 [B]由Equifax签署,而[R]是自签名的。