Я начал писать обертку для API, который требует от всех запросов по протоколу HTTPS. Вместо того, чтобы делать запросы к собственно API в то время как я занимаюсь разработкой и тестированием он я хотел бы запустить свой собственный сервер локально, который издевается над ответами.
Я путать о том, как генерировать сертификаты мне нужно создать сервер HTTPS и отправлять запросы к нему.
Мой сервер выглядит примерно так:
var options = {
key: fs.readFileSync('./key.pem'),
cert: fs.readFileSync('./cert.pem')
};
https.createServer(options, function(req, res) {
res.writeHead(200);
res.end('OK\n');
}).listen(8000);
PEM-файлы были созданы:
openssl genrsa 1024 > key.pem
openssl req -x509 -new -key key.pem > cert.pem
И запрос выглядит примерно так:
var options = {
host: 'localhost',
port: 8000,
path: '/api/v1/test'
};
https.request(options, function(res) {
res.pipe(process.stdout);
}).end();
С помощью этой установки, я получаю ошибка: DEPTH_ZERO_SELF_SIGNED_CERT
, так что я думаю, мне нужно добавить параметр Калифорния
для запроса.
Так мой вопрос как я должен создать следующее:
верняк
?Я читал кое-что об генерировать собственные сертификаты с OpenSSL, но может'т, кажется, чтобы обернуть мою голову вокруг него и выяснить, какие ключи и сертификаты для использования там, где в моем коде узла.
Обновление
API предоставляет сертификат центра сертификации для использования вместо значений по умолчанию. Следующий код работает, используя свой сертификат и это то, что я хочу воспроизвести локально.
var ca = fs.readFileSync('./certificate.pem');
var options = {
host: 'example.com',
path: '/api/v1/test',
ca: ca
};
options.agent = new https.Agent(options);
https.request(options, function(res) {
res.pipe(process.stdout);
}).end();
Или реальные сертификаты сделать работу лучше? Рассматривали ли вы какие-либо из этих?
(Примечание: позвольте'ы шифрования также могут выдавать сертификаты к частным сетям)
https://coolaj86.com/articles/how-to-create-a-csr-for-https-tls-ssl-rsa-pems/
https://github.com/coolaj86/nodejs-self-signed-certificate-example
Используя локальным `localhost.greenlock.доменов в качестве примера (он указывает на 127.0.0.1):
'use strict';
var https = require('https')
, port = process.argv[2] || 8043
, fs = require('fs')
, path = require('path')
, server
, options
;
require('ssl-root-cas')
.inject()
.addFile(path.join(__dirname, 'server', 'my-private-root-ca.cert.pem'))
;
options = {
// this is ONLY the PRIVATE KEY
key: fs.readFileSync(path.join(__dirname, 'server', 'privkey.pem'))
// You DO NOT specify `ca`, that's only for peer authentication
//, ca: [ fs.readFileSync(path.join(__dirname, 'server', 'my-private-root-ca.cert.pem'))]
// This should contain both cert.pem AND chain.pem (in that order)
, cert: fs.readFileSync(path.join(__dirname, 'server', 'fullchain.pem'))
};
function app(req, res) {
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, encrypted world!');
}
server = https.createServer(options, app).listen(port, function () {
port = server.address().port;
console.log('Listening on https://127.0.0.1:' + port);
console.log('Listening on https://' + server.address().address + ':' + port);
console.log('Listening on https://localhost.greenlock.domains:' + port);
});
'use strict';
var https = require('https')
, fs = require('fs')
, path = require('path')
, ca = fs.readFileSync(path.join(__dirname, 'client', 'my-private-root-ca.cert.pem'))
, port = process.argv[2] || 8043
, hostname = process.argv[3] || 'localhost.greenlock.domains'
;
var options = {
host: hostname
, port: port
, path: '/'
, ca: ca
};
options.agent = new https.Agent(options);
https.request(options, function(res) {
res.pipe(process.stdout);
}).end();
И скрипт, который делает файлы сертификатов:
#!/bin/bash
FQDN=$1
# make directories to work from
mkdir -p server/ client/ all/
# Create your very own Root Certificate Authority
openssl genrsa \
-out all/my-private-root-ca.privkey.pem \
2048
# Self-sign your Root Certificate Authority
# Since this is private, the details can be as bogus as you like
openssl req \
-x509 \
-new \
-nodes \
-key all/my-private-root-ca.privkey.pem \
-days 1024 \
-out all/my-private-root-ca.cert.pem \
-subj "/C=US/ST=Utah/L=Provo/O=ACME Signing Authority Inc/CN=example.com"
# Create a Device Certificate for each domain,
# such as example.com, *.example.com, awesome.example.com
# NOTE: You MUST match CN to the domain name or ip address you want to use
openssl genrsa \
-out all/privkey.pem \
2048
# Create a request from your Device, which your Root CA will sign
openssl req -new \
-key all/privkey.pem \
-out all/csr.pem \
-subj "/C=US/ST=Utah/L=Provo/O=ACME Tech Inc/CN=${FQDN}"
# Sign the request from Device with your Root CA
openssl x509 \
-req -in all/csr.pem \
-CA all/my-private-root-ca.cert.pem \
-CAkey all/my-private-root-ca.privkey.pem \
-CAcreateserial \
-out all/cert.pem \
-days 500
# Put things in their proper place
rsync -a all/{privkey,cert}.pem server/
cat all/cert.pem > server/fullchain.pem # we have no intermediates in this case
rsync -a all/my-private-root-ca.cert.pem server/
rsync -a all/my-private-root-ca.cert.pem client/
# create DER format crt for iOS Mobile Safari, etc
openssl x509 -outform der -in all/my-private-root-ca.cert.pem -out client/my-private-root-ca.crt
Например:
bash make-certs.sh 'localhost.greenlock.domains'
Надеюсь, это ставит гвоздь в крышку гроба на один.
И еще несколько пояснений: https://github.com/coolaj86/node-ssl-root-cas/wiki/Painless-Self-Signed-Certificates-in-node.js
Вам нужно создать копию корневой сертификат в формате Der с собой .расширение ЭЛТ:
# create DER format crt for iOS Mobile Safari, etc
openssl x509 -outform der -in all/my-private-root-ca.cert.pem -out client/my-private-root-ca.crt
Затем вы можете просто служить файл с вашего сервера. Когда вы нажмете на ссылку, вы должны быть предложено, если вы хотите установить сертификат.
Пример как это работает вы можете попробовать установить МИТ'сертификации с: https://ca.mit.edu/mitca.crt
Связанных С # Примеры
Ключ генерации выглядит хорошо. Вы должны't нуждаются в ЦС, потому что вы не'т отвергая неподписанных запросов.
Добавить .toString() в конце вашего метода readFileSync так, что вы фактически передав строку, а не объект файла.
Попробуйте добавить
agent: false,
rejectUnauthorized: false
Эта процедура позволяет создать центр сертификации & сертификат :
с wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/ca.cnf
OpenSSL требуе-New -x509-на-9999 дней-конфигурации ка.КНФ -keyout CA и ключ.Пэм-из Ка-верняк.УГР
и
CA-сертификата.Пэм, давай'ы генерировать закрытый ключ для сервера :в OpenSSL genrsa -ключевые.УГР 4096
с wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/server.cnf
OpenSSL требуе -новый -конфигах сервера.КНФ -ключ.Пэм-из КСО.УГР
в openssl x509-на-Треб -указывать сервер.КНФ -дней 999 -свалить на "Pass:пароль" и-в КСО.Пэм-ца-ца-верняк.Пэм-Кейки ка-ключ.Пэм-CAcreateserial из сертификата.УГР
Я нашел эту процедуру здесь, наряду с дополнительной информацией о том, как использовать эти сертификаты.