Gids voor ontwikkeling

Gebruik van X509-certificaten in fibjs

Achtergrond introductie

Wat is een x509-certificaat

Het x509-certificaat is het meest gebruikte digitale certificaatformaat in het PKI-systeem (Public Key Authentication Service) op basis van internationale standaarden. Het kan worden gebruikt voor authenticatie en codering, en wordt veel gebruikt in SSL/TLS-protocollen en andere soorten netwerktoepassingen op internet. Het x509-certificaat maakt gebruik van een authenticatiemechanisme met openbare sleutel/privésleutel en kan de vertrouwelijkheid, integriteit en authenticiteit van gegevensoverdracht garanderen.

In welke scenario's wordt het x509-certificaat gebruikt?

Op internet is het meest gebruikte scenario voor x509-certificaten de certificaatauthenticatie in het TLS/SSL-protocol om ervoor te zorgen dat de gegevens die tussen de client en de server worden verzonden, worden gecodeerd via een beveiligd kanaal en worden geverifieerd. x509-certificaten kunnen ook worden gebruikt voor identiteitsauthenticatie in applicatieprotocollen die zijn gebaseerd op publieke en private sleutelcodering zoals VPN/SSH.

fibjs ondersteunt x509-certificaatverwerking

fibjs ondersteunt de verwerking van x509-certificaten en biedt klassen zoals X509Cert en X509Req in de cryptomodule om bewerkingen uit te voeren zoals het lezen, maken en ondertekenen van certificaten. U kunt deze klassen gebruiken om de geldigheidsperiode van het certificaat, de publieke sleutel, de uitgever, de onderwerpnaam en andere informatie te verkrijgen, en om bewerkingen uit te voeren zoals het ondertekenen en verifiëren van het certificaat. Tegelijkertijd biedt fibjs ook de HttpsServer-klasse ter ondersteuning van HTTPS-certificaatauthenticatie en gecodeerde verbindingen, waardoor het gemakkelijker wordt om x509-certificaten in fibjs te gebruiken.

Inleiding tot de X509-module

Wat is de X509-module?

In de cryptomodule van fibjs zijn klassen zoals X509Cert en X509Req beschikbaar om bewerkingen uit te voeren zoals het lezen, aanmaken en ondertekenen van x509-certificaten. De X509-module is een module voor het verwerken van x509-certificaten en biedt bewerkingen zoals het parseren, aanmaken en verifiëren van certificaten.

De functie van de X509-module

De functie van de X509-module is het bedienen van het x509-certificaat. U kunt deze module gebruiken om het bestaande x509-certificaat te lezen en de geldigheidsperiode, publieke sleutel, uitgever, onderwerpnaam en andere informatie van het certificaat te verkrijgen. Tegelijkertijd kan de X509-module ook x509-certificaataanvragen en handtekeningcertificaten aanmaken, bijvoorbeeld voor certificaatauthenticatie in TLS/SSL-protocollen.

X509-module-API

Het volgende is een lijst met de belangrijkste API's in de X509-module:

  • X509Cert: Klasse voor het lezen en manipuleren van x509-certificaten.
  • X509Req: Klasse die wordt gebruikt om x509-certificaataanvragen te maken.
  • verify: Verifieer het x509-certificaat via een CA-certificaatpaar.
  • SslServer: een klasse die authenticatieservices biedt op basis van x509-certificaten.
  • SslSocket: een klasse die socketverzending en -ontvangst van gegevensbewerkingen biedt voor authenticatieservices op basis van x509-certificaten.

Voorbeeldcode

Het volgende is voorbeeldcode om een ​​x509-certificaat te lezen en een x509-certificaataanvraag te maken:

1 2 3 4 5 6 7 8 9 10 11 12
const crypto = require('crypto'); // load the cert const cert = crypto.loadCert('server.crt'); console.log(cert.subject); // create x509 certificate request let pky = crypto.PKey.from(private_pem); let req = new crypto.X509Req("CN=localhost,O=fibjs", pky); let derReq = req.der(); let pemReq = req.pem(); console.log(pemReq);

