Pode ser muito tentador fazer rejectUnauthorized: false
ou process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
não fazê-lo! Expõe você ao homem nos ataques do meio.
As outras respostas estão corretas, pois o problema está no fato de o seu certificado ser "assinado por uma CA intermediária". Existe uma solução fácil para isso, que não requer uma biblioteca de terceiros, como ssl-root-cas
injeta CAs adicionais no nó.
A maioria dos clientes https no nó suporta opções que permitem especificar uma CA por solicitação, que será resolvida UNABLE_TO_VERIFY_LEAF_SIGNATURE
. Aqui está um exemplo simples usando o https
módulo interno do nó .
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
})
Se, no entanto, você puder definir as configurações de SSL no servidor de hospedagem, a melhor solução seria adicionar os certificados intermediários ao seu provedor de hospedagem. Dessa forma, o solicitante do cliente não precisa especificar uma CA, pois está incluída no próprio servidor. Eu pessoalmente uso namecheap + heroku. O truque para mim foi criar um arquivo .crt com cat yourcertificate.crt bundle.ca-bundle > server.crt
. Abri esse arquivo e adicionei uma nova linha após o primeiro certificado. Você pode ler mais em
https://www.namecheap.com/support/knowledgebase/article.aspx/10050/33/installing-an-ssl-certificate-on-heroku-ssl