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


142

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가 노드 프로그램에 의해 전달되는 사용자 에이전트를 인식하지 못하는 것일 수 있습니까?
— 헥터 코레아


@HectorCorrea 우체부에서 API를 완벽하게 읽을 수있었습니다. 노드는 왜 그것을 할 수 없습니까? 나는 사용자 에이전트를 변경하려고했지만 운이 없다.
— ThomasReggi

답변:


157

참고 : 다음은 위험하므로 클라이언트와 서버간에 API 컨텐츠를 가로 채서 수정할 수 있습니다.

이것은 또한 일했다

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';


22
이 문제를 수정했으며 답변 해 주셔서 감사합니다. 그러나 보안에 적극적으로 유해합니다. 아래 @ CoolAJ86의 답변에 따라 누락 된 CA를 추가해야합니다.
— mikemaccana 2016 년

4
나는 NodeJS라는 플러그인이 사용하고 있습니다 nodemailer와 nodemailer-smtp-transport같은 일반 명령했다. 이것을 createTransport객체 에 추가해야 합니다.tls:{rejectUnauthorized: false}
— LukeP

3
@LukeP는 nodemailer와 마찬가지로 안전하지 않습니다. 이름에서 단서가있다 : 뭔가의 경우 유엔이 권한을 사용하면 일반적으로 정의에 의해, 그것을 거부합니다. 필요한 것은 다른 답변에서 이미 언급했듯이 CA 인증서를 올바르게 설정하여 올바르게 인증하는 방법을 찾는 것입니다.
— Bruno

@Bruno 동의합니다. 인증서를 사용하여 올바른 방법으로 설정해야합니다. 데모에 대한 빠른 테스트를 설정하고 싶기 때문에 게시 한 코드가 빠른 수정입니다. 나는 내 의견에서 머리말을 써야했다.
— LukeP

1
@mikemaccana 요청이 동일한 서버에 있고 유일한 소유자 인 경우 보안 문제가 없습니다.
— Binar Web

89

응용 프로그램에는 문제가 아니지만 중개 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);
});

나는 지금 직장 에서이 문제가 있습니다. SSL이 잘못 구성되어 있음을 알리는 IT 티켓을 제출했습니다. 이 문제를 해결하기 위해 더 많은 정보를 제공 할 수 있습니까?
— blakev

CoolAJ86과 hectorcorrea가 언급했듯이 인증서는 유효하지만 중개 CA가 서명 한 것입니다.
— mikemaccana 2016 년

80

안전한 솔루션

보안을 끄는 대신 필요한 인증서를 체인에 추가 할 수 있습니다. 먼저 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

또한 아래의 다음 답변을 참조하십시오


2
Http 클라이언트가 Windows 신뢰할 수있는 루트 인증 기관 인증서 저장소를 사용하지 않습니까?
— Richard Collette

1
node는 바이너리에 번들로 제공된 mozilla 인증서를 사용하며 자체 ca배열 을 제공 할 때마다이를 대체합니다 . http 모듈이 OS 체인을 찾는 지 모르겠습니다. 그러나 OS X의 curl은 OS 체인 만 사용하고 수동으로 지정한 인증서는 허용하지 않는 것 같습니다.
— coolaj86

각 프로세스마다 실행해야합니까, 아니면 한 번만 실행하고 인증서를 전체적으로 업데이트 할 수 있습니까?
— Joshua Snider 2016 년

인증서는 잠재적으로 다음 두 곳에 저장됩니다. (1) node.js 바이너리에 내장 됨 (2) 운영 체제 키 저장소. 인증서가 만료 된 경우 실행 코드에 포함해야합니다. 노드 바이너리 나 운영 체제는 변경하지 않고 프로젝트 폴더 만 변경하십시오.
— coolaj86

1
@Sunkas 오류 메시지의 내용과 정확히 같습니다. 나는 그것을 더 간단하게 설명하는 방법을 모른다. 읽기 전용 파일이며 편집 할 수 없습니다.
— coolaj86

45

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
COMODO High-Assurance Secure Server CA에서 발급 한 인증서로 웹 사이트에 연결하고있었습니다. 다운로드 페이지 에서 인증서를 다운로드했습니다 .
— Ferdinand Prantl

2
감사합니다! 내 문제에 대해서는이 오류를 극복하기 위해 전체 인증서 체인을 추가해야했습니다. 다른 참조를 위해이 게시물은 Firefox를 통해 필요한 pem 파일을 쉽게 내보내는 방법을 보여줍니다. superuser.com/a/97203
— mfink

도움을 주셔서 감사합니다. 필자의 경우 결국 노드가 아닌 SSL 서버의 구성이 잘못되었습니다. 모든 중간 인증서가 서버에 설치되지 않았습니다.
— Scott Jungwirth

인증서를 .cer실행 으로 가져 오면 이 openssl x509 -inform DER -in YOUR_CERTIFICATE.cer -out YOUR_CERTIFICATE.crt를 .crt사전 에 변환하기 위해
— 0x1gene

8

