создать доверенный самозаверяющий сертификат SSL для localhost (для использования с Express / Node)

130

Пытаюсь следовать различным инструкциям по созданию самозаверяющего сертификата для использования с localhost. Большинство инструкций похоже для IIS, но я пытаюсь использовать Nodejs / Express. Ни один из них не работает должным образом, потому что пока сертификат установлен, ему не доверяют. вот что я пробовал, что не удалось:

Может ли кто-нибудь предложить рабочий процесс, который может это сделать? Я могу установить сертификат, но не могу доверять сертификату ни в chrome (v32), ни в IE (v10).

РЕДАКТИРОВАТЬ: в комментариях было высказано предположение, что проблема не в доверенном корне сертификата. Я установил сертификат через IE, но ему все еще не доверяют.

Jasons
источник
Ни один из самоподписанных сертификатов нельзя сделать доверенным для веб-браузеров. Они не подписаны доверенными подписывающими органами.
1
это неправда: вы можете установить корневой сертификат, чтобы доверять своему самозаверяющему сертификату. однако я не могу делать это должным образом. Я читал, что вы можете установить цепочку сертификатов в IE (не в хроме), поэтому я попробовал это, но он все еще не распознается. Я не знаю, потому ли это, что localhost особенный, или самозаверяющий сертификат просто неверен.
JasonS
3
У меня никогда не было самозаверяющего сертификата, работающего с такими браузерами, как Chrome. Вот мой обходной путь: я создал запись DNS для local.MYDOMAIN.com, указывающую на 127.0.0.1 (localhost), а затем просто использовал свой производственный сертификат. Это дает дополнительное преимущество, заключающееся в том, что нет проблем с вашей производственной цепочкой сертификатов и т. Д.
JasonS

Ответы:

86

Ответы выше были частичными. Я потратил столько времени на то, чтобы это работало, это безумие. На заметку для себя в будущем: вот что вам нужно сделать:

Я работаю над Windows 10 с Chrome 65. Firefox ведет себя хорошо - просто подтвердите localhost как исключение безопасности, и он будет работать. В Chrome нет:

Шаг 1. В вашем бэкэнде создайте папку с именем security. мы будем работать внутри него.

Шаг 2. Создайте файл конфигурации запроса req.cnfсо следующим содержимым (кредит принадлежит: @Anshul )

req.cnf:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = Country initials like US, RO, GE
ST = State
L = Location
O = Organization Name
OU = Organizational Unit 
CN = www.localhost.com
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.localhost.com
DNS.2 = localhost.com
DNS.3 = localhost

Объяснение этого поля находится здесь .

Шаг 3. Перейдите в папку безопасности в терминале и введите следующую команду:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout cert.key -out cert.pem -config req.cnf -sha256

Шаг 4. Затем вне securityпапки в экспресс-приложении сделайте что-то вроде этого: (кредит принадлежит @Diego Mello)

backend 
 /security
 /server.js

server.js:

const express = require('express')
const app = express()
const https = require('https')
const fs = require('fs')
const port = 3000

app.get('/', (req, res) => {
    res.send("IT'S WORKING!")
})

const httpsOptions = {
    key: fs.readFileSync('./security/cert.key'),
    cert: fs.readFileSync('./security/cert.pem')
}
const server = https.createServer(httpsOptions, app)
    .listen(port, () => {
        console.log('server running at ' + port)
    })

Шаг 5. Запустите сервер, node server.jsи перейдите по адресу https: // localhost: 3000. .

На этом этапе у нас есть настройка сервера. Но браузер должен показать предупреждающее сообщение.

Нам необходимо зарегистрировать наш самозаверяющий сертификат в качестве доверенного центра сертификации ЦС в хранилище сертификатов Chrome / Windows.(Chrome также сохраняет это в окнах,)

Шаг 6. Откройте Инструменты разработчика в Chrome, перейдите на панель «Безопасность» и нажмите «Просмотр сертификата». введите описание изображения здесь

Шаг 7. перейдите в панель Details, нажмите Copy File, затем, когда появится мастер экспорта сертификатов, нажмите Next, как показано ниже:

перейти к деталям - копировать файл - далее в мастере экспорта

Шаг 8. оставьте кодировку DER, нажмите «Далее», выберите Browse, поместите его в легко доступную папку, такую ​​как Рабочий стол, и назовите сертификат.localhost.cer, then click Save and then Finish. . Вы должны увидеть свой сертификат на рабочем столе.

