створити довірену SSL-сертифікат SSL для localhost (для використання з Express / Node)


130

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

Чи може хтось запропонувати робочий процес, який може це зробити? Я можу встановити cert, але я не можу довіряти cert ні хрому (v32), ні IE (v10).

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


Жоден із самопідписаних сертифікатів не можна довіряти веб-браузерам. Вони не підписані довіреними органами, що підписують.

1
це неправда: ви можете встановити кореневий сертифікат, щоб отримати впевненість у вашому самопідписаному cert. однак я не можу зробити це належним чином. Я прочитав, що ви можете встановити ланцюг cert в IE (не в хромі), тому я спробував це, але він все ще не розпізнається. Я не знаю, чи це тому, що localhost є особливим, або якщо самопідписаний cert просто невірний.
JasonS

3
У мене ніколи не було підписаного сертифіката, який працював із браузерами, як Chrome. Ось мій спосіб вирішення: я створив запис DNS для local.MYDOMAIN.com, що вказує на 127.0.0.1 (localhost), а потім просто використати мою програму cert. Це має додаткову перевагу - упевнитись у тому, що у вашому виробничому ланцюжку немає проблем тощо
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 .

На даний момент у нас налаштування сервера. Але браузер повинен показувати попереджувальне повідомлення.

Нам потрібно зареєструвати свій самопідписаний сертифікат як довірений сертифікаційний центр CA в магазині сертифікатів chrome / windows. (хром також зберігає це у вікнах,)

Крок 6. відкрийте інструменти Dev в хромі, перейдіть на панель безпеки, а потім натисніть кнопку Переглянути сертифікат. введіть тут опис зображення

Крок 7. перейдіть до панелі «Подробиці», натисніть «Копіювати файл», а потім, коли з’явиться майстер експорту сертифікатів, натисніть «Далі», як показано нижче:

перейти до деталей - копіювати файл - далі на майстер експорту

Крок 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вас, слід побачити: треба любити зелене


Привіт, коли я закінчу всі кроки, які я відкриваю, https://localhost:3000і Chrome затримується при завантаженні. Хто-небудь може сказати, що може бути причиною?
co.zohar

@ co.zohar якесь повідомлення в консолі? Натисніть crl+shift+iабо, F12щоб відкрити консоль.
AIon

1
Якщо ви робите це для адреси в мережі, я виявив, що встановити DNS-сертифікат на ім'я хоста, наприклад: DNS.1 = server.local Потім на підключувальній машині оновіть файл HOSTS, щоб вказати IP-адресу сервера на ім'я хоста, наприклад: 192.168.0.50 server.localЦе буде дозволити збіг сертифікату та адреси та підтвердити його.
roskelld

@Aon на консолі нічого не відображається. На сторінці просто відображається: "Очікування локального господаря ...". Ви щось налаштували у файлі хостів?
co.zohar

1
Я знайшов напіввідповідь на власне запитання: якщо ви змінили CN та DNS.1 на щось на зразок "local.com", наприклад, і в кожному комп'ютері, якому потрібен доступ до сервера, змініть файл etc / hosts, щоб вказати локальний .com до ip сервера, це працює.
TKoL

111

Найкоротший шлях. Тестовано на MacOS, але може працювати аналогічно і в інших ОС.

Створити пем

> 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 і двічі клацніть по ньому
  • Розгорніть "Довіра" та змініть "При використанні цього сертифіката" на "Завжди довіряти".
  • Можливо, вам буде запропоновано пройти автентифікацію.
  • Перезавантажте сервер.
  • Оновіть веб-переглядач.
  • Насолоджуйтесь! :)

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 / ...
Хосе

2
Я хочу додати, що для Chrome 58+ ви отримаєте помилку "Альтернативне ім'я теми відсутнє". stackoverflow.com/a/42917227/1057052 . Перегляньте відповіді нижче, щоб отримати додаткову допомогу: stackoverflow.com/a/43666288/1057052 , stackoverflow.com/a/44398368/1057052
Хосе А

14
Drag image to your desktop and double click it -> я нічого не можу перетягнути на робочий стіл, не перетягується .. Що image ти точно говориш про руду?
AIon

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для кращого ключа.
парі

3
Вашому сертифікату все ще не довіряють.
Дієго Мелло

2
експрес-код вище працює, використовуючи github.com/FiloSottile/mkcert (замість openSSL) для створення локального CA / довіреного cert. Зелені смуги всюди.
сом

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Потім localhost https запити працюють під NodeJS 8+ Id також зростає1024 to 2048
Сальянгоз

6

Ось що для мене працює

