web-dev-qa-db-ja.com

Nodeサーバーでフェッチ要求が失敗:ローカル発行者証明書を取得できません

〜Node 10.9.0 and npm 6.2.0〜を使用しています

httpおよびhttpsを介して同じサイトにリクエストを送信できる次のアプリを実行しています。

var fetch = require('node-fetch')
const express = require('express')
const app = express()

//-- HTTP --
app.get('/test-no-ssl', function(req, res){
  fetch('http://jsonplaceholder.typicode.com/users')
  .then(res => res.json())
  .then(users => {
    res.send(users)
  }).catch(function(error) {
    res.send(error)
  })
})

//-- HTTPS --
app.get('/test-ssl', function(req, res){
  fetch('https://jsonplaceholder.typicode.com/users')
  .then(res => res.json())
  .then(users => {
    res.send(users)
  }).catch(function(error) {
    res.send(error)
  })
})

app.listen(3003, () => 
  console.log('Listening on port 3003...')
)

これらはどちらもローカルマシンで正常に動作し、Typicodeが提供するJSON応答を返します。しかし、これらをNodeアプリとしてWebホストに展開すると( FastComet ))、次の結果が得られます。

[〜#〜] http [〜#〜]/test-no-ssl-期待どおりにJSONを返します

[〜#〜] https [〜#〜]/test-ssl-次のエラーを返します。

{ 
  "message" : "request to https://jsonplaceholder.typicode.com/users failed, reason: unable to get local issuer certificate",
  "type" : "system",
  "errno" : "UNABLE_TO_GET_ISSUER_CERT_LOCALLY",
  "code" : "UNABLE_TO_GET_ISSUER_CERT_LOCALLY"
}

私はこのエラーを検索し、通常の修正をいくつか試しましたが、何も役に立ちませんでした。

これらは機能しませんでした:

npm config set registry http://registry.npmjs.org/

npm set strict-ssl=false

他の誰かが(Nodeをサポートする)共有ホスティングプロバイダーでこれに遭遇し、これを機能させることができましたか?おそらく、FastCometを使用している人ですら?ホストのサポートスタッフもどうしたらいいかわからないので困っています。

8
Clifton Labrum

以下を使用してみてください:

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0
9
omt66

ホスティングでは、おそらく認証局のリストに問題があります...回避策として、証明書の有効性を無視してみてください。

const fetch = require('node-fetch')
const https = require('https')
const express = require('express')
const app = express()

const agent = new https.Agent({
  rejectUnauthorized: false
})

//-- HTTP --
app.get('/test-no-ssl', function(req, res){
  fetch('http://jsonplaceholder.typicode.com/users')
    .then(res => res.json())
    .then(users => {
      res.send(users)
    }).catch(function(error) {
    res.send(error)
  })
})

//-- HTTPS --
app.get('/test-ssl', function(req, res){
  fetch('https://jsonplaceholder.typicode.com/users', { agent })
    .then(res => res.json())
    .then(users => {
      res.send(users)
    }).catch(function(error) {
    res.send(error)
  })
})

app.listen(3003, () =>
  console.log('Listening on port 3003...')
)

注:これはセキュリティに影響を与えるため、httpsはhttpと同じように安全ではありません。

2
m1ch4ls