source

https.request가 포함된 node.js의 잘못된 자체 서명 SSL 인증서를 무시하시겠습니까?

lovecheck 2023. 5. 27. 11:47
반응형

https.request가 포함된 node.js의 잘못된 자체 서명 SSL 인증서를 무시하시겠습니까?

로컬 무선 라우터(Linksys)에 로그인하는 작은 앱을 만들고 있지만 라우터의 자체 서명 SSL 인증서에 문제가 있습니다.

wget 192.168.1.1.1을 실행하여 다음을 얻습니다.

ERROR: cannot verify 192.168.1.1's certificate, issued by `/C=US/ST=California/L=Irvine/O=Cisco-Linksys, LLC/OU=Division/CN=Linksys/emailAddress=support@linksys.com':
Self-signed certificate encountered.
ERROR: certificate common name `Linksys' doesn't match requested host name `192.168.1.1'.
To connect to 192.168.1.1 insecurely, use `--no-check-certificate'.

노드에서 발견되는 오류는 다음과 같습니다.

{ [Error: socket hang up] code: 'ECONNRESET' }

현재 샘플 코드는 다음과 같습니다.

var req = https.request({ 
    host: '192.168.1.1', 
    port: 443,
    path: '/',
    method: 'GET'

}, function(res){

    var body = [];
    res.on('data', function(data){
        body.push(data);
    });

    res.on('end', function(){
        console.log( body.join('') );
    });

});
req.end();

req.on('error', function(err){
    console.log(err);
});

node.js가 "--no-check-certificate"와 동일한 작업을 수행하도록 하려면 어떻게 해야 합니까?

값싸고 자신 없는 대답:

더하다

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

코드로, 호출하기 전에.https.request()

보다 안전한 방법(위의 솔루션은 전체 노드 프로세스를 불안정하게 만듭니다)은 이 질문에서 답합니다.

요청 옵션에서 다음을 포함합니다.

   var req = https.request({ 
      host: '192.168.1.1', 
      port: 443,
      path: '/',
      method: 'GET',
      rejectUnauthorized: false,
      requestCert: true,
      agent: false
    },

당신을 오도하려는 모든 사람들을 믿지 마세요.

요청에 다음을 추가하십시오.

ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})]

인증되지 않은 인증서를 설정하면 사용자가 전혀 보호되지 않으며(ID를 확인하지 않아 MITM에 노출됨), SSL 없이 작업해도 큰 차이가 없습니다.해결책은 다음 스니펫에 표시된 것처럼 예상되는 CA 인증서를 지정하는 것입니다.인증서의 공용 이름이 요청에서 호출한 주소와 동일한지 확인합니다(호스트에서 지정한 대로).

그러면 다음과 같은 이점을 얻을 수 있습니다.

var req = https.request({ 
      host: '192.168.1.1', 
      port: 443,
      path: '/',
      ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})],
      method: 'GET',
      rejectUnauthorized: true,
      requestCert: true,
      agent: false
    },

다음을 이해하려면 여기에서 이 기사(공개: 이 답변의 작성자가 작성한 블로그 게시물)를 읽으십시오.

  • CA 인증서 작동 방식
  • 운영 환경을 시뮬레이션하기 위해 테스트를 위한 CA 인증서를 쉽게 생성하는 방법

다음 환경 변수를 추가합니다.

NODE_TLS_REJECT_UNAUTHORIZED=0

예를 들어export:

export NODE_TLS_REJECT_UNAUTHORIZED=0

(후안라에게 감사하며)

@Armand 응답에 추가:

다음 환경 변수를 추가합니다.

NODE_TLS_REJECT_UNAUTHIZED=0(예: 내보내기 포함):

내보내기 NODE_TLS_REject_UNAUTHIZED=0 (후안라 덕분에)

Windows 사용 시:

set NODE_TLS_REJECT_UNAUTHORIZED=0

덕분에: @weagle08

기본 옵션을 사용하여 요청 인스턴스를 생성할 수도 있습니다.

require('request').defaults({ rejectUnauthorized: false })

유성을 위하여npmRequestOptions로 설정할 수 있는 JS.

HTTP.post(url, {
    npmRequestOptions: {
        rejectUnauthorized: false // TODO remove when deploy
    },
    timeout: 30000, // 30s
    data: xml
}, function(error, result) {
    console.log('error: ' + error);
    console.log('resultXml: ' + result);
});

NODE_TLS_REject_UNAUTHIZED=0 내보내기를 시도합니다.

그래서 우리 회사는 Node.js v12.x로 전환했습니다.사용하고 있었습니다.NODE_TLS_REJECT_UNAUTHORIZED작동을 멈췄습니다.얼마간의 발굴 끝에, 저는 사용하기 시작했습니다.NODE_EXTRA_CA_CERTS=A_FILE_IN_OUR_PROJECTPEM 형식의 자체 서명 인증서를 가지고 있으며 모든 스크립트가 다시 작동합니다.

따라서 프로젝트에 자체 서명된 인증서가 있다면 이 환경이 도움이 될 수 있습니다.

참조: https://nodejs.org/api/cli.html#cli_node_extra_ca_certs_file

로컬 해상도를 할 수도 .hosts에 입니다.etc대부분의 운영 체제에서는 세부 정보가 다릅니다.

192.168.1.1 Linksys 

다음에

var req = https.request({ 
    host: 'Linksys', 
    port: 443,
    path: '/',
    method: 'GET'
...

효과가 있을 것입니다.

@nestjs/axios를 사용한 게시물을 찾고 있는 경우,

인증서가 없는 구문은 다음과 같습니다(비운영 솔루션).

const token = Buffer.from(`${user}:${password}`,'utf8').toString('base64')

const config = {
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Basic ${token}`,
      },
      httpsAgent: new https.Agent({
        rejectUnauthorized: false
      }),
    };

const responseData = await firstValueFrom(
        this.httpService.post(url, data, config).pipe(map((response) => response.data)),
      );

인증서(Production Solution)를 사용하는 구문은 다음과 같습니다.

const token = Buffer.from(`${user}:${password}`,'utf8').toString('base64')

const config = {
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Basic ${token}`,
      },
      httpsAgent: new https.Agent({
        rejectUnauthorized: true,
        ca: fs.readFileSync(path.join(__dirname, './resources/certificateName'))
      }),
    };

const responseData = await firstValueFrom(
        this.httpService.post(url, data, config).pipe(map((response) => response.data)),
      );

요청 작성을 제어할 수 없는 경우

패키지를 사용할 때는 다음에서 올바른 설정을 설정하는 옵션이 없는 경우가 있습니다.request호출, 또한 패키지는 당신에게 주사할 방법을 제공하지 않습니다.request.

하지만 당신은 여전히 불안정한 사람들을 피하고 싶을지도 모릅니다.NODE_TLS_REJECT_UNAUTHORIZED=0지정된 대상에 대한 안전하지 않은 연결만 선택합니다.

다음과 같이 문제를 해결했습니다.

// check if host and port fit your application
function isSelf(host, port) {
  return host === myHost && port === myPort;
}

// get the built in tls module and overwrite the default connect behavior 
const tls = require("tls");
const _connect = tls.connect;
function wrappedConnect(options, secureConnectListener) {
  if (isSelf(options.host, options.port)) {
    options.rejectUnauthorized = false;
  }
  return _connect(options, secureConnectListener);
}
tls.connect = wrappedConnect;

언급URL : https://stackoverflow.com/questions/10888610/ignore-invalid-self-signed-ssl-certificate-in-node-js-with-https-request

반응형