Я пытаюсь создать настройку сервера/клиента 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 altnames
Для меня это означает, что CA теперь в основном доверен, поэтому теперь все в порядке, но сертификат был сделан для другого хоста, чем тот, который я использую.
Я создал сертификат, используя
$ 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
где последние два являются локальным именем и полным локальным именем моей машины.
Любая идея, что я делаю неправильно здесь?