Node.js에서 HTTPS 서버를 만드는 방법은 무엇입니까?


360

SSL 키와 인증서가 주어지면 어떻게 HTTPS 서비스를 생성합니까?


2
express.js 대신 restify.js 를 사용 했지만 아이디어는 동일합니다. 다음은 HTTP와 HTTPS를 모두 허용하는 node.js 서버를 설정하는 방법입니다 qugstart.com/blog/node-js/…
awaage

2
Express가없고 최신 버전의 노드가있는 경우-여기를보십시오 : stackoverflow.com/a/21809393/388026
pkyeck

1
이 질문은 어떻게 되었습니까? 대답은 원래 express.js에 관한 것임을 의미합니다.
doug65536

유효한 자체 서명 SSL 인증서를 작성하고 몇 단계
Lloyd

3
조금 늦었지만 누군가 완전한 nodejs https 튜토리얼이 필요하면 여기에서 찾을 수 있습니다 : programmerblog.net/nodejs-https-server
Jason W

답변:


150

다음 예제를 찾았습니다.

https://web.archive.org/web/20120203022122/http://www.silassewell.com/blog/2010/06/03/node-js-https-ssl-server-example/

이것은 노드 v0.1.94-v0.3.1에서 작동합니다. server.setSecure()최신 버전의 노드에서 제거됩니다.

해당 소스에서 직접 :

const crypto = require('crypto'),
  fs = require("fs"),
  http = require("http");

var privateKey = fs.readFileSync('privatekey.pem').toString();
var certificate = fs.readFileSync('certificate.pem').toString();

var credentials = crypto.createCredentials({key: privateKey, cert: certificate});

var handler = function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
};

var server = http.createServer();
server.setSecure(credentials);
server.addListener("request", handler);
server.listen(8000);

3
setSecure더 이상 사용되지 않습니다. 대신 이것을 확인하십시오 stackoverflow.com/questions/5136353/node-js-https-secure-error
Larry Battle

7
@Jacob Marble의 공식 빠른 답변을 아래에서 참조하십시오.
clayzermk1

21
Node.JS 0.4에서 HTTPS 구현이 다시 완료되었으므로이 샘플은 더 이상 작동하지 않습니다. nodejs.org에서 해당 문서를 참조하십시오. stackoverflow.com/questions/5136353/…
scottyab

10
이 답변은 매우 오래되어 더 이상 작동하지 않습니다. 아래의 pkyeck의 답변을 참조하거나 다음으로 이동하십시오 : nodejs.org/api/https.html
Jay Sheth

2
또한 링크가 끊어졌습니다
TlonXP

484

익스프레스 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);

49
니스, 그냥 나 자신을 게시하려고했다. 감사합니다. 또한 이 기사 는 자체 서명 된 인증서 생성에 도움 되는 것으로 나타났습니다 .
clayzermk1

1
암호 오류를 방지하려면를 options먼저 입력하십시오 https.createServer.
wberry

1
거의 동일한 https 서버 포트 8888을 설정하고 경로를 변경하는 방법을 잘 모르겠습니다. curl curl을 실행하면 --secure localhost : 8888 curl : (35) localhost : 8888과 관련하여 알 수없는 SSL 프로토콜 오류가 발생하며 오류를 해결하는 방법은 무엇입니까? 브라우저에 localhost : 8888을 입력하면 중단되고 https : / localhost : 8888에서 SSL 오류가 발생합니다
reza

2
당신과 함께 HTTP에서 HTTPS로 사용자를 리디렉션 할 수 있습니다 @Costa 명시 힘-SSL 또는 손으로 쓴 미들웨어 - 그것은 매우 간단합니다
floatdrop

1
@NathanMcKaskle 비밀번호를 비활성화 할 수 있습니다.이 안내서를 확인하십시오. 그러나 macOS를 사용하는 경우 생성 된 키 길이가 2048 이상인지 확인하십시오.openssl genrsa -out key.pem 2048
sakisk

87

"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);