들어 만들기 앱 반응 (이 오류도 발생하고이 질문 # 1 구글 결과입니다), 당신은 아마 사용 HTTPS=true npm start하고는 proxy(에서 package.json) 개발에 일부 HTTPS API 자체 서명하는 자체 때로 이동한다.

이 경우 proxy다음과 같이 변경 하십시오.

"proxy": {
  "/api": {
    "target": "https://localhost:5001",
    "secure": false
  }
}

secure WebPack 프록시가 인증서 체인을 검사할지 여부를 결정하고 API 자체 서명 인증서가 확인되지 않도록하여 데이터를 얻을 수 있도록 비활성화합니다.


4

매우 할 유혹 할 수있다 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


이 버그는 주로 프로덕션 환경이 아닌 로컬 환경에서 발생하므로 로컬로 수행하는 것이 좋습니다. process.env [ 'NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
— Vivex

@Vivex-SSL 인증서의 작동 방식 및 통과 방법을 테스트하는 것이 요점이라면 로컬 환경에서 그렇게하는 것은 좋지 않습니다 ...
— dwanderson

2

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


2

나는 같은 문제가 있었다. @ThomasReggi 및 @ CoolAJ86 솔루션을 따라 잘 작동했지만 솔루션에 만족하지 않습니다.

인증 구성 수준으로 인해 "UNABLE_TO_VERIFY_LEAF_SIGNATURE"문제가 발생했기 때문입니다.

내가 @thirdender 솔루션하지만 당 그 부분 solution.As 동의 의 nginx 공식 웹 사이트, 그들은 명확하게 언급 인증서는 서버 인증서와 체인 인증서의 조합이어야한다.

여기에 이미지 설명을 입력하십시오


2

다음 과 같이 strictSSL 을 로 설정 하여 시도 할 수도 있습니다 false.

{  
   url: "https://...",
   method: "POST",
   headers: {
        "Content-Type": "application/json"},
   strictSSL: false
}

Node JS 응용 프로그램에서 보내는 경우 훌륭합니다!
— Ally Makongo

0

하위 도메인에 GoDaddy 인증서를 설치 한 후 Apache 구성에 문제가있었습니다. 원래 노드가 SNI (서버 이름 표시기)를 보내지 않는 문제라고 생각했지만 실제로는 그렇지 않았습니다. https://www.ssllabs.com/ssltest/를 사용 하여 하위 도메인의 SSL 인증서를 분석하면 체인 문제 : 불완전 오류가 반환되었습니다 .

Apache 지시문을 gd_bundle-g2-g1.crt통해 GoDaddy 제공 파일을 추가 한 후 SSLCertificateChainFileNode는 HTTPS를 통해 연결할 수 있었고 오류는 사라졌습니다.


0

서버에 중간 인증서를 포함시켜야합니다. 이것은 [오류 : UNABLE_TO_VERIFY_LEAF_SIGNATURE]를 해결합니다.


0

이를 안전하게 해결하는 또 다른 방법은 다음 모듈을 사용하는 것입니다.

node_extra_ca_certs_mozilla_bundle

이 모듈은 Mozilla가 신뢰하는 모든 루트 및 중간 인증서를 포함하는 PEM 파일을 생성하여 코드를 수정하지 않고도 작동 할 수 있습니다. 다음 환경 변수를 사용할 수 있습니다 (Nodejs v7.3 +에서 작동).

NODE_EXTRA_CA_CERTS

위 환경 변수와 함께 사용할 PEM 파일을 생성합니다. 다음을 사용하여 모듈을 설치할 수 있습니다.

npm install --save node_extra_ca_certs_mozilla_bundle

그런 다음 환경 변수를 사용하여 노드 스크립트를 시작하십시오.

NODE_EXTRA_CA_CERTS=node_modules/node_extra_ca_certs_mozilla_bundle/ca_bundle/ca_intermediate_root_bundle.pem node your_script.js

생성 된 PEM 파일을 사용하는 다른 방법은 다음에서 사용 가능합니다.

https://github.com/arvind-agarwal/node_extra_ca_certs_mozilla_bundle

참고 : 위 모듈의 저자입니다.


0

postgres / pg 노드 모듈을 사용하고 있기 때문에이 스레드가 나오면 NODE_TLS_REJECT_UNAUTHORIZEDor 설정보다 나은 해결책이있어 rejectUnauthorized연결이 안전하지 않게됩니다.

대신 tls.connect 의 매개 변수와 일치하도록 "ssl"옵션을 구성하십시오 .

{
  ca: fs.readFileSync('/path/to/server-ca.pem').toString(),
  cert: fs.readFileSync('/path/to/client-cert.pem').toString(),
  key: fs.readFileSync('/path/to/client-key.pem').toString(),
  servername: 'my-server-name' // e.g. my-project-id/my-sql-instance-id for Google SQL
}

내가 좋아하는 환경 변수에서 이러한 옵션을 구문 분석에 도움이 모듈을 작성했습니다 PGSSLROOTCERT, PGSSLCERT그리고 PGSSLKEY:

https://github.com/programmarchy/pg-ssl


-1

다음 명령이 나를 위해 일했습니다 :

> npm config set strict-ssl false
> npm cache clean --force

문제는 잘못되었거나 신뢰할 수없는 SSL [Secure Sockets Layer] 인증서가있는 저장소에서 모듈을 설치하려고한다는 것입니다. 캐시를 정리하면이 문제가 해결됩니다. 나중에 캐시를 true로 설정해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.