Имя хоста / IP не соответствует альт-имени сертификата

Я пытаюсь создать настройку сервера / клиента TLS с помощью Node.js 0.8.8 с самозаверяющим сертификатом.

Основной код сервера выглядит так

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 доверял.документация модуля TLS подразумевает, что достаточно добавить сертификат сервера вca массив, и тогда все должно быть хорошо.

Если я это сделаю, эта ошибка исчезнет, но я получу новую:

Hostname/IP doesn't match certificate's altnames

Для меня это означает, что ЦС теперь в основном доверенный, следовательно, теперь все в порядке, но сертификат был создан для другого хоста, чем тот, который я использую.

Я создал сертификат, используя

$ 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

как следует из документации. При создании CSR мне задают обычные вопросы, такие как страна, штат, ... и общее имя (CN). Как вам говорят "в Интернете" для SSL-сертификата вы делаетене укажите ваше имя как CN, но имя хоста, которое вы хотели бы использовать.

И это, вероятно, где я терплю неудачу.

Я пытался

localhost192.168.178.31eisbaereisbaer.fritz.box

где последние два - локальное имя и полностью определенное локальное имя моей машины.

Есть идеи, что я здесь делаю не так?

Ответы на вопрос(5)

Ваш ответ на вопрос