De bovenstaande voorbeeldcode leest een bestaand x509-certificaat via de X509Cert-klasse en voert de onderwerpnaam van het certificaat uit. Tegelijkertijd demonstreert de voorbeeldcode ook hoe u een x509-certificaatverzoek kunt maken via X509Req en hoe u de verzoekinformatie in PEM-indeling kunt uitvoeren.

Gebruik van X509-module

Genereer een zelfondertekend certificaat

Het proces voor het genereren van een zelfondertekend certificaat is relatief eenvoudig. Over het algemeen moet u de volgende stappen uitvoeren:

  • Genereer PKey (privésleutel)
  • Genereer X509Req (certificaataanvraag)
  • Gebruik X509Req om X509Cert (formeel certificaat) te genereren
  • certificaat opslaan

Met behulp van deze stappen kunt u uw eigen x509-certificaat genereren voor gebruik in test- en ontwikkelomgevingen. Het volgende is de specifieke implementatie:

Gebruik de volgende code om een ​​PKey-object te maken. Onder hen kan de from() -methode een PKey-object maken via een PEM-formaatreeks of een buffer.

1 2
const crypto = require('crypto'); const pky = crypto.PKey.from(private_pem);

Gebruik de volgende code om een ​​X509Req-object te maken. Onder hen is de eerste parameter van X509Req de onderscheidende naam van het onderwerp (Subject Name) en het tekenreeksformaat is key1=waarde1,key2=waarde2. De tweede parameter is het eerder gemaakte PKey-object dat wordt gebruikt voor het ondertekenen van certificaten. Bijvoorbeeld:

1
let xrq = new crypto.X509Req("CN=localhost,O=fibjs", pky);

Gebruik de volgende code om een ​​X509Cert (officieel certificaat) te maken. De specifieke bewerking is het aanroepen van de sign()-methode van X509Req, die drie parameters accepteert: de naam van de certificeringsinstantie, het PKey-object dat wordt gebruikt voor ondertekening en andere gerelateerde informatie. In het volgende voorbeeld is het X509Req-object bijvoorbeeld ondertekend met een zelfondertekend certificaat, is de ondertekeningsautoriteit zichzelf en is het certificaat 10 jaar geldig:

1 2 3 4 5
const opt = { notBefore: new Date(), notAfter: new Date(new Date().getTime() + 10 * 365 * 24 * 60 * 60 * 1000) }; const cert = xrq.sign("CN=localhost,O=fibjs", pky, opt);

Gebruik de volgende code om de PKey en X509Cert op te slaan in een lokaal bestand. Omdat het certificaat in PEM-indeling wordt opgeslagen, kunt u de pem()-methode gebruiken om het certificaatobject naar een tekenreeks te converteren en het vervolgens rechtstreeks in het bestand op te slaan:

1 2 3 4 5
const fs = require('fs'); const ks = pky.pem(); // export pem format data of the private key const cs = cert.pem(); // export pem format data of the cert fs.writeFile('mycert.key', ks); // save the key fs.writeFile('mycert.pem', cs); // save the cert

De bovenstaande code voltooit het hele proces, van het genereren van een privésleutel tot het opslaan van een zelfondertekend certificaat. Met dit certificaat kunnen beveiligingsgerelateerde applicaties worden getest en ontwikkeld.

Certificaat laden

Het laden van het certificaat is een belangrijke handeling bij het gebruik van x509-certificaten. Hieronder wordt beschreven hoe u het certificaatbestand en de openbare en privésleutels laadt.

Om een ​​x509-certificaat te kunnen gebruiken, moet het certificaatbestand eerst in het geheugen worden gelezen en worden geconverteerd naar een x509-certificaatobject. Hier volgen de stappen voor het laden van het certificaatbestand:

In het fibjs JavaScript-programma kunt u de relevante API van de fs-module gebruiken om bestanden te lezen. Gebruik bijvoorbeeld de volgende code om een ​​certificaatbestand in PEM-indeling te lezen:

1 2
const fs = require('fs'); const certData = fs.readFile('server.crt');

Na het lezen van het bestand moet de inhoud van het certificaatbestand worden geconverteerd naar een x509-certificaat met behulp van het X509Cert-object:

1 2
const crypto = require('crypto'); const cert = new crypto.X509Cert(certData);

