Имя хоста / 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, но имя хоста, которое вы хотели бы использовать.
И это, вероятно, где я терплю неудачу.
Я пытался
localhost
192.168.178.31
eisbaer
eisbaer.fritz.box
где последние два - локальное имя и полностью определенное локальное имя моей машины.
Есть идеи, что я здесь делаю не так?