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
기본 옵션을 사용하여 요청 인스턴스를 생성할 수도 있습니다.
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_PROJECT
PEM 형식의 자체 서명 인증서를 가지고 있으며 모든 스크립트가 다시 작동합니다.
따라서 프로젝트에 자체 서명된 인증서가 있다면 이 환경이 도움이 될 수 있습니다.
참조: 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
'source' 카테고리의 다른 글
iOS DeviceSupport 디렉토리에서 데이터를 삭제할 수 있습니까? (0) | 2023.05.27 |
---|---|
등록된 IUserTokenProvider가 없습니다. (0) | 2023.05.27 |
VBA에 대한 권장 IDE (0) | 2023.05.27 |
MC의 기능:무시할 수 있는="d"는 WPF로 표시됩니까? (0) | 2023.05.27 |
ARC에서 @autore release 풀이 여전히 필요한 이유는 무엇입니까? (0) | 2023.05.27 |