IT

https.request를 사용하여 node.js에서 잘못된 자체 서명 SSL 인증서를 무시합니까?

lottoking 2020. 3. 27. 08:09
반응형

https.request를 사용하여 node.js에서 잘못된 자체 서명 SSL 인증서를 무시합니까?


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

wget 192.168.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_UNAUTHORIZED = 0 예 : 내보내기시 :

수출 NODE_TLS_REJECT_UNAUTHORIZED = 0 (후안 라 덕분에)

Windows 사용의 경우 :

set NODE_TLS_REJECT_UNAUTHORIZED=0

덕분에 : @ weagle08


기본 옵션으로 요청 인스턴스를 작성할 수도 있습니다.

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

meteorJS의 경우 npmRequestOptions로 설정할 수 있습니다.

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

또는 다음과 같이 로컬 이름 확인 ( 대부분의 운영 체제 hosts의 디렉토리 etc있는 파일 , 세부 사항이 다름) 을 추가 할 수 있습니다 .

192.168.1.1 Linksys 

그리고 다음

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

작동합니다.

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

반응형