source

Node.js에서 HTTPS 서버를 작성하는 방법

itover 2023. 2. 4. 08:23
반응형

Node.js에서 HTTPS 서버를 작성하는 방법

SSL 키와 증명서를 지정하면 HTTPS 서비스는 어떻게 생성됩니까?

Express API 문서에서는 를 매우 명확하게 설명하고 있습니다.

또한답변에서는 자기 서명 증명서를 작성하기 위한 단계를 제공합니다.

Node.js HTTPS 문서의 코멘트 및 일부를 추가했습니다.

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

// This line is from the Node.js HTTPS documentation.
var options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.cert')
};

// Create a service (the app object is just a callback).
var app = express();

// Create an HTTP service.
http.createServer(app).listen(80);
// Create an HTTPS service identical to the HTTP service.
https.createServer(options, app).listen(443);

현재 LTS(이 편집 시 v16)까지 노드 0.3.4 이상의 경우 https://nodejs.org/api/https.html#httpscreateserveroptions-requestlistener에는 필요한 모든 샘플코드가 준비되어 있습니다.

const https = require(`https`);
const fs = require(`fs`);

const options = {
  key: fs.readFileSync(`test/fixtures/keys/agent2-key.pem`),
  cert: fs.readFileSync(`test/fixtures/keys/agent2-cert.pem`)
};

https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end(`hello world\n`);
}).listen(8000);

Let's Encrypt's Certbot 도구를 사용하여 인증서를 암호화하려면 개인 키가 호출됩니다.privkey.pem는 '증명서'라고.fullchain.pem:

const certDir = `/etc/letsencrypt/live`;
const domain = `YourDomainName`;
const options = {
  key: fs.readFileSync(`${certDir}/${domain}/privkey.pem`),
  cert: fs.readFileSync(`${certDir}/${domain}/fullchain.pem`)
};

"node https"를 검색하던 중 이 질문을 발견했지만 허용된 답변의 예는 매우 오래된 것입니다. 노드의 현재 버전(v0.10)의 문서에서 가져온 것입니다.이 예는 다음과 같습니다.

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

var options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};

https.createServer(options, function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}).listen(8000);

위의 답변은 양호하지만 Express와 노드를 사용하면 정상적으로 동작합니다.

express가 앱을 만들어 주므로 생략하겠습니다.

var express = require('express')
  , fs = require('fs')
  , routes = require('./routes');

var privateKey = fs.readFileSync('cert/key.pem').toString();
var certificate = fs.readFileSync('cert/certificate.pem').toString();  

// To enable HTTPS
var app = module.exports = express.createServer({key: privateKey, cert: certificate});

Node.js의 HTTPS 서버의 최소 셋업은 다음과 같습니다.

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

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

https.createServer(httpsOptions, app).listen(4433);

http 요구도 지원하려면 다음 작은 변경만 하면 됩니다.

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

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

http.createServer(app).listen(8888);
https.createServer(httpsOptions, app).listen(4433);

갱신하다

Greenlock.js를 통한 암호화 사용

오리지널 투고

이들 답변 중 어느 것도 체인에 중간 루트 CA를 추가하는 것을 나타내고 있지 않습니다.이것을 확인하기 위해서 사용하는 제로 설정의 예를 다음에 나타냅니다.

단편:

var options = {
  // this is the private key only
  key: fs.readFileSync(path.join('certs', 'my-server.key.pem'))

// this must be the fullchain (cert + intermediates)
, cert: fs.readFileSync(path.join('certs', 'my-server.crt.pem'))

// this stuff is generally only for peer certificates
//, ca: [ fs.readFileSync(path.join('certs', 'my-root-ca.crt.pem'))]
//, requestCert: false
};

var server = https.createServer(options);
var app = require('./my-express-or-connect-app').create(server);
server.on('request', app);
server.listen(443, function () {
  console.log("Listening on " + server.address().address + ":" + server.address().port);
});

var insecureServer = http.createServer();
server.listen(80, function () {
  console.log("Listening on " + server.address().address + ":" + server.address().port);
});

이것은 접속이나 익스프레스를 통해 직접 시도하지 않고 원어민에게 전달하면 종종 더 쉬운 방법 중 하나입니다.httpsconnect / express app을 사용합니다.

