programing

nodejs - 인증서 체인에서 자체 서명된 인증서 오류

stoneblock 2023. 10. 21. 09:54

nodejs - 인증서 체인에서 자체 서명된 인증서 오류

클라이언트 측 https 요청에 문제가 있습니다.

토막글은 다음과 같습니다.

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

var options = {
    hostname: 'someHostName.com',
    port: 443,
    path: '/path',
    method: 'GET',
    key: fs.readFileSync('key.key'),
    cert: fs.readFileSync('certificate.crt')
}

var requestGet = https.request(options, function(res){
    console.log('resObj', res);
}

오류: 인증서 체인의 자체 서명 인증서입니다.

제가 포스트맨을 사용할 때 고객 인증서와 키를 가져와 문제없이 사용할 수 있습니다.사용 가능한 해결책이 있습니까?저는 우체부가 어떻게 자격증을 처리하고 일하는지에 대해서도 좀 알려주고 싶습니다.

옵션 1: 경고 비활성화(dev에 유용)

질문하신 내용을 보니 SSL 통신을 위해 자체 서명된 인증서를 사용하고 계시기 때문에 개발 중이신 것 같습니다.

그렇다면 노드를 실행 중인 곳에 환경 변수로 추가합니다.

export NODE_TLS_REJECT_UNAUTHORIZED='0'
node app.js

또는 노드를 직접 실행합니다.

NODE_TLS_REJECT_UNAUTHORIZED='0' node app.js

신뢰할 수 없는 인증서(신뢰할 수 없는 = 인증 기관에서 확인할 수 없음)를 허용하도록 노드에 지시합니다.

환경 변수를 설정하지 않거나 여러 응용 프로그램에 대해 이 작업을 수행해야 하는 경우 npm은strict-ssl설정한 구성false

npm config set strict-ssl=false

옵션 2: 우체부와 같이 CA 인증서 로드(TLS로 테스트하는 데 유용)

@kDoyle이 언급한 포스터와 같은 CA 인증서가 이미 있는 경우 각 요청에서 구성할 수 있습니다(@nic ferrier 감사합니다).

 let opts = {
    method: 'GET',
    hostname: "localhost",
    port: listener.address().port,
    path: '/',
    ca: fs.readFileSync("cacert.pem")
  };

  https.request(opts, (response) => { }).end();

옵션 3: 신뢰할 수 있는 소스의 적절한 SSL 인증서 사용(생산에 유용)

letsencrypt.org 은 무료이며 설정이 쉽고 키를 자동으로 회전시킬 수 있습니다.https://letsencrypt.org/docs/

다음을 사용하여 이 문제를 해결할 수 있습니다.NODE_TLS_REJECT_UNAUTHORIZED=0JS 파일에 다음 행을 삽입하거나 단말기에 입력합니다.

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0;

이것은 해킹이므로 생산에 사용되지 않도록 주의하시기 바랍니다.

window를 사용하는 경우 명령 프롬프트에서 다음 명령을 실행합니다.

set NODE_TLS_REJECT_UNAUTHORIZED=0 

그 다음에.npm install <my-package>효과가 있을 겁니다

이메일러가 없는 경우

덧셈

tls: {
  rejectUnauthorized: false
}

내 문제를 해결했습니다.

전체적인 코드는 다음과 같습니다.

nodemailer.createTransport({
    host: process.env.MAIL_SERVER,
    secure: false,
    port: 587,
    auth: {
      user: process.env.MAIL_USERNAME,
      pass: process.env.MAIL_PASSWORD
    },
    tls: {
      rejectUnauthorized: false
    }
  }

명령어를 작성할 수 있습니다.npm config set strict-ssl false

코드의 시작에 이 행을 추가하면 됩니다.

process.env.NODE_TLS_REJECT_UNAUTHORIZED='0'

그리고 모든 것이 해결되었지만 어떤 경우에도 권장할 수 없는 문제입니다. 저는 해결책을 조사하고 있습니다.https://letsencrypt.org/

검증을 끄는 것은 상당히 위험한 일입니다.인증서를 확인하는 것이 훨씬 좋습니다.

를 사용하여 Certificate Authority 인증서를 요청으로 끌어 올 수 있습니다.caoptions 개체의 키는 다음과 같습니다.

let opts = {
    method: 'GET',
    hostname: "localhost",
    port: listener.address().port,
    path: '/',
    ca: await fs.promises.readFile("cacert.pem")
  };

https.request(opts, (response) => { }).end();

SSL 테스트를 구성하는 방법을 확인할 수 있도록 전체 데모를 작성했습니다.

여기 있습니다.

노드 응용 프로그램은 기존 CA(Mozilla) 인증서에 CA 인증서를 추가해야 합니다.

서비스를 이용하여 노드를 시작하고 환경변수인 NODE_EXTRA_CA_CERTS를 추가합니다.

[Service]
Restart=always
User=<...>
Group=<...>
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
Environment=NODE_EXTRA_CA_CERTS=/<...>/.ssl/extra_certs.pem
WorkingDirectory=/<...>

ExecStart=/usr/bin/node -r dotenv/config /<.....>/server.js dotenv_config_path=/<....>/.env

이렇게 하면 동일한 애플리케이션을 사용하여 인기 있는 CA 또는 자체 서명된 인증서를 사용하여 서비스를 호출할 수 있으며 SSL 확인을 끌 필요가 없습니다.

리눅스에서 인증서를 쉽게 얻을 수 있는 방법은 다음과 같습니다.cURL과 함께 자체 서명된 인증서를 사용하시겠습니까?

다음을 사용하여 인증서를 만듭니다.

$ echo quit | openssl s_client -showcerts -servername server -connect server:443 > cacert.pem

그런 다음 .pem 파일을 extra_cert.pem으로 복사합니다.펨 파일은 하나만 가질 수 있지만 여러 개의 펨 파일을 하나의 파일에 추가할 수 있습니다.

누군가에게 도움이 됐으면 좋겠어요, 이 작품을 만들기 위해 다른 부분을 찾는 데 시간이 좀 걸렸습니다.

수행:

독립 실행형 목적으로 노드 스크립트를 실행하는 경우 이를 사용하는 것이 좋습니다.

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0;

하지 않음:

모든 기본 요청 프로세스를 변경하는 대신.

npm config set strict-ssl=false

즉, 노드 구성을 변경하지 마십시오. 그렇지 않으면 기본 구성으로 만들어 모든 요청에 적용됩니다.그러니 필요한 곳에 사용하세요.

하루 반나절 동안 이 문제를 추적해 본 결과 IT 부서에서 사용하지 않도록 설정해야 하는 회사 방화벽 설정으로 인해 오류가 발생한 것으로 드러났습니다.인터넷 어디에도 이 문제를 해결할 수 있는 어떤 것도 없었습니다.

process.env['Node_TLS_REJECT_UNANCERTIFED'] = 0; 비록 작동하지는 않지만...

사이프레스를 설치할 수 없음:

SC:\Cypress> export NODE_TLS_REECT_UNANCERICT='0' node app.js export : 'export'라는 용어가 cmdlet, 함수, 스크립트 파일 또는 작동 가능한 프로그램의 이름으로 인식되지 않습니다.이름의 철자를 확인하거나 경로가 포함되어 있는 경우,
경로가 올바른지 확인하고 다시 시도합니다.라인:1 char:1

  • NODE_TLS_REJECT_UNARTHED='0' node app.js 내보내기
  •   + CategoryInfo          : ObjectNotFound: (export:String) [], CommandNotFoundException   
      + FullyQualifiedErrorId : CommandNotFoundException
    
    

언급URL : https://stackoverflow.com/questions/45088006/nodejs-error-self-signed-certificate-in-certificate-chain