[node.js] localhost에 대한 신뢰할 수있는 자체 서명 된 SSL 인증서 생성 (Express / Node와 함께 사용)

localhost와 함께 사용하기 위해 자체 서명 된 인증서를 만드는 데 대한 다양한 지침을 따르려고 시도하면서 대부분의 지침은 IIS 용으로 보이지만 Nodejs / Express를 사용하려고합니다. 인증서가 설치되는 동안 신뢰할 수 없기 때문에 제대로 작동하지 않습니다. 실패한 시도는 다음과 같습니다.

누군가이 작업을 수행 할 수있는 워크 플로를 제공 할 수 있습니까? 인증서를 설치할있지만 크롬 (v32) 또는 IE (v10)에서 인증서를 신뢰할 수 없습니다.

편집 : 문제가 신뢰할 수있는 cert-root가 아니라는 의견에 제안되었습니다. IE를 통해 인증서를 설치했지만 여전히 신뢰할 수 없습니다.



답변

위의 답변은 부분적이었습니다. 나는이 일을하는 데 너무 많은 시간을 보냈다. 그것은 미쳤다. 내 미래에 대한 참고 사항은 다음과 같습니다.

저는 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. 서버를 시작하고 https : // localhost : 3000으로node server.js 이동합니다 . .

이 시점에서 서버 설정이 있습니다. 그러나 브라우저에 경고 메시지가 표시되어야합니다.

자체 서명 된 인증서를 chrome / windows 인증서 저장소에 CA에서 신뢰할 수있는 인증 기관으로 등록해야합니다.(크롬은 이것을 Windows에도 저장합니다.)

6 단계. Chrome에서 Dev Tools를 열고 보안 패널로 이동 한 다음 인증서보기를 클릭합니다.
여기에 이미지 설명 입력

단계 7. 세부 정보 패널로 이동하여 파일 복사를 클릭 한 다음 인증서 내보내기 마법사가 나타나면 아래와 같이 다음을 클릭합니다.

세부 정보로 이동-파일 복사-다음 내보내기 마법사

8 단계. DER 인코딩을 그대로두고 다음을 클릭 한 다음을 선택 Browse하고 데스크톱과 같이 액세스하기 쉬운 폴더에 넣고 인증서 이름을 지정합니다.localhost.cer, then click Save and then Finish. . 데스크톱에서 인증서를 볼 수 있어야합니다.

단계 9.chrome://settings/ URL 상자에 삽입하여 엽니 다 . 아래에서을 클릭 Advanced / Advanced Options한 다음 아래로 스크롤하여을 찾습니다 Manage Certificates.

인증서 관리 선택

10 단계. 신뢰할 수있는 루트 인증 기관 패널로 이동하고 가져 오기를 클릭합니다.

신뢰할 수있는 루트 인증 기관 패널로 이동하여 가져 오기를 클릭하십시오.

localhost.cer8 단계에서 방금 내보내기를 마친 인증서 를 가져옵니다 .

단계 11. 찾아보기를 클릭하고을 찾은 localhost.cer다음 기본값을 그대로두고 다음을 여러 번 클릭합니다.이 경고가 나타날 때까지 예를 클릭합니다.

보안 예외 확인

12 단계. 모든 것을 닫고 Chrome을 다시 시작합니다. 그런 다음 https://localhost:3000가면 다음이 표시됩니다.
녹색을 사랑해야 해


답변

최단 방법.
MacOS에서 테스트되었지만 다른 OS에서도 유사하게 작동 할 수 있습니다.

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:3000Chrome에서 열면 안전하지 않다는 것을 알 수 있습니다. 아직!
  • 개발자 도구> 보안> 인증서보기 : 이미지를 바탕 화면으로 끌어서 두 번 클릭합니다.
  • ‘추가’를 클릭하십시오.
  • 키 체인 접근에서 찾아 두 번 클릭하십시오.
  • ‘신뢰’를 확장하고 ‘이 인증서를 사용할 때’를 ‘항상 신뢰’로 변경합니다.
  • 인증하라는 메시지가 표시 될 수 있습니다.
  • 서버를 다시 시작하십시오.
  • 브라우저를 새로 고칩니다.
  • 즐겨! 🙂

답변

openSSL을 사용하여 인증서를 생성 할 수 있습니다. 이것 좀보세요 .

노드 JS 익스프레스 서버에 HTTPS를 추가하려면 .key 및 .crt 파일이 필요합니다. 생성 한 후에는이 코드를 사용하여 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에는 자체 서명 된 인증서가 있습니다.

그러나 모든 브라우저에서 연결을 신뢰할 수 없다는 오류가 발생했습니다. 계속 하시겠습니까? 계속을 클릭하면 정상적으로 작동합니다.

누군가가 자체 서명 된 인증서로이 오류를 우회 한 적이 있다면 계몽하십시오.


답변

localhost에 대한 SSL 인증서를 생성하는 방법 : 링크

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) 이것을 % 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에 권한이 필요합니다”UAC 창에서 계속을 클릭합니다.

  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. su권한으로 / etc / hosts 열기
  2. 더하다 127.0.0.1 localdev.YOURSITE.net
  3. 저장해

개발할 때 localhost 대신 localdev.YOURSITE.net을 사용하므로 IDE에서 실행 / 디버그 구성을 사용하는 경우 업데이트해야합니다.

cookiem을 만들 때 “.YOURSITE.net”을 cookiedomain (시작 부분에 점 포함)으로 사용하면 모든 하위 도메인에서 작동합니다.

2) 해당 localdev.url을 사용하여 인증서를 만듭니다.

팁 : Windows에서 인증서를 생성하는 데 문제가있는 경우 VirtualBox 또는 Vmware 시스템을 대신 사용하십시오.

3)
http://www.charlesproxy.com/documentation/using-charles/ssl-certificates/에 설명 된대로 인증서를 가져옵니다 .


답변

@FiloSottile 의 Mkcert는이 프로세스를 매우 간단하게 만듭니다.

  1. mkcert 설치 , macOS / Windows / Linux에 대한 지침이 있습니다.
  2. mkcert -install 로컬 CA를 만들려면
  3. mkcert localhost 127.0.0.1 ::1 현재 디렉토리에서 localhost에 대한 신뢰할 수있는 인증서를 만들려면
  4. 노드 (시스템 루트 저장소를 사용하지 않음)를 사용하고 있으므로 환경 변수에 CA를 명시 적으로 지정 해야 합니다. 예 :export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"
  5. 마지막으로 다양한 다른 답변 (예 : 아래)에 설명 된 설정을 사용하여 익스프레스 서버를 실행합니다.
  6. 팔. localhost의 녹색 수영.

기본 노드 설정 :

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


답변

OSX / Chrome을 사용하는 경우 http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and에 설명 된대로 자체 서명 된 SSL 인증서를 시스템 키 체인에 추가 할 수 있습니다 . -자체 서명 SSL 인증서

수동 프로세스이지만 마침내 작동하게되었습니다. CN (일반 이름)이 “localhost”(포트 없음)로 설정되어 있는지 확인하고 인증서가 추가 된 후 인증서의 모든 신뢰 옵션이 “항상 신뢰”로 설정되어 있는지 확인하십시오. 또한 “로그인”키 체인이 아닌 “시스템”키 체인에 추가해야합니다.