node.js request.js를 사용하여 API에 도달하고 있습니다. 이 오류가 발생합니다
[오류 : UNABLE_TO_VERIFY_LEAF_SIGNATURE]
모든 자격 증명이 정확하고 유효하며 서버는 괜찮습니다. 우편 배달부와 같은 요청을했습니다.
request({
"url": domain+"/api/orders/originator/"+id,
"method": "GET",
"headers":{
"X-API-VERSION": 1,
"X-API-KEY": key
},
}, function(err, response, body){
console.log(err);
console.log(response);
console.log(body);
});
이 코드는 실행 가능한 스크립트 ex에서 실행 중입니다. node ./run_file.js
왜 그런가요? 서버에서 실행해야합니까?
답변
참고 : 다음은 위험하므로 클라이언트와 서버간에 API 컨텐츠를 가로 채서 수정할 수 있습니다.
이것은 또한 일했다
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
답변
응용 프로그램에는 문제가 아니지만 중개 CA가 서명 한 인증서에 문제가 있습니다. 해당 사실을 수락하고 계속 진행하려면 다음을 추가하여 옵션을 요청하십시오.
rejectUnauthorized: false
전체 요청 :
request({
"rejectUnauthorized": false,
"url": domain+"/api/orders/originator/"+id,
"method": "GET",
"headers":{
"X-API-VERSION": 1,
"X-API-KEY": key
},
}, function(err, response, body){
console.log(err);
console.log(response);
console.log(body);
});
답변
안전한 솔루션
보안을 끄는 대신 필요한 인증서를 체인에 추가 할 수 있습니다. 먼저 npm에서 ssl-root-cas 패키지를 설치하십시오 .
npm install ssl-root-cas
이 패키지에는 브라우저가 신뢰하지만 노드가 신뢰하지 않는 많은 중간 인증서가 포함되어 있습니다.
var sslRootCAs = require('ssl-root-cas/latest')
sslRootCAs.inject()
누락 된 인증서를 추가합니다. 자세한 내용은 여기를 참조하십시오.
https://git.coolaj86.com/coolaj86/ssl-root-cas.js
또한 아래의 다음 답변을 참조하십시오
답변
CoolAJ86의 솔루션은 정확하고 그것을 사용하는 모든 검사를 비활성화처럼 보안을 손상하지 않는 rejectUnauthorized
나 NODE_TLS_REJECT_UNAUTHORIZED
. 여전히 추가 CA 인증서를 명시 적으로 주입해야 할 수도 있습니다.
먼저 ssl-root-cas 모듈에 포함 된 루트 CA를 시도했습니다 .
require('ssl-root-cas/latest')
.inject();
나는 여전히 UNABLE_TO_VERIFY_LEAF_SIGNATURE
오류로 끝났습니다 . 그런 다음 COMODO SSL Analyzer 가 연결 한 웹 사이트의 인증서를 누가 발급했는지 확인하고 해당 기관의 인증서를 다운로드 한 후 해당 인증서 만 추가하려고했습니다.
require('ssl-root-cas/latest')
.addFile(__dirname + '/comodohigh-assurancesecureserverca.crt');
다른 오류가 발생했습니다 CERT_UNTRUSTED
. 마지막으로 추가 루트 CA를 주입하고 “my”(명백히 중개자) CA를 포함 시켰습니다.
require('ssl-root-cas/latest')
.inject()
.addFile(__dirname + '/comodohigh-assurancesecureserverca.crt');
답변
들어 만들기 앱 반응 (이 오류도 발생하고이 질문 # 1 구글 결과입니다), 당신은 아마 사용 HTTPS=true npm start
하고는 proxy
(에서 package.json
) 개발에 일부 HTTPS API 자체 서명하는 자체 때로 이동한다.
이 경우 proxy
다음과 같이 변경 하십시오.
"proxy": {
"/api": {
"target": "https://localhost:5001",
"secure": false
}
}
secure
WebPack 프록시가 인증서 체인을 검사할지 여부를 결정하고 API 자체 서명 인증서가 확인되지 않도록하여 데이터를 얻을 수 있도록 비활성화합니다.
답변
매우 할 유혹 할 수있다 rejectUnauthorized: false
또는 process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
그러나 그것을하지 않는다! 그것은 중간 공격에서 사람에게 노출됩니다.
다른 답변은이 문제가 “중개 CA가 서명 한”인증서라는 사실에 있습니다. 이것에 대한 쉬운 해결책이 있습니다.이 방법은 ssl-root-cas
추가 CA를 노드에 주입하거나 주입하는 것과 같은 타사 라이브러리가 필요하지 않습니다 .
노드의 대부분의 https 클라이언트는 요청 당 CA를 지정할 수있는 옵션을 지원 UNABLE_TO_VERIFY_LEAF_SIGNATURE
합니다. 다음은 노드의 내장 https
모듈을 사용하는 간단한 예 입니다.
import https from 'https';
const options = {
host: '<your host>',
defaultPort: 443,
path: '<your path>',
// assuming the bundle file is co-located with this file
ca: readFileSync(__dirname + '/<your bundle file>.ca-bundle'),
headers: {
'content-type': 'application/json',
}
};
https.get(options, res => {
// do whatever you need to do
})
그러나 호스팅 서버에서 SSL 설정을 구성 할 수있는 경우 가장 좋은 방법은 중간 인증서를 호스팅 공급자에게 추가하는 것입니다. 이렇게하면 클라이언트 요청자가 서버 자체에 포함되어 있으므로 CA를 지정할 필요가 없습니다. 나는 개인적으로 namecheap + heroku를 사용합니다. 나를위한 트릭은 .crt 파일 하나를 만드는 것이 었습니다 cat yourcertificate.crt bundle.ca-bundle > server.crt
. 그런 다음이 파일을 열고 첫 번째 인증서 뒤에 줄 바꿈을 추가했습니다. 더 읽을 수 있습니다