Как подключиться с помощью сертификатов на стороне клиента с помощью модуля https на Node.js - PullRequest
0 голосов
/ 04 февраля 2020

В работе мой веб-сайт использует сертификат Let's Encrypt, чтобы пользователь мог видеть в браузере действительную блокировку сертификата. Если пользователь переходит на маршрут example.com/dashboard, я хотел бы войти в систему, используя сертификат на стороне клиента (а не имя пользователя / пароль).

Я сгенерировал на сервере с помощью openssl private & publi c key , Ключ publi c остается на сервере, а закрытый ключ отправляется клиенту.

Используя это руководство , я создал на сервере. js

const express = require('express')
const https = require('https')
const fs = require('fs')

const masterapp = express()   

var options = {
    key: fs.readFileSync('/etc/ssl/certs/sslforfree/private.key'),
    cert: fs.readFileSync('/etc/ssl/certs/sslforfree/certificate.crt'),
    requestCert: true, 
    rejectUnauthorized: false,
}

И затем в промежуточном программном обеспечении

const cert = req.connection.getPeerCertificate()
    if (req.client.authorized) {
       if (cert.subject.CN === "Client123" && cert.fingerprint256 === "AA:BB:CC:DD:00..

В ОС Ma c правильно отображается подсказка в браузере, где я выбираю ключ (ключ хранится в связке ключей).

Проблемы:

  1. req.client.authorized всегда ложно
  2. Как с помощью Node.js можно безопасно проверить, что закрытый ключ соответствует publi c ключ?
  3. Безопаснее ли иметь поддомен dashboard.example.com или маршрут example.com/dashboard (express router)?

1 Ответ

1 голос
/ 11 февраля 2020

Согласно средней статье, на которую вы ссылались, вам необходимо указать свойство ca в объекте параметров. Это должен быть список клиентских CA, которым вы доверяете:

Наконец, мы предоставляем список сертификатов CA, которые мы считаем действительными. На данный момент мы подписываем клиентские сертификаты нашим собственным ключом сервера, поэтому он будет таким же, как наш серверный сертификат.

, ca: [ fs.readFileSync('server_cert.pem') ]
             }

Вы должны использовать ЦС для подписи ключа publi c сгенерированный ключ клиента. Для этого вам нужно сгенерировать CSR с закрытым ключом, а затем подписать CSR с помощью CA, который есть в списке. Как только вы это сделаете, вы можете отправить закрытый ключ и полученный сертификат клиенту в комплекте, и они смогут аутентифицироваться в вашей системе.

  1. Это потому, что вы отключили ca свойство.
  2. Это происходит между браузером и вашим сервером автоматически, как только вы получаете доверенный ca.
    1. Чтобы создать ЦС, вы можете использовать openssl для генерации самозаверяющего сертификата и закрытого ключа .
  3. Это зависит и истекло области видимости для stackoverflow. Вы можете задать вопрос на serverfault.com или security.stackexchange.com .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...