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

localhost192.168.178.31eisbaereisbaer.fritz.box

gdzie dwie ostatnie to nazwa lokalna i pełna nazwa lokalna mojego komputera.

Jakiś pomysł, co robię źle tutaj?

questionAnswers(5)

yourAnswerToTheQuestion