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


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라는 플러그인이 사용하고 있습니다 nodemailernodemailer-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의 솔루션은 정확하고 그것을 사용하는 모든 검사를 비활성화처럼 보안을 손상하지 않는 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
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.