在本地開發中使用Node.js [urllib]庫聯調測試環境https接口時,出現 [ERR_TLS -CERT_ALTNAME_INVALID]: Hostname/Ip does not match certificate's altnames報錯,即服務器主機和證書不匹配,而同事用Golang卻能正常請求,經過一番折騰終于找到原因并解決,記錄一下填坑筆記。
Node.js從0.9.2版本開始就默認驗證證書,而請求的測試環境https證書并不是從權威機構頒發的,而Go、Java等其它語言能正常請求是因為沒有默認校驗證書,所以會出現這種報錯,于是解決問題就有兩種方式1、測試環境更新證書;2、node請求不默認校驗證書。方法一不大可行,公司不可能為了適配Node端更換證書,此時就只有方法二可行了,網上得到的解決辦法是在請求時加上{rejectUnauthorized:false}選項不再校驗證書的安全性,但這具有 嚴重的安全隱患。發送給對等方的任何內容仍將被加密,但發起中間人攻擊變得更加容易,即數據將被加密給對等方,但對等方本身可能并不是認為的服務器!因為是在測試環境聯調就采用此種方式,?生產必須要校驗證書安全性的?。
于是滿懷希望的準備采用方式二解決問題,但是[urllib]官方文檔并沒有給出初始化請求的選項,自己給options里面強制加了 {rejectUnauthorized:false} 并沒有生效,希望破滅,陷入沉思。urllib這種week下載量幾十萬的庫,連node這種基本的配置不可能不支持,肯定是作者為了安全因素隱藏了,只暴露出一個簡單的 request 方法,這個方法又是如何初始化的呢,順藤摸瓜進入node_modules下對應的目錄,并找到了初始化方法和可支持的現象,自己加個選項就能解決問題,具體代碼如下:
let client = null
function initClient(secure = true) {
if (client) return client
client = new HttpClient({
connect: {
rejectUnauthorized: secure
}
})
return client
}
exports.initClient = initClient