[node.js] 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);
});