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
기본 옵션으로 요청 인스턴스를 작성할 수도 있습니다.
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'
...
작동합니다.
'IT' 카테고리의 다른 글
변경된 입력 텍스트 상자 감지 (0) | 2020.03.27 |
---|---|
InsecureRequestWarning 억제 : 파이썬 2.6에서 확인되지 않은 HTTPS 요청이 이루어지고 있음 (0) | 2020.03.27 |
레일 : 콘솔에서 경로 도우미의 출력 확인 (0) | 2020.03.26 |
새 페이지에서 경로를 변경해도 맨 위로 스크롤되지 않습니다 (0) | 2020.03.26 |
WAMP 오류 : 금지됨이 서버에서 / phpmyadmin /에 액세스 할 수있는 권한이 없습니다 (0) | 2020.03.26 |