lik*_*bas 4 ssl https openssl node.js tls1.2
我正在尝试使用Node的HTTPS请求解析证书链.我在npmjs.com上测试它(不是www.npmjs.com).当我在OpenSSL上测试它时,它向我显示链的顺序不正确.
openssl s_client -connect npmjs.com:443 -showcerts
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
下一个证书 - >
subject: /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
issuer: /C=US/O=Equifax/OU=Equifax Secure Certificate Authority
Run Code Online (Sandbox Code Playgroud)
下一个证书 - >
subject: /C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G3
issuer: /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
Run Code Online (Sandbox Code Playgroud)
但是,当我使用我的Node的HTTPS请求逐步浏览证书链时,在发出套接字时我会这样做
socket.getPeerCertificate(true)
Run Code Online (Sandbox Code Playgroud)
链的顺序是正确的,我在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' }
Run Code Online (Sandbox Code Playgroud)
下一个证书 - >
subject
{ C: 'US', O: 'GeoTrust Inc.', CN: 'RapidSSL SHA256 CA - G3' }
issuer
{ C: 'US', O: 'GeoTrust Inc.', CN: 'GeoTrust Global CA' }
Run Code Online (Sandbox Code Playgroud)
下一个证书 - >
subject
{ C: 'US', O: 'GeoTrust Inc.', CN: 'GeoTrust Global CA' }
issuer
{ C: 'US', O: 'GeoTrust Inc.', CN: 'GeoTrust Global CA' }
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
看起来节点正在重新排序证书以便在getPeerCertificates中返回,以便它们反映信任链(*)中的正确顺序.但实际上证书的顺序是错误的,正如SSLLabsopenssl s_client的分析所见:
Chain issues Incorrect order
Run Code Online (Sandbox Code Playgroud)
(*)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
Run Code Online (Sandbox Code Playgroud)
但是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
Run Code Online (Sandbox Code Playgroud)
因此,证书[B]将不包括在内,而是作为信任存储中包含的根证书的证书[R].两者都有相同的主题和密钥,但由不同的实体签名.[B]由Equifax签署,而[R]是自签名的.
| 归档时间: |
|
| 查看次数: |
292 次 |
| 最近记录: |