Aufrufen einer Schnittstelle mit eigener Certification Authority in einem Skript
Auf vielen On-Premises-Umgebungen existiert eine eigene Certification Authority (CA) für die Signierung von Serverzertifikaten. Oftmals sind diese CAs nicht von einer vertrauenswürdigen Stelle unterzeichnet, sodass die NodeJS-Ausführungsumgebung diesen Zertifikaten nicht vertraut. Dieser Umstand führt dazu, dass aus der Scripting-App heraus keine REST-Abfragen in Richtung dieser Systeme gesendet werden können.
Für die Ausführung von REST-Abfragen müssen Sie den öffentlichen Teil des CA-Zertifikates im PEM-Format importieren. Da die Zertifikate oftmals bereits im Zertifikatsspeicher von Windows gespeichert sind, können Sie den öffentlichen Teil des Zertifikats aus dem Zertifikatsspeicher exportieren.
Anmerkung
Das Zertifikat muss im PEM-Format sein. Exportieren Sie das Zertifikat mit dem Format "Base-64-codiert X509" oder konvertieren Sie das Zertifikat per openSSL. Anschließend können Sie die Datei bzw. den Inhalt der Datei als String im Skript verwenden.
Sie haben zwei Optionen, um selbstsignierte Zertifikate einzubinden:
Option 1
In der NodeJS-Ausführungsumgebung können Sie global eigene Zertifikate einbinden. Verwenden Sie die Systemumgebungsvariable NODE_EXTRA_CA_CERTS=<Pfad zur PEM-Datei> und starten Sie d.velop process manager neu.
Option 2
Fügen Sie Ihrem Skript die Abhängigkeit undici hinzu. Anschließend können Sie das Zertifikat von der Festplatte laden. Alternativ können Sie den Zertifikatsstring im Skript eintragen und dem Agent-Objekt als CA hinzufügen:
//Load undici agent and get dispatch function setter const { Agent, setGlobalDispatcher } = require('undici') module.exports = async (req, res) => { //Read cert file from filesystem const fs = require('fs'); const certString = fs.readFileSync("C:\\certs\\test.pem", 'utf8') //Create a new agent using the loaded cert string as ca const agent = new Agent({ connect: { ca: certString } }) //Set global dispatcher function setGlobalDispatcher(agent) //All regular fetch calls will now use the new agent const response = await fetch("https://my.secured.host/scripting", { // Adding method type method: "GET", // Adding headers to the request headers: { "Accept": "application/json" }, }) if(!response.ok) { console.log("Response was not ok") } const result = await response.json(); console.log("Response from fetch", result) res.status(200).set("Content-Type", "text/plain").send(result); }