Шаг 9. Откройте chrome://settings/, вставив его в поле url. Внизу нажмите Advanced / Advanced Options, а затем прокрутите вниз, чтобы найти Manage Certificates.

выберите управление сертификатами

Шаг 10. Перейдите на панель «Доверенные корневые центры сертификации» и нажмите «Импорт».

Перейдите на панель "Доверенные корневые центры сертификации" и нажмите "Импорт".

Мы импортируем localhost.cerсертификат, который мы только что завершили на шаге 8.

Шаг 11. Нажмите «Обзор», найдите localhost.cer, оставьте значения по умолчанию, нажмите «Далее» несколько раз - пока не появится это предупреждение, нажмите «Да».

подтвердить исключение безопасности

Шаг 12. закройте все и перезапустите хром. Тогда, идя к https://localhost:3000вам, вы должны увидеть: должен любить зеленый

AION
источник
Привет, когда я завершаю все шаги, я открываю, https://localhost:3000а Chrome зависает при загрузке. Кто-нибудь может сказать, в чем может быть причина?
co.zohar 04
@ co.zohar какое-нибудь сообщение в консоли? Нажмите crl+shift+iили, F12чтобы открыть консоль.
AI
1
Если вы делаете это для адреса в сети, я обнаружил, что настройка DNS сертификата на имя хоста, например: DNS.1 = server.local Затем на подключающейся машине обновите файл HOSTS, чтобы указать IP-адрес сервера на имя хоста, например: 192.168.0.50 server.localЭто будет разрешите совпадение сертификата и адреса и подтвердите сертификат.
roskelld 05
@AIon консоль ничего не показывает. На странице просто отображается: «Ожидание localhost ...». Вы что-нибудь настраивали в файле hosts?
co.zohar 07
1
Я нашел полуответ на свой вопрос: если вы измените CN и DNS.1 на что-то вроде «local.com», например, и на каждом компьютере, которому требуется доступ к серверу, измените файл etc / hosts, чтобы указать локальный .com к IP-адресу сервера, это работает.
TKoL
111

Кратчайший путь. Протестировано на MacOS, но может работать аналогично в других ОС.

Создать pem

> openssl req -x509 -newkey rsa:2048 -keyout keytmp.pem -out cert.pem -days 365

> openssl rsa -in keytmp.pem -out key.pem

Ваш экспресс-сервер

const express = require('express')
const app = express()
const https = require('https')
const fs = require('fs')
const port = 3000

app.get('/', (req, res) => {
  res.send('WORKING!')
})

const httpsOptions = {
  key: fs.readFileSync('./key.pem'),
  cert: fs.readFileSync('./cert.pem')
}
const server = https.createServer(httpsOptions, app).listen(port, () => {
  console.log('server running at ' + port)
})
  • Откройте https://localhost:3000в Google Chrome, и вы увидите, что это небезопасно. Все же!
  • В Инструменты разработчика> Безопасность> Просмотр сертификата: перетащите изображение на рабочий стол и дважды щелкните его.
  • Нажмите "Добавить".
  • Найдите его в Связке ключей и дважды щелкните по нему.
  • Разверните «Доверять» и измените «При использовании этого сертификата» на «Всегда доверять».
  • Вам может быть предложено пройти аутентификацию.
  • Перезагрузите ваш сервер.
  • Обновите ваш браузер.
  • Наслаждайтесь! :)
Диего Мелло
источник
1
Вот еще одна ссылка, если вы хотите сделать это на Mac: certsimple.com/blog/localhost-ssl-fix .
Джон
Прекрасный! Это сработало! Хочу дополнить: Установите OpenSSL отсюда: indy.fulgan.com/SSL/?C=M;O=A . Получите файл .cnf отсюда: а затем настройте его отсюда: gist.githubusercontent.com/pandurang90/dbe6a67339747ef5bacf/raw/… и настройте openSSL отсюда: stackoverflow.com/questions/7360602/…
Jose A
2
Я хотел бы добавить, что для Chrome 58+ вы получите сообщение об ошибке «Отсутствует альтернативное имя субъекта». stackoverflow.com/a/42917227/1057052 . Чтобы получить дополнительную помощь ,
Jose A
14
Drag image to your desktop and double click it-> Ничего не могу перетащить на рабочий стол, не перетаскивается .. О imageчем конкретно вы говорите?
AI
7
Чтобы решить проблему «Отсутствует альтернативное имя субъекта» в Chrome, вы можете сделать это openssl req -newkey rsa:2048 -x509 -nodes -keyout keytmp.pem -new -out cert.pem -subj /CN=localhost -reqexts SAN -extensions SAN -config <(cat /System/Library/OpenSSL/openssl.cnf <(printf '[SAN]\nsubjectAltName=DNS:localhost')) -sha256 -days 3650вместо первой предложенной вами строки. Кроме того, этот будет задавать меньше вопросов в процессе ...
Майкл Литвин
78

