Я создаю приложение-обходчик SSL, в котором пользователь передает имя домена, а NodeJS использует tls
библиотеку для получения сертификата SSL.
Во-первых, вот мои коды:
server.js
const tls = require('tls');
var rootCas = require('ssl-root-cas/latest').create();
const fs = require('fs');
fs.readdirSync('./keys/intermediate_certs').forEach(file => {
rootCas.addFile('./keys/intermediate_certs/' + file)
});
var secureContext = tls.createSecureContext({
ca: rootCas
});
options = {
host: host, //domain like google.com
port: 443,
secureContext: secureContext,
ca: rootCas,
rejectUnauthorized: true
};
var tlsSocket = tls.connect(options, function () {
let rawCert = tlsSocket.getPeerCertificate()
console.log(rawCert)
})
tlsSocket.on('error', (error) => {
console.log(error)
// [ERR_TLS_CERT_ALTNAME_INVALID] Hostname/IP does not match certificate's altnames: Host: zdns.cn. is not in the cert's altnames: DNS:*.fkw.com, DNS:fkw.com
// unable to verify the first certificate or UNABLE_TO_VERIFY_LEAF_SIGNATURE
});
Проблема заключается в ошибке выдачи приложения nodejs, согласно документации TLS
, ошибки были из OpenSSL, однако при просмотре веб-сайта отображается view certificate
все допустимые (даже общее имя точно совпало).
Вот некоторые критерии:
- zdns.cn / www.zdns.cn показывает ошибку:
ERR_TLS_CERT_ALTNAME_INVALID
; При просмотре сертификата из браузера он показывает *.zdns.cn
- knet .cn / www.knet.cn показывает ошибку:
unable to verify the first certificate
; При просмотре сертификата в браузере отображается www.knet.cn
Примечание. Я включил последний root CA из ssl-root-cas
, а также загрузил intermediate certificate
вручную с сайта CA.