на вікнах

1) Додайте це до файлу% WINDIR% \ System32 \ driver \ 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. Клацніть Відкрити

  7. Додайте це до файлу% WINDIR% \ System32 \ driver \ 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, тому якщо ви використовуєте конфігурації run / debug у своїй ідеї, обов'язково оновіть його.

Використовуйте ".YOURSITE.net" як cookiedomain (з крапкою на початку) при створенні cookiem, тоді він повинен працювати з усіма піддоменами.

2) створити сертифікат за допомогою цього localdev.url

Порада: Якщо у вас виникають проблеми з генерацією сертифікатів на Windows, замість цього використовуйте машину VirtualBox або Vmware.

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


Привіт Трой, дякую за те, що поділився цим. Хтось ще повинен буде коментувати, працює це чи ні. Моє вирішення: я в кінцевому підсумку додав dev.phantomjscloud.com до файлу хостів, а потім використовував свою програму cert. Це корисно лише в тому випадку, якщо ви хочете, щоб ваші виробничі ключі були доступні у вашій скриньці для розробників, тому я думаю, що ваше рішення все-таки може бути дійсним, якщо хтось інший може будь-ласка перевірити
JasonS

Це працює для мене та моєї команди, поєднуючи способи, захистити локальний та локальний сервери, щоб забезпечити локальний та виробничий сервер.
TroyWorks

Для Windows консоль git bash чудово працює, використовуючи команди opensl звідси . Потрібно просто встановити кореневий сертифікат, і ви можете створити декілька сертифікованих ним сертифікатів, якщо ви хочете.
Джейсон Гімаат

6

Mkcert від @FiloSottile робить цей процес нескінченно простішим:

  1. Встановити mkcert , є інструкції для macOS / Windows / Linux
  2. mkcert -install створити локальний ЦА
  3. mkcert localhost 127.0.0.1 ::1 створити довірений сертифікат для localhost у поточному каталозі
  4. Ви використовуєте вузол (який не використовує кореневий накопичувач системи), тому вам потрібно чітко вказати ЦС у змінній середовища, наприклад: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'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

Якщо ви використовуєте вузол, чому б не створити їх за допомогою вузла? Цей модуль, здається, досить повно:

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


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, який поєднує cert та приватний ключ. Ви можете експортувати pfx легко з диспетчера сертифікатів, але це впливає на те, як ви його використовуєте в NodeJS. При створенні ініціативи Сервера за допомогою модуля 'https' ви б використовували параметри (замість 'ключ' та 'cert') як "pfx" та "passphrase", як у:

var https = require('https');
var options = { 
    pfx: fs.readFileSync('mypfxfile'), 
    passphrase: 'foo' 
};
var server = https.createServer(options);

2

у Windows я зробив сертифікат розробки iis довіреним за допомогою MMC (пуск> запуск> mmc), потім додав оснастку сертифіката, вибравши "локальний комп'ютер" та прийнявши за замовчуванням. Коли додається оснащення сертифікату, розгорніть дерево сертифікатів локального комп'ютера, щоб переглянути розділ Особисте, виберіть сертифікат localhost, клацніть правою кнопкою миші> все завдання> експортувати. прийняти всі типові параметри у майстрі експорту.

Після збереження цього файлу розгорніть довірені сертифікати та починайте імпортувати cert, який ви щойно експортували. https://localhostтепер довіряють хрому, який не має попереджень щодо безпеки.

Я використав цей посібник з роздільною здатністю №2 з блогу MSDN, оп також поділився посиланням у своєму питанні про те, що також слід використовувати MMC, але це працювало для мене. резолюція №2


2

Йти до: chrome://flags/

Увімкнути: дозволити недійсні сертифікати для ресурсів, завантажених з localhost.

У вас немає зеленого захисту, але вам завжди дозволено https: // localhost в хромі.


2

У цьому є більше аспектів.

Ви можете досягти TLS (деякі продовжують говорити SSL) за допомогою сертифіката, самостійно підписаного чи ні.

Щоб мати зелену смугу для самопідписаного сертифіката, вам також потрібно стати органом з сертифікації (CA). Цей аспект відсутній у більшості ресурсів, які я знайшов під час подорожі до досягнення зеленої смуги в моїх локальних програмах розвитку. Стати сертифікатом так само просто, як створити сертифікат.

Цей ресурс охоплює створення сертифіката CA та сертифіката сервера, і в результаті моїх налаштувань було показано зелену смугу на localhost Chrome, Firefox та Edge: https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58

Зверніть увагу: у Chrome потрібно додати сертифікат CA довіреним властям.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.