2014-03-07 46 views
1

當我在瀏覽器中訪問https://gmail.com時,我發送301重定向至https://mail.google.com。當我嘗試使用node.js做同樣的事情時,我得到一個「主機名/ IP與證書的altnames不匹配」的錯誤。將不同的證書呈現給node.js與瀏覽器

這很有意義,因爲gmail.com向node.js提供的證書不包含「gmail.com」作爲常見名稱,也不包含alt-name。這是gmail.com所提供的證書......

{ subject: 
    { C: 'US', 
    ST: 'California', 
    L: 'Mountain View', 
    O: 'Google Inc', 
    CN: 'mail.google.com' }, 
    issuer: { C: 'US', O: 'Google Inc', CN: 'Google Internet Authority G2' }, 
    subjectaltname: 'DNS:mail.google.com', 
    exponent: '10001', 
    valid_from: 'Feb 25 15:21:00 2014 GMT', 
    valid_to: 'May 26 00:00:00 2014 GMT'} 

當我檢查應當由服務器提供的證書我看到http://www.sslshopper.com/ssl-checker.html#hostname=gmail.com其中是否包括了gmail.com擴展。我認爲這是瀏覽器正在接收的內容。

爲什麼節點向瀏覽器發送不同的證書? 這可能與CNAME和DNS有關嗎?

+0

看來,使用https.globalAgent.options.secureProtocol ='SSLv3_method'會改變它是否有效。 – Jonathon

回答

1

這可能是因爲您的瀏覽器支持Server Name Indication(SNI)和Node.js(或者更確切地說,您正在使用的客戶端模塊)不支持。由於證書協商發生在HTTP可以開始之前,所以需要SNI來爲單個IP地址提供多個主機名。

+0

TLS模塊文檔(我相信是在幕後使用的)確實似乎支持基於此http://nodejs.org/api/tls.html#tls_npn_and_sni的SNI。儘管如此,你的理論還是和我目前所掌握的一樣好。 我發現https.globalAgent.options.secureProtocol ='SSLv3_method'標誌的存在是否會導致問題改變你的猜測? – Jonathon

+1

如果我正確理解你的評論,刪除'SSLv3_method'標誌修復它,這是有道理的。 (就我所知,SNI是一種TLS擴展,並且不存在於SSL中)。如果您的客戶端在握手期間未指明服務器名稱,則服務器無法知道您要查找的內容,並顯示默認證書。 –

+0

接受基於上述評論的答案。非常感謝亨利。 – Jonathon

相關問題