Вы можете попробовать openSSL для создания сертификатов. Взгляните на это .

Вам понадобятся файлы .key и .crt, чтобы добавить HTTPS на сервер JS Express узла. Как только вы его сгенерируете, используйте этот код, чтобы добавить HTTPS на сервер.

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

var options = {
    key: fs.readFileSync('/etc/apache2/ssl/server.key'),
    cert: fs.readFileSync('/etc/apache2/ssl/server.crt'),
    requestCert: false,
    rejectUnauthorized: false
};


var app = express();

var server = https.createServer(options, app).listen(3000, function(){
    console.log("server started at port 3000");
});

Это нормально работает на моем локальном компьютере, а также на сервере, на котором я его развернул. Тот, который у меня есть на сервере, был куплен у goDaddy, но у localhost был самоподписанный сертификат.

Однако каждый браузер выдавал ошибку, говоря, что соединение не является доверенным, вы хотите продолжить. После того, как я нажму «Продолжить», все заработало.

Если кто-нибудь когда-либо обходил эту ошибку с помощью самоподписанного сертификата, просветите пожалуйста.

Марс Робертсон
источник
9
Ваш сертификат все еще не является доверенным, поэтому у вас та же проблема, которую я описываю. Мне нужно, чтобы ему доверяли для правильного тестирования / отладки веб-сервиса.
JasonS
1
Значит, вы хотите, чтобы этому сертификату доверяли только на вашем локальном компьютере, а не в сети?
1
ссылка в верхней части ответа рекомендует 1024-битное шифрование 3DES, которое устарело. Лучше использовать openssl genrsa -out key.pem 2048для лучшего ключа.
Steampowered
3
Ваш сертификат все еще не доверяет.
Диего Мелло
2
приведенный выше экспресс-код работает, используя github.com/FiloSottile/mkcert (вместо openSSL) для создания локального центра сертификации / доверенного сертификата. Зеленые полосы полностью.
сом
11

Как сгенерировать SSL-сертификат для localhost: ссылка

openssl genrsa -des3 -out server.key 1024

вам необходимо ввести пароль здесь, который вам нужно будет повторно ввести в следующих шагах

openssl req -new -key server.key -out server.csr

когда вас спросят "Общее имя" введите: localhost

openssl x509 -req -days 1024 -in server.csr -signkey server.key -out server.crt
Фума
источник
1
Это решение, которое я рыскал по Интернету за последние 2 часа. Для всех в ubuntu переместите cp server.crt /usr/local/share/ca-certificates/.и запустите. sudo update-ca-certificatesТогда https-запросы localhost работают под NodeJS 8+. Id также увеличивается1024 to 2048
Salyangoz
6

Вот что у меня работает

на окнах

1) Добавьте это в свой файл% WINDIR% \ System32 \ drivers \ etc \ hosts: 127.0.0.1 localdev.YOURSITE.net (потому что у браузера есть проблемы с localhost (для сценариев с перекрестным происхождением)

В Windows Vista и Windows 7 Vista и Windows 7 используется контроль учетных записей пользователей (UAC), поэтому Блокнот необходимо запускать от имени администратора.

  1. Нажмите Пуск -> Все программы -> Стандартные.

  2. Щелкните правой кнопкой мыши Блокнот и выберите Запуск от имени администратора.

  3. Нажмите «Продолжить» в окне UAC «Windows требуется ваше разрешение».

  4. Когда откроется Блокнот, нажмите Файл -> Открыть.

  5. В поле имени файла введите C: \ Windows \ System32 \ Drivers \ etc \ hosts

  6. Нажмите Open

  7. Добавьте это в свой файл% WINDIR% \ System32 \ drivers \ etc \ hosts: 127.0.0.1 localdev.YOURSITE.net

  8. Сохранить

  9. Закройте и перезапустите браузеры

На Mac или Linux:

  1. Откройте / etc / hosts с suразрешением
  2. Добавить 127.0.0.1 localdev.YOURSITE.net
  3. Сохрани это

При разработке вы используете localdev.YOURSITE.net вместо localhost, поэтому, если вы используете конфигурации запуска / отладки в своем ide, обязательно обновите их.

Используйте ".YOURSITE.net" в качестве домена cookie (с точкой в ​​начале) при создании cookiem, тогда он должен работать со всеми поддоменами.

2) создайте сертификат, используя этот localdev.url