매력처럼 일했다. 이 정보는 최근 https를 통해 강제 실행 된 PHP 앱 위에서 node.js 도구 (PDFJS)를 실행할 때 매우 유용했습니다. iframe은 https가 아닌 다른 포트에 node.js 앱을로드하는 것에 매우 만족하지 못했습니다.
lewsid

2
좋아 보이지만 필요한 파일을 어떻게 생성 할 수 *.pem있습니까 ( )? 이 페이지를 따라 시도했지만 localhost:8000브라우저에서 열 때 데이터가 수신되지 않습니다 (로드 중입니다 ...).
Ionică Bizău

7
@ IonicăBizău, 키를 생성하려면을 설치 openssl한 다음 cmd 프롬프트에openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
mido를

2
@ IonicăBizău로 직접 가야합니다 https://localhost:8080. HTTP는 HTTPS가 아닙니다.
Florian Wendelborn

폴더로 https-server를 만들 수 있습니까? 따라서 파일을 넣고 localhost : 81 / main.js
FrenkyB

47

위의 답변은 좋지만 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});

질문은 Express.js를 사용하여 수행하는 방법 이었기 때문에 기술적으로 더 정답입니다.
Kato

12
이것은 "응용 프로그램이 더 이상 http.Server에서 상속하지"이후 사용되지 않는 것 같습니다
Merlyn 모건 - 그레이엄에게

2
왜 설정 module.exports합니까? 그럴 필요가 없습니다
Matej

1
@matejkramny, 테스트하기 쉽기 때문일 것입니다.
Justin

21

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);

18

최신 정보

Greenlock.js 를 통해 Let 's Encrypt 사용

원본 게시물

나는이 답변의 아무도가 추가 것을 보여주지주의 중간 루트 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);
});

이것은 직접 연결이나 표현을 통해 시도 하지 않지만 기본 https모듈에서 처리하고 연결 / 표현 응용 프로그램을 제공하는 데 사용 하면 더 쉬운 방법 중 하나입니다 .

또한 server.on('request', app)서버를 만들 때 앱을 전달하는 대신 사용 server하면 연결 / 익스프레스 앱을 만드는 이니셜 라이저 함수로 인스턴스를 전달할 수 있습니다 ( 동일한 서버에서 SSL을 통해 웹 소켓 을 수행하려는 경우). 예).


이것은 좋은 설명이지만 업데이트 섹션에 제공된 링크가 끊어졌습니다 (500 오류가 발생 함)
Chucky

8

모두 청취 할 응용 프로그램을 사용하려면 httphttps포트 80443각각 다음을 수행

특급 앱을 만듭니다.

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

에서 반환 한 앱 express()은 JavaScript 함수입니다. 요청을 처리하기위한 콜백으로 Node의 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);

자세한 내용은 문서를 참조하십시오


0

이를 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테스트를 작성해야하는 경우 파일을 작성하기 위해 실행 )


-3
  1. https://indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip 에서 openssl 설정 용 rar 파일을 다운로드하십시오.
  2. c 드라이브에 폴더를 복사하십시오.
  3. openssl.cnf 파일을 작성하고 다음 위치에서 해당 컨텐츠를 다운로드 하십시오 .
  4. propmt 명령을 열고 openssl.cnf 경로 C : \ set OPENSSL_CONF = d : /openssl.cnf를 설정하십시오.
  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. 그런 다음 Openssl> rsa -in server.enc.key -out server.key를 실행하십시오.
  9. 이 OpenSSL> x509 -req -days 365 -in server.csr -signkey server.key -out server.crt를 실행 한 다음 스택 오버플로에있는 이전 코드를 사용하십시오.

이것은 OT 입니다. OP의 질문은 분명하다. 인증서가 이미 제공되었습니다.
마틴 슈나이더

-6
var path = require('path');
var express = require('express');

var app = express();

var staticPath = path.join(__dirname, '/public');
app.use(express.static(staticPath));

app.listen(8070, function() {
  console.log('Server started at port 8070');
});

3
코드와 함께 추가 설명을 제공해야합니다.
Benoît Latinier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.