APIに到達するためにnode.js request.jsを使用しています。このエラーが発生しています
[エラー: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 で接続しているWebサイトの証明書を発行した人を見つけ、その機関の証明書をダウンロードし、その証明書のみを追加しようとしました。
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');
Create React App(このエラーも発生し、この質問はGoogleの1位の結果です)の場合、おそらくHTTPS=true npm start
とproxy
name__(package.json
内の)を使用しています。開発時に自己署名されるHTTPS API。
その場合は、proxy
name__を次のように変更することを検討してください。
"proxy": {
"/api": {
"target": "https://localhost:5001",
"secure": false
}
}
secure
name__は、WebPackプロキシが証明書チェーンをチェックするかどうかを決定し、データを取得するためにAPI自己署名証明書が検証されないことを無効にします。
同じ問題がありました。私は@ThomasReggiと@ CoolAJ86のソリューションをフォローしてきましたが、うまくいきましたが、ソリューションに満足していません。
証明書の構成レベルが原因で「UNABLE_TO_VERIFY_LEAF_SIGNATURE」問題が発生するためです。
@thirdenderソリューションを受け入れますが、その部分的なソリューションです nginx 公式Webサイトによると、証明書はサーバー証明書とチェーン証明書の組み合わせであることが明確に記載されています。
請願書にrejectUnauthorized:falseを入れてください。
これが誰かを助けるためにここに置くだけで、私の場合は異なっていて、ちょっと変わったミックスです。 superagent を介してアクセスされたリクエストでこれを取得していました-問題は証明書(適切にセットアップされている)とは関係がなく、すべてがスーパーエージェントの結果を渡すという事実と関係がありました async モジュールのウォーターフォールコールバック。修正方法:結果全体を渡す代わりに、ウォーターフォールのコールバックにresult.body
を渡すだけです。
サーバーに中間証明書を含める必要があります。これにより、[エラー:UNABLE_TO_VERIFY_LEAF_SIGNATURE]が解決されます
GoDaddy証明書をサブドメインにインストールした後、Apacheの構成に問題がありました。元々、NodeがServer Name Indicator(SNI)を送信しない問題だと思っていましたが、そうではありませんでした。 https://www.ssllabs.com/ssltest/ を使用してサブドメインのSSL証明書を分析すると、エラーが返されましたチェーンの問題:Incomplete 。
SSLCertificateChainFile
Apacheディレクティブを介してGoDaddyが提供するGd_bundle-g2-g1.crt
ファイルを追加すると、NodeはHTTPS経由で接続でき、エラーはなくなりました。