Подтвердить что ты не робот

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

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

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

EDIT: в комментариях было высказано мнение, что проблема не является доверенным cert-root. Я установил сертификат через IE, но до сих пор не доверяю.

4b9b3361

Ответ 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), поэтому Блокнот должен запускаться от имени администратора.

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

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

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

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

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

  6. Нажмите Открыть

  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 (с точкой в начале) при создании файла 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 делает этот процесс бесконечно проще:

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

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

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.