또, 「」를 사용하는 는, 「」를 합니다.server.on('request', app) 시 하는 것이 앱을 할 수 있는 .server연결 / 익스프레스 앱을 만드는 일부 이니셜라이저 함수에 대한 인스턴스(예: 동일한 서버에서 SSL을 통해 웹소켓을 수행하는 경우)

앱이 둘 다 수신할 수 있도록 하려면http그리고.https포트상에서80그리고.443각각 다음 작업을 수행합니다.

익스프레스 앱 만들기:

var express = require('express');
var app = express();

반환된 앱express()는 JavaScript 함수입니다.요청을 처리하기 위한 콜백으로 노드의 HTTP 서버에 전달될 수 있습니다.이를 통해 동일한 코드 베이스를 사용하여 앱의 HTTP 버전과 HTTPS 버전을 모두 쉽게 제공할 수 있습니다.

다음과 같이 할 수 있습니다.

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

var options = {
  key: fs.readFileSync('/path/to/key.pem'),
  cert: fs.readFileSync('/path/to/cert.pem')
};

http.createServer(app).listen(80);
https.createServer(options, app).listen(443);

상세한 것에 대하여는, 문서를 참조해 주세요.

Fastify 프레임워크에서도 이 파일을 아카이브할 수 있습니다.

const { readFileSync } = require('fs')
const Fastify = require('fastify')

const fastify = Fastify({
  https: {
    key: readFileSync('./test/asset/server.key'),
    cert: readFileSync('./test/asset/server.cert')
  },
  logger: { level: 'debug' }
})

fastify.listen(8080)

(및 실행)openssl req -nodes -new -x509 -keyout server.key -out server.cert테스트를 작성해야 할 경우 파일을 만듭니다.)

로컬 개발에만 로컬로 필요한 경우 이 태스크에 맞는 유틸리티를 만들었습니다.https://github.com/pie6k/easy-https

import { createHttpsDevServer } from 'easy-https';

async function start() {
  const server = await createHttpsDevServer(
    async (req, res) => {
      res.statusCode = 200;
      res.write('ok');
      res.end();
    },
    {
      domain: 'my-app.dev',
      port: 3000,
      subdomains: ['test'], // will add support for test.my-app.dev
      openBrowser: true,
    },
  );
}

start();

그 내용:

  • 적절한 도메인 엔트리를 /etc/hosts에 자동으로 추가합니다.
  • 최초 실행/도메인 변경 시 필요한 경우에만 admin 패스워드를 입력
  • 지정된 도메인에 대한 https 인증서를 준비합니다.
  • 로컬 시스템에서 해당 인증서를 신뢰합니다.
  • 로컬 서버의 https URL을 가리키며 브라우저를 엽니다.
  1. https://indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip 에서 openssl 셋업용 rar 파일을 다운로드합니다.
  2. C 드라이브에 폴더를 복사하기만 하면 됩니다.
  3. openssl.cnf 파일을 생성하여 에서 콘텐츠를 다운로드합니다.http://web.mit.edu/crypto/openssl.cnf openssl.cnf는 임의의 위치에 배치할 수 있지만 명령 프롬프트를 입력하면 경로가 정확해야 합니다.
  4. 명령어 propmt를 열고 openssl.cnf 경로 C:\set OPENSL_CONF=d:/openssl.cnf 5를 설정합니다.cmd:C:\opensl-0.9.8r-i386-win32-rev2>opensl에서 실행합니다.실행
  5. 그런 다음 OpenSSL > genrsa -des3 -out server.enc.key 1024를 실행합니다.
  6. 패스 프레이즈를 입력하도록 요구됩니다.증명서 비밀번호로 4~11글자를 입력합니다.
  7. 다음으로 이 Openssl>req - new - key server . enc . key - out server . csr 를 실행합니다.
  8. 그런 다음 국가 코드 상태 이름 등의 세부 정보를 자유롭게 입력하도록 요청합니다. 10. 그런 다음 Opensl > rsa -in server.enc.key -out server를 실행합니다.열쇠
  9. 이 OpenSSL > x509 - req - days 365 - in server . csr - signkey server . key - out server . crt 를 실행하고 스택오버플로우상의 이전 코드를 사용합니다.감사합니다.

언급URL : https://stackoverflow.com/questions/5998694/how-to-create-an-https-server-in-node-js

반응형