Ошибка рукопожатия в приложении ExpressJS Node с SSL-сертификатами Let's Encrypt - PullRequest
0 голосов
/ 15 октября 2018

У меня проблема с настройкой сервера узлов с помощью зашифрованных сертификатов.Я использую Express для создания https-сервера следующим образом:

var fs = require('fs');
var app = require('express')();
var https = require('https');

var server = https.createServer({ 
key: 
fs.readFileSync('/etc/letsencrypt/live/mydomain.com/privkey.pem'), 
cert: fs.readFileSync('/etc/letsencrypt/live/mydomain.com/cert.pem'), 
ca: fs.readFileSync('/etc/letsencrypt/live/mydomain.com/chain.pem'), 
requestCert: true, 
rejectUnauthorized: true},app);

app.get("/express", function(request, response){
response.end("Express Response");
});
server.listen(8082);

Я хочу установить rejectUnauthorized: true , потому что я прочитал, что его отключение делает связь клиент / сервер уязвимой дляMITM атака.Для клиентской стороны я использую модуль request , чтобы сделать запрос https GET следующим образом:

var path = require('path');
var requests = require('request');
var fileSystem = require('fs');

var checkRequestOpts = {
    url: "https://example.com:8082/express",
    agentOtions: {
        ca: fileSystem.readFileSync(__dirname + '/chain1.pem')
    },
    method: 'GET',
    json: true,
    formData: {
        'x': 100,
        'y': 500,
        'z': 97    
    }
};

requests(checkRequestOpts, function(err, sr, rb)
{
    if(err)
        console.log('Error occured' + err);
    else
    {
        console.log('Response: ' + rb);
    }
});

Однако, когда я запускаю приложение на стороне клиента, оно вылетает с ошибкой

Error occuredError: write EPROTO 140593052855168:error:14094410:SSL 
routines:ssl3_read_bytes:sslv3 alert handshake 
failure:../ssl/record/rec_layer_s3.c:1399:SSL alert number 40

Сервер не должен предоставлять контент броузеру, ему просто нужно работать с приложением клиентского узла.Это работает, когда я устанавливаю rejectUnauthorized: false , но не когда оно установлено в true.Я был бы очень благодарен, если бы кто-то мог помочь мне в этом или дать какие-либо подсказки для возможного решения.Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Вам следует установить сертификат клиента, если вы используете самозаверяющие SSL-сертификаты.Не требуется устанавливать это при использовании сертификатов Let's Encrypt, оно уже сохранено в вашем браузере или системе.

0 голосов
/ 19 октября 2018

Именование это не то, что вы думаете.

По сути, вы перепутали ca, cert и key, что является очень распространенной ошибкой.

Вот несколько ресурсов для просмотра:

Решение

  • key относится к privkey.pem
  • cert относится к объединение из cert.pem И chain.pem (он же fullchain.pem)

Вы должны игнорировать ca, потому что ca относится к Центру сертификации и где вы быпоставьте root.pem, если вы используете проверку сертификата предприятия или военного партнера.

  • rejectUnauthorized: true IS отключает проверки безопасности.Вы не хотите этого.Вы хотите rejectUnauthorized: false (по умолчанию).
  • requestCert: true используется только для проверки сертификата пира.Вы не хотите этого.

Попробуйте Greenlock Too

Также вы можете использовать greenlock-express.js (Давайте зашифруем / ACME-клиент для node.js / express.js), чтобы вам не приходилось выполнять какую-либо ручную работу.

...