我試圖創建一個使用Node.js的0.8.8使用自簽名證書的TLS服務器/客戶端安裝。主機名/ IP不匹配證書的備用名
基本服務器代碼看起來像
var tlsServer = tls.createServer({
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-cert.pem')
}, function (connection) {
// [...]
});
tlsServer.listen(3000);
現在,當我嘗試連接到這臺服務器我使用下面的代碼:
var connection = tls.connect({
host: '192.168.178.31',
port: 3000,
rejectUnauthorized: true,
ca: [ fs.readFileSync('server-cert.pem') ]
}, function() {
console.log(connection.authorized);
console.log(connection.authorizationError);
console.log(connection.getPeerCertificate());
});
如果我刪除線
ca: [ fs.readFileSync('server-cert.pem') ]
從客戶端代碼,Node.js的拋出一個錯誤告訴我DEPTH_ZERO_SELF_SIGNED_CERT
。據我瞭解,這是由於這是一個自簽名證書,並且沒有其他方信任此證書。
如果我刪除
rejectUnauthorized: true,
爲好,錯誤消失 - 但connection.authorized
等於false
這實際上意味着我的連接未加密。無論如何,使用getPeerCertificate()
我可以訪問服務器發送的證書。由於我想執行加密連接,因此我明白我可能不會刪除此行。
現在我讀,我可以使用ca
屬性來指定,我想Node.js的信任任何CA。該documentation of the TLS module意味着它足以服務器證書添加到ca
數組,然後一切都應該罰款。
如果我這樣做,這個錯誤是走了,但我得到一個新問題:
Hostname/IP doesn't match certificate's altnames
對我來說,這意味着CA現在基本可信的,因此,現在沒事,但證書被做對於另一臺主機而不是我使用的主機。
我創建使用
的文檔暗示的證書。在創建企業社會責任時,我會問到一些常見的問題,例如國家,州,......和通用名稱(CN)。正如您在「網絡上」所告訴您的SSL證書所做的那樣,而不是會提供您的名稱作爲CN,但是您希望使用的主機名。
而這可能是我失敗的地方。
我試圖
localhost
192.168.178.31
eisbaer
eisbaer.fritz.box
其中最後兩個是當地的名字和我的機器的完全合格的本地名稱。
任何想法我在做什麼錯在這裏?
重要提示:這是'Node v0.8.8'。 'rejectUnauthorized'現在默認爲'true'。 – Breedly
如果您使用'rejectUnauthorized:false',則默認情況下您的連接[仍然是加密的](https://stackoverflow.com/a/16311147/4068278)。它根本不驗證您連接的主機的身份,這可能會讓您容易受到SSL上的MITM攻擊。 –