Nazwa hosta / IP nie pasuje do altname certyfikatu
Próbuję utworzyć konfigurację serwera / klienta TLS przy użyciu Node.js 0.8.8 z certyfikatem z podpisem własnym.
Istotny kod serwera wygląda
var tlsServer = tls.createServer({
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-cert.pem')
}, function (connection) {
// [...]
});
tlsServer.listen(3000);
Teraz, gdy próbuję połączyć się z tym serwerem, używam następującego kodu:
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());
});
Jeśli usunę linię
ca: [ fs.readFileSync('server-cert.pem') ]
z kodu po stronie klienta Node.js zgłasza błąd informujący mnieDEPTH_ZERO_SELF_SIGNED_CERT
. Z tego, co rozumiem, wynika to z faktu, że jest to certyfikat samopodpisany i nie ma innej strony, która ufa temu certyfikatowi.
Jeśli usunę
rejectUnauthorized: true,
również błąd zniknął - aleconnection.authorized
jest równefalse
co oznacza, że moje połączenie nie jest szyfrowane. W każdym razie, używającgetPeerCertificate()
Mogę uzyskać dostęp do certyfikatu wysłanego przez serwer. Ponieważ chcę wymusić szyfrowane połączenie, rozumiem, że nie mogę usunąć tej linii.
Teraz czytam, że mogę użyćca
właściwość do określenia dowolnego urzędu certyfikacji, któremu mam ufać Node.js. Thedokumentacja modułu TLS sugeruje, że wystarczy dodać certyfikat serwera doca
tablica, a potem wszystko powinno być w porządku.
Jeśli to zrobię, ten błąd zniknie, ale dostaję nowy:
Hostname/IP doesn't match certificate's altnames
Dla mnie oznacza to, że urząd certyfikacji jest teraz w zasadzie zaufany, a więc teraz jest w porządku, ale certyfikat został utworzony dla innego hosta niż ten, którego używam.
Stworzyłem certyfikat za pomocą
$ openssl genrsa -out server-key.pem 2048
$ openssl req -new -key server-key.pem -out server-csr.pem
$ openssl x509 -req -in server-csr.pem -signkey server-key.pem -out server-cert.pem
jak sugeruje dokumentacja. Podczas tworzenia CSR zadawane mi są zwykłe pytania, takie jak kraj, stan, ... i nazwa zwyczajowa (CN). Jak powiedziałeś „w sieci”, aby uzyskać certyfikat SSLnie podaj swoje imię jako CN, ale nazwę hosta, której chcesz użyć.
I to prawdopodobnie tam, gdzie zawodzę.
próbowałem
localhost
192.168.178.31
eisbaer
eisbaer.fritz.box
gdzie dwie ostatnie to nazwa lokalna i pełna nazwa lokalna mojego komputera.
Jakiś pomysł, co robię źle tutaj?