Использование самоподписанного сертификата CA для WebSocket (ws) в Node JS - PullRequest
0 голосов
/ 15 января 2020

Мне нужно использовать ws клиент в Node JS для подключения к отдельному серверу WebSocket.

Я могу подключиться с помощью примера программы в моем Chrome, так как я установил самоподписанный Root CA в хранилище доверенных Root центров сертификации на моей машине.

Я знаю, что Node JS использует жестко закодированный список Root CA (глупо), но я я надеялся, что есть какой-то способ импортировать свой собственный.

Я попытался:

        export NODE_EXTRA_CA_CERTS=C:\\Users\\IT1\\Documents\\security\\rootCA.pem
  • с использованием библиотеки ssl- root -cas , предлагаемой во многих сообщениях на форуме, но я думаю, что она может быть неприменима здесь, поскольку она не меняет https для клиента ws, который я использую. (Я думаю, что сейчас я плевался)
  • , используя параметры ca, cert и key, доступные для конструктора WebSocket.
        // Using just ca
        var test = new WebSocket(uri, {
            ca: fs.readFileSync("C:\\Users\\IT1\\Documents\\security\\rootCA.pem")
        });

        // Using cert and key
        var test = new WebSocket(uri, {
            cert: fs.readFileSync("C:\\Users\\IT1\\Documents\\security\\rootCA.crt"),
            key: fs.readFileSync("C:\\Users\\IT1\\Documents\\security\\rootCA.key")
        });

        // Using ca, cert and key
        var test = new WebSocket(uri, {
            ca: fs.readFileSync("C:\\Users\\IT1\\Documents\\security\\rootCA.pem"),
            cert: fs.readFileSync("C:\\Users\\IT1\\Documents\\security\\rootCA.crt"),
            key: fs.readFileSync("C:\\Users\\IT1\\Documents\\security\\rootCA.key")
        });

И Неважно, что Я всегда получаю следующее сообщение об ошибке:

events.js:200
      throw er; // Unhandled 'error' event
      ^

Error: unable to verify the first certificate
    at TLSSocket.onConnectSecure (_tls_wrap.js:1321:34)
    at TLSSocket.emit (events.js:223:5)
    at TLSSocket._finishInit (_tls_wrap.js:794:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:608:12)
Emitted 'error' event on WebSocket instance at:
    at ClientRequest.<anonymous> (C:\Users\IT1\source\repos\WebSocketTest\WebSocketTest\node_modules\ws\lib\websocket.js:554:15)
    at ClientRequest.emit (events.js:223:5)
    at TLSSocket.socketErrorListener (_http_client.js:406:9)
    at TLSSocket.emit (events.js:223:5)
    at emitErrorNT (internal/streams/destroy.js:92:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
    at processTicksAndRejections (internal/process/task_queues.js:81:21) {
  code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'
}

Кроме того, я не могу использовать rejectUnauthorized: true. Мне нужно, чтобы он был авторизован, поэтому, пожалуйста, не предлагайте это как решение.

Пожалуйста, помогите, я действительно почесал голову от этого.

1 Ответ

1 голос
/ 23 января 2020

После почти дня или двух царапин на голове я решил проверить сертификаты в OpenSSL. Оказалось, что в сертификате используется другой алгоритм шифрования (SHA 256 против DES3 или что-то в этом роде). Причина, по которой он работал нормально в браузере, заключается в том, что я уже установил другой сертификат для этого домена ранее.

Мораль истории:

  1. ВСЕГДА проверяйте ваши SSL-сертификаты с OpenSSL перед пытаясь использовать их в своем коде. OpenSSL всегда будет МНОГО больше информации о том, почему ваш сертификат не работает, чем NodeJS, Java или любая среда выполнения.
  2. Удалите все сертификаты для домена из вашего доверенного хранилища root перед тестированием Root Сертификат.
  3. Я следовал онлайн-урокам по созданию Самозаверяющего Root CA в Windows, и обнаруженные мною уроки не давали много информации о том, что я делал, больше так что "это то, как ты это делаешь". Здесь я ошибся, потому что следовал нескольким учебникам и комбинировал информацию, чтобы найти решение. Это означало, что я сгенерировал root сертификат и закрытый ключ, используя один учебник, а затем подписал другие сертификаты, используя другой учебник (в котором был задан другой алгоритм, но НЕ объяснялось, что алгоритмы должны соответствовать для root CA и подписанного сертификата) .
  4. Это помогает понять, как работают SSL и Root сертификаты, прежде чем заняться созданием самоподписанного root CA. Не с технической точки зрения, а с точки зрения того, почему существуют Root ЦС, как они используются в реальном мире и как они применимы к вашему приложению как разработчику. Я нашел эту статью чрезвычайно полезной.
...