如果有人偶然发现这个问题,nodejs v12 现在支持 TLS 1.3。
这里是一个示例代码 sn-p,它还生成自己的自签名证书以进行快速测试:
const https = require("https")
const fs = require("fs");
const forge = require('node-forge')
forge.options.usePureJavaScript = true
const express = require("express")
var pki = forge.pki;
var keys = pki.rsa.generateKeyPair(2048);
var cert = pki.createCertificate();
cert.publicKey = keys.publicKey;
cert.serialNumber = '01';
cert.validity.notBefore = new Date();
cert.validity.notAfter = new Date();
cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear()+1);
var attrs = [{
name: 'commonName',
value: 'www.cooltest.site'
}, {
name: 'countryName',
value: 'US'
}, {
shortName: 'ST',
value: 'Illinois'
}, {
name: 'localityName',
value: 'Downers Grove'
}, {
name: 'organizationName',
value: 'Test'
}, {
shortName: 'OU',
value: 'Test'
}];
cert.setSubject(attrs);
cert.setIssuer(attrs);
cert.setExtensions([{
name: 'basicConstraints',
cA: true
}, {
name: 'keyUsage',
keyCertSign: true,
digitalSignature: true,
nonRepudiation: true,
keyEncipherment: true,
dataEncipherment: true
}, {
name: 'extKeyUsage',
serverAuth: true,
clientAuth: true,
codeSigning: true,
emailProtection: true,
timeStamping: true
}, {
name: 'nsCertType',
client: true,
server: true,
email: true,
objsign: true,
sslCA: true,
emailCA: true,
objCA: true
}, {
name: 'subjectAltName',
altNames: [{
type: 6, // URI
value: 'http://www.mycooltest.site'
}, {
type: 7, // IP
ip: '127.0.0.1'
}]
}, {
name: 'subjectKeyIdentifier'
}]);
cert.sign(keys.privateKey);
var private_key = pki.privateKeyToPem(keys.privateKey);
var public_key = pki.certificateToPem(cert);
// In case you need the newly generated keys displayed or saved
// console.log(public_key);
// console.log(private_key);
// fs.writeFileSync("private.pem",private_key)
// fs.writeFileSync("public.crt",public_key)
const options = {
key: private_key,
cert: public_key
// In case you already have the keys available to you
// key: fs.readFileSync("key.pem"),
// cert: fs.readFileSync("chain.pem")
};
const app = express();
app.use((req, res) => {
res.writeHead(200);
res.end("hello world\n");
});
app.listen(8000);
https.createServer(options, app).listen(8080);