СОВЕТ: Если у вас есть проблемы с созданием сертификатов в Windows, используйте вместо этого машину VirtualBox или Vmware.

3) импортируйте сертификат, как указано на http://www.charlesproxy.com/documentation/using-charles/ssl-certificates/

TroyWorks
источник
Привет, Трой, спасибо, что поделились этим. Кто-то еще должен будет прокомментировать, работает это или нет. Мое решение: я добавил dev.phantomjscloud.com в свой файл hosts, а затем использовал свой производственный сертификат. Это полезно только в том случае, если вы хотите, чтобы ваши производственные ключи были доступны на вашем устройстве разработчика, поэтому я думаю, что ваше решение все еще может быть действительным, если кто-то другой может подтвердить,
JasonS
Это работает для меня и моей команды, причем несколько способов: от локального до локального сервера и от локального до производственного.
TroyWorks
Для Windows отлично работает консоль git bash, используя команды openssl отсюда . Просто нужно установить корневой сертификат, и вы можете создать несколько сертификатов для конкретного сайта, подписанных им, если хотите.
Джейсон Гоэмаат
6

Mkcert от @FiloSottile делает этот процесс бесконечно проще:

  1. Установите mkcert , есть инструкция для macOS / Windows / Linux
  2. mkcert -install создать локальный ЦС
  3. mkcert localhost 127.0.0.1 ::1 для создания доверенного сертификата для localhost в текущем каталоге
  4. Вы используете узел (который не использует корневое хранилище системы), поэтому вам нужно явно указать CA в переменной среды, например:export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"
  5. Наконец, запустите свой экспресс-сервер, используя настройку, описанную в различных других ответах (например, ниже)
  6. бум. localhost купается в зелени.

Базовая настройка узла:

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

const app = express();    
const server = https.createServer({
    key: fs.readFileSync('/XXX/localhost+2-key.pem'), // where's me key?
    cert: fs.readFileSync('/XXX/localhost+2.pem'), // where's me cert?
    requestCert: false,
    rejectUnauthorized: false,
}, app).listen(10443); // get creative
сома
источник
Отлично работает! При таком подходе нам не нужно регистрировать наш самозаверяющий сертификат в качестве доверенного центра сертификации CA в хранилище сертификатов Chrome / Windows. Как упоминалось в других ответах.
zaheer
4

Если вы используете OSX / Chrome, вы можете добавить самозаверяющий сертификат SSL в свою системную связку ключей, как описано здесь: http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and -самосопряженных подписанный SSL-сертификаты-

Это ручной процесс, но наконец-то он заработал. Просто убедитесь, что для общего имени (CN) установлено значение «localhost» (без порта), и после добавления сертификата убедитесь, что для всех параметров доверия в сертификате установлено значение «Всегда доверять». Также убедитесь, что вы добавили его в цепочку ключей «Система», а не в цепочку ключей «Вход».

Виджай Рудрараджу
источник
Он упоминает IE, что означает, что он использует Windows.
2 бита
3

Если вы используете узел, почему бы не сгенерировать их с помощью узла? Этот модуль кажется довольно полнофункциональным:

Обратите внимание, что я не буду генерировать на лету. Сгенерируйте с помощью какого-либо сценария сборки, чтобы у вас был согласованный сертификат и ключ. В противном случае вам придется каждый раз авторизовать вновь созданный самозаверяющий сертификат.

BT
источник
3

В некоторых из опубликованных ответов есть части, которые были мне очень полезны для решения этой проблемы. Однако меня также интересовали минимальные количество шагов и, в идеале, отказ от OpenSSL (в Windows 10).

Итак, один важный фрагмент из ответов (кредит: @ TroyWorks ) заключается в том, что вам нужно отредактировать файл HOSTS, чтобы создать фиктивный сервер, и сопоставить его с 127.0.0.1. Это предполагает, что вы собираетесь заниматься локальной разработкой.

В моем случае я использовал сертификат SS для защиты веб-сокета в NodeJS, и этот сокет был подключен программно (в отличие от браузера). Поэтому для меня было критически важно, чтобы сертификат был принят без предупреждений или ошибок, и критически важной частью было создание сертификата с правильным CN (и, конечно же, принятие сертификата в доверенные органы, как описано в других местах ответов) , Использование IIS для создания самозаверяющего сертификата не приведет к созданию надлежащего CN, поэтому я обнаружил следующую простую команду с помощью Powershell:

