nodejs – fout zelfondertekend certificaat in certificaatketen

Ik heb een probleem met https-verzoeken aan de clientzijde.

Een fragment kan er als volgt uitzien:

var fs = require('fs');
var https = require('https');
var options = {
    hostname: 'someHostName.com',
    port: 443,
    path: '/path',
    method: 'GET',
    key: fs.readFileSync('key.key'),
    cert: fs.readFileSync('certificate.crt')
}
var requestGet = https.request(options, function(res){
    console.log('resObj', res);
}

Wat ik krijg is Fout: zelfondertekend certificaat in certificaatketen.

Als ik Postman gebruik, kan ik het clientcertificaat en de sleutel importeren en zonder problemen gebruiken. Is er een oplossing beschikbaar?? Ik zou ook graag wat uitleg krijgen over hoe de postbode met de certificaten omgaat en werkt.


Antwoord 1, autoriteit 100%

Optie 1: Schakel de waarschuwing uit (handig voor dev)

Op basis van uw vraag vermoed ik dat u dit in ontwikkeling doet, aangezien u een zelfondertekend certificaat voor SSL-communicatie gebruikt.

Als dat het geval is, voeg dan toe als een omgevingsvariabele waar u ook een node gebruikt

export NODE_TLS_REJECT_UNAUTHORIZED='0'
node app.js

of knooppunt rechtstreeks uitvoeren met

NODE_TLS_REJECT_UNAUTHORIZED='0' node app.js

Dit geeft Node de opdracht om niet-vertrouwde certificaten toe te staan ​​(niet-vertrouwd = niet geverifieerd door een certificeringsinstantie)

Als u geen omgevingsvariabele wilt instellen of dit voor meerdere toepassingen moet doen, heeft npm een ​​strict-ssl-configuratie die u instelt op false

npm config set strict-ssl=false

Optie 2: laad in CA-certificaat, zoals postbode (handig voor testen met TLS)

Als je al een CA-certificaat hebt, zoals de poster die @kDoyle noemde, dan kun je in elk verzoek configureren (bedankt @nic ferrier).

let opts = {
    method: 'GET',
    hostname: "localhost",
    port: listener.address().port,
    path: '/',
    ca: fs.readFileSync("cacert.pem")
  };
  https.request(opts, (response) => { }).end();

Optie 3: gebruik een correct SSL-certificaat van een vertrouwde bron (handig voor productie)

letsencrypt.org is gratis, eenvoudig in te stellen en de sleutels kunnen automatisch worden gedraaid. https://letsencrypt.org/docs/


Antwoord 2, autoriteit 23%

U kunt dit probleem oplossen door NODE_TLS_REJECT_UNAUTHORIZED=0in de terminal te gebruiken of door de volgende regel in het JS-bestand in te voegen.

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0;

Pas op dat dit een hack is en niet in productie mag worden gebruikt.

Als u Windows gebruikt, voer dan de volgende opdracht uit in de opdrachtprompt:

set NODE_TLS_REJECT_UNAUTHORIZED=0 

Daarna zal npm install <my-package>werken.


Antwoord 3, autoriteit 13%

Je kunt het commando npm config set strict-ssl=false

schrijven


Antwoord 4, autoriteit 8%

Verificatie uitschakelen is nogal gevaarlijk. Veel beter om het certificaat te verifiëren.

U kunt het certificaat van de certificeringsinstantie als volgt in het verzoek opnemen met de ca-sleutel van het options-object:

let opts = {
    method: 'GET',
    hostname: "localhost",
    port: listener.address().port,
    path: '/',
    ca: await fs.promises.readFile("cacert.pem")
  };
https.request(opts, (response) => { }).end();

Ik heb hier een hele demo van gemaakt, zodat je kunt zien hoe je SSL-tests maakt.

Het is hier.


Antwoord 5, autoriteit 8%

je voegt gewoon aan het begin van je code deze regel toe:

process.env.NODE_TLS_REJECT_UNAUTHORIZED='0'

En alles is opgelost, maar het is in ieder geval niet aan te raden, ik onderzoek de oplossing van https://letsencrypt.org/


Antwoord 6, autoriteit 4%

voor Nodemailer:

toevoegen

tls: {
  rejectUnauthorized: false
}

mijn probleem opgelost.

Algemene code ziet er als volgt uit:

nodemailer.createTransport({
    host: process.env.MAIL_SERVER,
    secure: false,
    port: 587,
    auth: {
      user: process.env.MAIL_USERNAME,
      pass: process.env.MAIL_PASSWORD
    },
    tls: {
      rejectUnauthorized: false
    }
  }

Antwoord 7, autoriteit 2%

Voor wat het waard is, na anderhalve dag te hebben besteed aan het opsporen van deze, bleek de fout te zijn veroorzaakt door een instelling op de firewall van mijn bedrijf die IT moest uitschakelen. Niets op internet heeft iets gedaan om dit op te lossen.


Antwoord 8

De node-toepassing moet het CA-certificaat hebben toegevoegd aan de bestaande CA (Mozilla)-certificaten.

We starten het knooppunt met een service en voegen de omgevingsvariabele NODE_EXTRA_CA_CERTS toe

[Service]
Restart=always
User=<...>
Group=<...>
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
Environment=NODE_EXTRA_CA_CERTS=/<...>/.ssl/extra_certs.pem
WorkingDirectory=/<...>
ExecStart=/usr/bin/node -r dotenv/config /<.....>/server.js dotenv_config_path=/<....>/.env

Op deze manier kunnen we dezelfde applicatie gebruiken om services te bellen met populaire CA’s of onze eigen zelfondertekende certificaten, en hoeven we SSL-controle niet uit te schakelen.

In Linux is er een gemakkelijke manier om het certificaat te verkrijgen, gebruik dit bericht: Gebruik zelfondertekend certificaat met cURL?

U maakt uw certificaat met:

$ echo quit | openssl s_client -showcerts -servername server -connect server:443 > cacert.pem

kopieer dan dat .pem-bestand als extra_cert.pem. U kunt slechts één pem-bestand hebben, maar u kunt meerdere pem-bestanden aan één bestand toevoegen.

Ik hoop dat iemand hier iets aan heeft, het kostte me een tijdje om de verschillende onderdelen te vinden om dit te laten werken.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

1 × five =

Other episodes