Создать доверенный самоподписанный SSL-сертификат для localhost (для использования с Express/Node)
Попытка выполнить различные инструкции по созданию самозаверяющего сертификата для использования с localhost. Большинство инструкций, похоже, для IIS, но я пытаюсь использовать Nodejs/Express. Ни один из них не работает должным образом, потому что, пока сертификат устанавливается, он не доверяется. вот то, что я пробовал, что не удается:
Может ли кто-нибудь предложить рабочий процесс, который может это сделать? Я могу установить сертификат, но Я не могу получить сертификат, которому доверяют либо хром (v32), либо IE (v10).
EDIT: в комментариях было высказано мнение, что проблема не является доверенным cert-root. Я установил сертификат через IE, но до сих пор не доверяю.
Ответы
Ответ 1
Ответы выше были частичными. Я потратил так много времени, чтобы заставить это работать, это безумие. Обратите внимание на мое будущее, вот что вам нужно сделать:
Я работаю над 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.
На данный момент у нас есть настройка сервера. Но браузер должен показывать предупреждающее сообщение.
Нам нужно зарегистрировать наш самозаверяющий сертификат в качестве доверенного центра сертификации CA в хранилище сертификатов chrome/windows. (chrome также сохраняет его в windows)
Шаг 6. откройте Dev Tools в Chrome, перейдите на панель "Безопасность" и нажмите "Просмотреть сертификат".
![enter image description here]()
Шаг 7. перейдите на панель "Подробности", нажмите "Копировать файл", затем, когда появится мастер экспорта сертификатов, нажмите "Далее", как показано ниже:
![go to details - copy file - next on export wizard]()
Шаг 8. оставьте кодировку DER, нажмите "Далее", выберите "TG48", поместите его в легкодоступную папку, например "Рабочий стол", и назовите сертификат localhost.cer, then click Save and then Finish.
. Вы должны увидеть свой сертификат на рабочем столе.
Шаг 9. Откройте chrome://settings/
, вставив его в поле URL. Внизу нажмите Advanced / Advanced Options
, затем прокрутите вниз, чтобы найти Manage Certificates
.
![choose manage certificates]()
Шаг 10. Перейдите на панель "Доверенные корневые центры сертификации" и нажмите "Импорт".
![Go to Trusted Root Certification Authorities panel, and click import]()
Мы импортируем сертификат localhost.cer
, который мы только что закончили экспортировать на шаге 8.
Шаг 11. нажмите кнопку обзора, найдите localhost.cer
, оставьте значения по умолчанию несколько раз подряд, пока не появится это предупреждение, нажмите кнопку да.
![confirm security exception]()
Шаг 12. закройте все и перезапустите Chrome. Затем при переходе на https://localhost:3000
вы должны увидеть:
![gotta love the green]()
Ответ 2
Кратчайший путь.
Протестировано на 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, и вы увидите, что он небезопасен. И все же!
- В меню "Инструменты разработчика"> "Безопасность"> "Показать сертификат": перетащите изображение на рабочий стол и дважды щелкните его.
- Нажмите "Добавить"
- Найдите его в Keychain Access и дважды щелкните по нему
- Разверните "Доверие" и измените "При использовании этого сертификата" на "Всегда доверять".
- Вас могут попросить подтвердить подлинность.
- Перезагрузите сервер.
- Обновите ваш браузер.
- Наслаждайтесь! :)
Ответ 3
Вы можете попробовать openSSL для создания сертификатов.
Посмотрите этот.
Вам понадобится файл .key и .crt, чтобы добавить HTTPS в node JS express server. После того, как вы сгенерируете это, используйте этот код, чтобы добавить 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 был подписан сам сертификат.
Однако в каждом браузере возникла ошибка, говорящая, что соединение не доверено, вы хотите продолжить. После того, как я нажимаю кнопку "Продолжить", все работает отлично.
Если кто-либо когда-либо обошел эту ошибку с самоподписанным сертификатом, пожалуйста, просветите.
Ответ 4
Как создать SSL-сертификат для localhost: ссылка
openssl genrsa -des3 -out server.key 1024
вам нужно ввести пароль, который вам нужно перепечатать в
следующие шаги
openssl req -new -key server.key -out server.csr
при запросе типа "Common Name": localhost
openssl x509 -req -days 1024 -in server.csr -signkey server.key -out server.crt
Ответ 5
Вот что у меня работает
на окнах
1) Добавьте это в свой файл% WINDIR%\System32\drivers\etc\hosts: 127.0.0.1 localdev.YOURSITE.net (у браузера есть проблемы с 'localhost' (для сценариев с несколькими источниками)
Windows Vista и Windows 7
В Vista и Windows 7 используется контроль учетных записей (UAC), поэтому Блокнот должен запускаться от имени администратора.
Нажмите Пуск → Все программы → Стандартные
Щелкните правой кнопкой мыши Блокнот и выберите Запуск от имени администратора.
Нажмите "Продолжить" в окне "Требуется разрешение Windows".
Когда открывается Блокнот, нажмите Файл → Открыть
В поле имени файла введите C:\Windows\System32\Drivers\etc\hosts
Нажмите Открыть
Добавьте это в файл% WINDIR%\System32\drivers\etc\hosts: 127.0.0.1 localdev.YOURSITE.net
Сохранить
Закройте и перезапустите браузеры
На Mac или Linux:
- Откройте /etc/hosts с разрешением
su
- Добавить
127.0.0.1 localdev.YOURSITE.net
- Сохрани это
При разработке вы используете localdev.YOURSITE.net вместо localhost, поэтому, если вы используете конфигурации запуска/отладки в вашем ide, обязательно обновите его.
Используйте ".YOURSITE.net" в качестве домена cookie (с точкой в начале) при создании файла cookie, тогда он должен работать со всеми поддоменами.
2) создать сертификат, используя этот localdev.url
СОВЕТ: Если у вас есть проблемы с генерацией сертификатов в Windows, используйте вместо этого машину VirtualBox или Vmware.
3) импортировать сертификат, как указано на
http://www.charlesproxy.com/documentation/using-charles/ssl-certificates/
Ответ 6
Если вы используете OSX/Chrome, вы можете добавить самоподписанный сертификат SSL в системный брелок, как описано здесь: http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and-self-signed-ssl-certificates
Это ручная процедура, но я наконец-то ее заработал. Просто убедитесь, что Common Name (CN) установлен на "localhost" (без порта), и после добавления сертификата убедитесь, что для всех параметров доверия в сертификате установлено значение "Всегда доверять". Также убедитесь, что вы добавили его в цепочку "Система", а не в цепочку "login".
Ответ 7
mkcert из @FiloSottile делает этот процесс бесконечно проще:
- Установите mkcert, есть инструкции для macOS/Windows/Linux
mkcert -install
для создания локального ЦС
mkcert localhost 127.0.0.1 ::1
для создания доверенного сертификата для локального хоста в текущем каталоге
- Вы используете узел (который не использует системное корневое хранилище), поэтому вам нужно явно указать CA в переменной среды, например:
export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"
- Наконец, запустите ваш экспресс-сервер, используя настройки, описанные в других ответах (например, ниже)
- бум. локальный житель плавает в зеленом.
Базовая настройка узла:
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 me key?
cert: fs.readFileSync('/XXX/localhost+2.pem'), // where me cert?
requestCert: false,
rejectUnauthorized: false,
}, app).listen(10443); // get creative
Ответ 8
Если вы используете node, почему бы не создать их с помощью node? Этот модуль выглядит довольно полно:
Обратите внимание, что я не буду генерировать "на лету". Создайте с помощью какой-то сборки script, чтобы иметь согласованный сертификат и ключ. В противном случае вам придется авторизовать только что созданный самозаверяющий сертификат каждый раз.
Ответ 9
В окнах я сделал сертификат развития iis, которому доверяют MMC (start > run > mmc), затем добавьте snapin сертификата, выбрав "локальный компьютер" и приняв значения по умолчанию. После добавления этой привязки сертификата разверните дерево сертификатов локального компьютера, чтобы посмотреть в разделе "Личный", выберите сертификат localhost, щелкните правой кнопкой мыши > все задачи > экспорт. принять все значения по умолчанию в мастере экспорта.
После сохранения этого файла разверните доверенные сертификаты и начните импортировать только что экспортированный сертификат. https://localhost
теперь доверяется хром, не имеющий предупреждений о безопасности.
Я использовал это руководство разрешение # 2 из блога MSDN, операционная система также поделилась ссылкой в своем вопросе о том, что также следует использовать MMC, но это сработало для меня.
разрешение # 2
Ответ 10
В этом есть больше аспектов.
Вы можете достичь TLS (некоторые продолжают говорить SSL) с сертификатом, подписанным самостоятельно или нет.
Чтобы иметь зеленую полосу для самозаверяющего сертификата, вам также необходимо стать центром сертификации (ЦС). Этот аспект отсутствует в большинстве ресурсов, которые я нашел в своем путешествии для достижения зеленой полосы в моей локальной настройке разработки. Стать центром сертификации так же просто, как создать сертификат.
Этот ресурс охватывает создание как сертификата CA, так и сертификата сервера, и в результате мои настройки показали зеленую полосу на локальном хосте Chrome, Firefox и Edge:
https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58
Обратите внимание: в Chrome вам необходимо добавить сертификат CA в доверенные органы.
Ответ 11
Некоторые из опубликованных ответов содержат фрагменты, которые мне очень помогли преодолеть и эту проблему. Тем не менее, меня также интересовало минимальное количество шагов и, в идеале, избегание 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" вы должны будете использовать опции (вместо "ключ" и "сертификат"): "pfx" и "пароль", как в:
var https = require('https');
var options = {
pfx: fs.readFileSync('mypfxfile'),
passphrase: 'foo'
};
var server = https.createServer(options);
Ответ 12
Перейти к: chrome://flags/
Включить: разрешить недействительные сертификаты для ресурсов, загруженных с локального хоста.
У вас нет зеленой защиты, но вы всегда можете использовать https://localhost в Chrome.