web-dev-qa-db-fra.com

Node Fetch Request échoue sur le serveur: impossible d'obtenir le certificat de l'émetteur local

~ J'utilise Node 10.9.0 et npm 6.2.0 ~

J'ai l'application suivante en cours d'exécution qui me permet de faire une demande au même site sur http et sur 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...')
)

Ces deux éléments fonctionnent correctement sur ma machine locale et renvoient la réponse JSON fournie par Typicode. Mais lorsque je les déploie en tant qu'application Node sur mon hôte Web ( FastComet ), j'obtiens les résultats suivants:

[~ # ~] http [~ # ~] /test-no-ssl - Renvoie le JSON comme prévu

[~ # ~] https [~ # ~] /test-ssl - Renvoie l'erreur suivante:

{ 
  "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"
}

J'ai recherché cette erreur et essayé quelques-unes des corrections habituelles, mais rien n'a aidé.

Ceux-ci n'ont pas fonctionné:

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

npm set strict-ssl=false

Quelqu'un d'autre a-t-il rencontré cela sur un fournisseur d'hébergement partagé (qui prend en charge Node) et a-t-il pu faire fonctionner cela? Peut-être même quelqu'un qui utilise FastComet? Le personnel de soutien de l'hôte ne semble pas non plus savoir quoi faire, donc je suis perdu.

8
Clifton Labrum

Essayez d'utiliser les éléments suivants:

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

L'hébergement a probablement un problème avec la liste des autorités de certification ... comme solution de contournement, vous pouvez essayer d'ignorer la validité du certificat.

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...')
)

Remarque: cela a des implications sur la sécurité, rendant https non sécurisé de la même manière que http.

2
m1ch4ls