Na de bovenstaande stappen kunt u het lokale x509-certificaatbestand laden. U kunt ook crypto.loadCert gebruiken om het certificaat direct uit te lezen:

1 2
const crypto = require('crypto'); const cert = crypto.loadCert('server.crt');

Het x509-certificaat slaat de openbare sleutel en de gecodeerde handtekeninginformatie op. Wanneer u het certificaat gebruikt, moet u daarom de openbare sleutel in het certificaat parseren om de gegevenscodering en -decodering te vergemakkelijken. De klasse PKey kan openbare/privé-sleutelreeksen in PEM-indeling converteren naar openbare/privé-sleutelobjecten. U kunt de volgende code gebruiken om de openbare/private sleutelreeks in PEM-indeling te lezen en een PKey-object te maken:

1 2
const privateKey = fs.readFile('private.pem'); // load the data from file const pKey = crypto.PKey.from(privateKey); // load from pem format data

Of gebruik crypto.loadPKey om direct te lezen:

1 2
const crypto = require('crypto'); const pKey = crypto.loadPKey('private.pem');

Na de bovenstaande stappen kan het publieke/private sleutelbestand worden geconverteerd naar een PKey-object.

Parse-certificaat

Certificaten zijn een belangrijk onderdeel van SSL/TLS-interacties en worden gebruikt voor authenticatie en codering van gegevensoverdracht. Laten we nu leren hoe we een certificaat in fibjs kunnen parseren.

We kunnen de klasse X509Cert van de cryptomodule gebruiken om een ​​certificaatobject te construeren door een certificaatbestand in DER/PEM-indeling te lezen en vervolgens wat basisinformatie over het certificaat te verkrijgen, zoals het verkrijgen van de onderwerpnaam van het certificaat, de naam van de uitgever, de geldigheidsperiode, enz. .

De voorbeeldcode is als volgt:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
const crypto = require('crypto'); const cert = crypto.loadCert('path/to/cert.pem'); const subjectName = cert.subject; const issuerName = cert.issuer; const validFromDate = cert.notBefore; const expirationDate = cert.notAfter; const serialNumber = cert.serial; console.log(`证书主题名称: ${subjectName}`); console.log(`证书颁发者名称: ${issuerName}`); console.log(`证书有效期: ${validFromDate.toLocaleString()} ~ ${expirationDate.toLocaleString()}`); console.log(`证书序列号: ${serialNumber}`);

Wanneer we een certificaat moeten gebruiken, moeten we de legitimiteit van het certificaat verifiëren. De sleutel is om ervoor te zorgen dat het certificaat is uitgegeven door een vertrouwde organisatie. U kunt de verificatiemethode in X509Cert gebruiken om de geldigheid van het certificaat te controleren. Een veelgebruikte verificatiemethode is het verifiëren van de certificaatketen om er zeker van te zijn dat het certificaat is uitgegeven door een vertrouwde CA.

De voorbeeldcode is als volgt:

1 2 3 4 5 6 7 8 9
const caCert = crypto.loadCert('path/to/ca.crt'); const verifyResult = cert.verify(caCert); if (verifyResult !== 0) { console.error('证书验证失败', verifyResult); } else { console.log('证书验证通过'); }

In deze voorbeeldcode lezen we eerst het opgegeven CA-certificaat, genereren we een X509Cert-object en gebruiken we vervolgens de verificatiemethode op het certificaatobject om het certificaat te verifiëren dat moet worden geverifieerd, en verkrijgen we het verificatieresultaat. U kunt bepalen of het certificaat legitiem is door te vergelijken of het verificatieresultaat gelijk is aan 0. Als het verificatieresultaat niet 0 is, betekent dit dat de verificatie is mislukt en dat het gebruik van het certificaat moet worden stopgezet.

Gebruik certificaat

Wanneer u een https-server gebruikt, moet u ervoor zorgen dat het gebruikte certificaat aan de server is toegevoegd. Hier is een eenvoudig voorbeeld van het laden van certificaat- en privésleutelbestanden via de cryptomodule:

