[javascript] 리프 서명을 확인할 수 없습니다

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의 솔루션은 정확하고 그것을 사용하는 모든 검사를 비활성화처럼 보안을 손상하지 않는 rejectUnauthorizedNODE_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. 그런 다음이 파일을 열고 첫 번째 인증서 뒤에 줄 바꿈을 추가했습니다. 더 읽을 수 있습니다

https://www.namecheap.com/support/knowledgebase/article.aspx/10050/33/installing-an-ssl-certificate-on-heroku-ssl


답변

누군가를 도울 수 있도록 이것을 여기에 두십시오. 제 경우는 달랐으며 약간의 이상한 혼합이었습니다. 수퍼 에이전트 를 통해 액세스 한 요청에서 이것을 얻었 습니다. 문제는 인증서와 관련이 없었으며 (올바로 설정되어 있음) 비동기 모듈의 워터 폴 콜백을 통해 수퍼 에이전트 결과를 전달한다는 사실과 관련이 있습니다 . 수정 : 전체 결과를 전달하는 대신 result.body폭포의 콜백을 통과 하십시오.