New-SelfSignedCertificate -DnsName "gandalf.dummy.dev" -FriendlyName "gandalf" -CertStoreLocation "cert:\LocalMachine\My"

Это должно быть выполнено в консоли администратора PS, но оно просто работает и помещает сертификат в раздел «Личный» хранилища сертификатов LocalMachine. Вы можете проверить его создание, выполнив:

ls cert:\LocalMachine\My 

Чтобы доверять ему, просто скопируйте это и вставьте в «Доверенные корневые центры сертификации» с помощью диспетчера сертификатов (убедитесь, что вы смотрите на сертификаты локального компьютера, а не на текущего пользователя!).

Если вы привяжетесь к этому сертификату в IIS, вы сможете нажать https://gandalf.dummy.dev/ и получить безопасное соединение без каких-либо предупреждений.

Последняя часть, использующая это в NodeJS, описана выше и в других ответах SO, поэтому я только добавлю, что в Windows легче работать с файлом pfx, который объединяет сертификат и закрытый ключ. Вы можете легко экспортировать pfx из диспетчера сертификатов, но это влияет на то, как вы его используете в NodeJS. При создании экземпляра Сервера с использованием модуля https, параметры, которые вы должны использовать (вместо key и cert), будут pfx и passphrase, как в:

var https = require('https');
var options = { 
    pfx: fs.readFileSync('mypfxfile'), 
    passphrase: 'foo' 
};
var server = https.createServer(options);
Томо
источник
2

в Windows я сделал сертификат разработки iis доверенным с помощью MMC (start> run> mmc), затем добавил оснастку сертификата, выбрав «локальный компьютер» и приняв значения по умолчанию. После того, как этот снимок сертификата добавлен, разверните дерево сертификатов локального компьютера, чтобы найти в разделе «Личные», выберите сертификат localhost, щелкните правой кнопкой мыши> все задачи> экспорт. примите все значения по умолчанию в мастере экспорта.

После сохранения этого файла разверните доверенные сертификаты и начните импортировать только что экспортированный сертификат. https://localhostтеперь доверяет Chrome без предупреждений о безопасности.

Я использовал это руководство № 2 из блога MSDN, оператор также поделился ссылкой в ​​своем вопросе о том, что также следует использовать MMC, но это сработало для меня. разрешение # 2

mushcraft
источник
2

Перейти к: chrome://flags/

Включить: разрешить недействительные сертификаты для ресурсов, загруженных с localhost.

У вас нет зеленой безопасности, но вы всегда можете использовать https: // localhost в Chrome.

Alphapage
источник
2

Есть и другие аспекты.

Вы можете достичь TLS (некоторые продолжают говорить SSL) с помощью сертификата, самоподписанного или нет.

Чтобы иметь зеленую полосу для самозаверяющего сертификата, вам также необходимо стать центром сертификации (CA). Этот аспект отсутствует в большинстве ресурсов, которые я нашел на своем пути к достижению зеленой полосы в моей локальной настройке разработки. Стать центром сертификации так же просто, как создать сертификат.

Этот ресурс охватывает создание как сертификата CA, так и сертификата сервера, и в результате моя настройка показала зеленую полосу на localhost Chrome, Firefox и Edge: https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58

Обратите внимание: в Chrome вам нужно добавить сертификат CA в доверенные центры.

Jos
источник
0

Если вам нужно пойти дальше подробных шагов @ alon, а также создать самоподписанный CA:

https.createServer({
  key: fs.readFileSync(NODE_SSL_KEY),
  cert: fs.readFileSync(NODE_SSL_CERT),
  ca: fs.readFileSync(NODE_SSL_CA),
}, app).listen(PORT, () => {});

package.json

"setup:https": "openssl genrsa -out src/server/ssl/localhost.key 2048
&& openssl req -new -x509 -key src/server/ssl/localhost.key -out src/server/ssl/localhost.crt -config src/server/ssl/localhost.cnf
&& openssl req -new -out src/server/ssl/localhost.csr -config src/server/ssl/localhost.cnf
&& openssl x509 -req -in src/server/ssl/localhost.csr -CA src/server/ssl/localhost.crt -CAkey src/server/ssl/localhost.key -CAcreateserial -out src/server/ssl/ca.crt",

Используя localhost.cnf, как описано:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = UK
ST = State
L = Location
O = Organization Name
OU = Organizational Unit 
CN = www.localhost.com
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.localhost.com
DNS.2 = localhost.com
DNS.3 = localhost
mummybot
источник