![](/img/trans.png)
[英]Node.js says it's using tls1.2 when minVersion set to 1.3 and connecting with a client using 1.3
[英]Different certificate chain order when using Node's HTTPS/TLS vs. OpenSSL s_client
我正在嘗試使用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' }
為什么會這樣?
看起來節點正在重新排序證書以便在getPeerCertificates中返回,以便它們反映信任鏈(*)中的正確順序。 但實際上證書的順序是錯誤的,正如openssl s_client
和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]。 兩者都有相同的主題和密鑰,但由不同的實體簽名。 [B]由Equifax簽署,而[R]是自簽名的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.