로컬 무선 라우터 (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);
});