it-swarm.com.de

Wie konfiguriert man Axios für die Verwendung eines SSL-Zertifikats?

Ich versuche, eine Anforderung mit Axios an einen API-Endpunkt zu senden, und ich erhalte die folgende Fehlermeldung: Error: unable to verify the first certificate

Es scheint, dass das von axios verwendete https-Modul das auf dem Server verwendete SSL-Zertifikat nicht überprüfen kann.

Wenn ich den Server mit meinem Browser besuche, ist das Zertifikat gültig und ich kann es sehen/herunterladen. Ich kann auch Anfragen an das API in meinem Browser über https senden.

Ich kann es umgehen, indem ich die Verifizierung abschalte. Dieser Code funktioniert.

const result = await axios.post(
    `https://${url}/login`,
    body,
    {
      httpsAgent: new https.Agent({
        rejectUnauthorized: false
      })
    }
  )

Das Problem ist, dass das SSL-Zertifikat nicht überprüft wird und daher Sicherheitslücken entstehen.

Wie kann ich Axios so konfigurieren, dass er dem Zertifikat vertraut und es korrekt überprüft?

4
Jemi Salo

Alte Frage, aber für diejenigen, die hier landen. Kein Experte Bitte konsultieren Sie Ihre örtlichen Sicherheitsgurus und was nicht.

Axios ist ein http (s) -Client, und http-Clients nehmen normalerweise anonym an TLS teil. Mit anderen Worten, der Server akzeptiert ihre Verbindung, ohne zu ermitteln, wer versucht, eine Verbindung herzustellen. Dies unterscheidet sich dann von "Gegenseitiges TLS", bei dem sich Server und Client gegenseitig überprüfen, bevor der Handshake abgeschlossen wird. 

Das Internet ist ein furchterregender Ort, und wir möchten unsere Kunden vor der Verbindung mit gefälschten öffentlichen Endpunkten schützen. Wir tun dies, indem wir sicherstellen, dass unsere Kunden den Server identifizieren, bevor sie private Daten senden.

// DO NOT DO THIS IF SHARING PRIVATE DATA WITH SERVICE
const httsAgent = new https.Agent({ rejectUnauthorized: false });

Dies wird häufig als Antwort auf StackOverflow in Bezug auf https-Client-Verbindungsfehler in einer beliebigen Sprache gepostet (und ärgerlich verbessert). Und was noch schlimmer ist, dass es normalerweise funktioniert, den Entwickler entblockt und sich auf seinem fröhlichen Weg bewegt. Doch während sie sicher in die Tür steigen, wessen Tür ist sie? Seit sie die Überprüfung der Identität des Servers abgelehnt haben, kann der schlechte Client nicht feststellen, ob die Verbindung, die er gerade mit dem Intranet des Unternehmens hergestellt hat, schlechte Akteure hat. 

Wenn der Dienst über ein öffentliches SSL-Zertifikat verfügt, muss https.Agent normalerweise nicht weiter konfiguriert werden, da Ihr Betriebssystem einen allgemeinen Satz öffentlich vertrauenswürdiger Zertifizierungsstellenzertifikate bereitstellt. Dies ist normalerweise derselbe Satz von Zertifizierungsstellenzertifikaten, für den Ihr Browser konfiguriert ist. Aus diesem Grund kann ein standardmäßiger Axios-Client ohne großen Aufwand auf https://google.com zugreifen.

Wenn der Dienst über ein privates SSL-Zertifikat (zu Testzwecken selbst signiert oder von der privaten Zertifizierungsstelle Ihres Unternehmens zum Schutz seiner internen Geheimnisse signiert) verfügt, muss der https-Agent so konfiguriert sein, dass er der privaten Zertifizierungsstelle vertraut, mit der das Server-Zertifikat signiert wurde:

const httpsAgent = new https.Agent({ ca: MY_CA_BUNDLE });

dabei ist MY_CA_BUNDLE ein Array von CA-Zertifikaten im .pem-Format.

6
srquinn

Erstellen Sie einen benutzerdefinierten Agenten mit SSL-Zertifikat:

const httpsAgent = new https.Agent({
  rejectUnauthorized: false,
  cert: fs.readFileSync("./usercert.pem"),
  key: fs.readFileSync("./key.pem"),
  passphrase: "YYY"
})

axios.get(url, { httpsAgent })

// or

const instance = axios.create({ httpsAgent })

Von https://github.com/axios/axios/issues/284

1
Fabio Espinosa