1 2 3 4 5 6 7 8 9 10
const http = require("http"); const crypto = require("crypto"); const cert = crypto.loadCert("server.crt"); const key = crypto.loadPKey("server.key"); const server = new http.HttpsServer(cert, key, 8443, function(req) { req.response.write(`Hello, fibjs!`); }); server.start();

In het bovenstaande voorbeeld hebben we de bestanden server.crt en server.key geladen via de functies loadCert en loadPKey, vervolgens een service gemaakt met behulp van het HttpsServer-object en de service gestart met het geladen certificaat en de sleutelbestanden.

Opmerkingen over de X509-module

Certificaatbeveiliging

De X509-module biedt functies zoals het aanmaken en verwerken van certificaten. De veiligheid van het certificaat moet gegarandeerd zijn. Dit vereist speciale aandacht voor de volgende punten:

  • Beveiliging van privésleutels. De private sleutel is een belangrijk onderdeel van het certificaat en moet strikt worden beschermd. Tijdens het gebruik van certificaten moet de private sleutel zoveel mogelijk op een veilige plaats worden bewaard en moeten de toegangsrechten op de juiste manier worden ingesteld.
  • De overdracht van certificaten is veilig. Tijdens de uitwisseling en het gebruik van certificaten moeten veilige transmissiemethoden worden gebruikt om te voorkomen dat certificaten worden gestolen of dat er mee wordt geknoeid.
  • Certificaatverificatie is veilig. Certificaatverificatie is een belangrijke stap bij het garanderen van de geldigheid en veiligheid van het certificaat. Verificatie moet worden uitgevoerd in strikte overeenstemming met de certificaatverificatieregels om te voorkomen dat vervalste certificaten gebruikers misleiden.

Geldigheidsduur certificaat

De geldigheidsduur van een certificaat verwijst naar de periode vanaf de uitgiftedatum van het certificaat tot de vervaldatum van het certificaat. De geldigheidsduur van het certificaat beperkt de gebruiksduur van het certificaat. Voordat het certificaat verloopt kan de certificaathouder het certificaat gebruiken, maar na het verlopen van het certificaat verliest het certificaat zijn geldigheid.

Voordat u een certificaat gebruikt, moet u daarom de geldigheidsduur van het certificaat controleren om te voorkomen dat u een verlopen certificaat gebruikt. Tegelijkertijd moet het certificaat zo snel mogelijk worden bijgewerkt voordat het verloopt, om de beschikbaarheid van het certificaat te garanderen.

Certificaatvertrouwensmechanisme

Het vertrouwensmechanisme van het certificaat is een sleutelfactor voor de vraag of het certificaat door de client of server kan worden vertrouwd. Doorgaans vertrouwt de client of server alleen certificaten die zijn ondertekend en herkend door een vertrouwde autoriteit (CA).

Voordat u een certificaat gebruikt, moet u de vertrouwensproblemen van het certificaat vaststellen. U kunt bepalen of een certificaat betrouwbaar is door de uitgevende autoriteit van het certificaat, de onderscheidende naam van het certificaat, enz. te controleren.

Mechanisme voor certificaatvernieuwing

Het certificaatvernieuwingsmechanisme is een belangrijk onderdeel om ervoor te zorgen dat het certificaat geldig en veilig blijft. Normaal gesproken omvat de certificaatvernieuwing hoofdzakelijk twee aspecten:

  • Verlenging na het verlopen van het certificaat. Nadat het certificaat is verlopen, moet u het certificaat opnieuw aanvragen en het ondertekenen en verifiëren volgens de bijbehorende regels om de geldigheid van het certificaat te garanderen.
  • Certificaatuitbreidingen en vernieuwingen. Als u tijdens het gebruik van het certificaat de certificaatinformatie moet uitbreiden of bijwerken, kunt u dit doen door het certificaat opnieuw aan te vragen en het te ondertekenen en te verifiëren.

Kortom, de X509-module biedt certificaataanmaak, -verwerking en andere functies, en is een belangrijke schakel om de veiligheid, betrouwbaarheid en geldigheid van certificaten te garanderen. Tijdens het gebruik en beheer van certificaten moeten de overeenkomstige regels en vereisten worden gevolgd om de geldigheid en veiligheid van het certificaat te garanderen.

👉【Voeg native module toe