UNPKG

2.84 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = generateCertificate;
7
8var _nodeForge = _interopRequireDefault(require("node-forge"));
9
10var _path = _interopRequireDefault(require("path"));
11
12var _logger = _interopRequireDefault(require("@parcel/logger"));
13
14function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
16async function generateCertificate(fs, cacheDir) {
17 let certDirectory = cacheDir;
18
19 const privateKeyPath = _path.default.join(certDirectory, 'private.pem');
20
21 const certPath = _path.default.join(certDirectory, 'primary.crt');
22
23 const cachedKey = (await fs.exists(privateKeyPath)) && (await fs.readFile(privateKeyPath));
24 const cachedCert = (await fs.exists(certPath)) && (await fs.readFile(certPath));
25
26 if (cachedKey && cachedCert) {
27 return {
28 key: cachedKey,
29 cert: cachedCert
30 };
31 }
32
33 _logger.default.progress('Generating SSL Certificate...');
34
35 const pki = _nodeForge.default.pki;
36 const keys = pki.rsa.generateKeyPair(2048);
37 const cert = pki.createCertificate();
38 cert.publicKey = keys.publicKey;
39 cert.serialNumber = Date.now().toString();
40 cert.validity.notBefore = new Date();
41 cert.validity.notAfter = new Date();
42 cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1);
43 const attrs = [{
44 name: 'commonName',
45 value: 'parceljs.org'
46 }, {
47 name: 'countryName',
48 value: 'US'
49 }, {
50 shortName: 'ST',
51 value: 'Virginia'
52 }, {
53 name: 'localityName',
54 value: 'Blacksburg'
55 }, {
56 name: 'organizationName',
57 value: 'parcelBundler'
58 }, {
59 shortName: 'OU',
60 value: 'Test'
61 }];
62 cert.setSubject(attrs);
63 cert.setIssuer(attrs);
64 cert.setExtensions([{
65 name: 'basicConstraints',
66 cA: true
67 }, {
68 name: 'keyUsage',
69 keyCertSign: true,
70 digitalSignature: true,
71 nonRepudiation: true,
72 keyEncipherment: true,
73 dataEncipherment: true
74 }, {
75 name: 'extKeyUsage',
76 serverAuth: true,
77 clientAuth: true,
78 codeSigning: true,
79 emailProtection: true,
80 timeStamping: true
81 }, {
82 name: 'nsCertType',
83 client: true,
84 server: true,
85 email: true,
86 objsign: true,
87 sslCA: true,
88 emailCA: true,
89 objCA: true
90 }, {
91 name: 'subjectAltName',
92 altNames: [{
93 type: 6,
94 // URI
95 value: 'http://example.org/webid#me'
96 }, {
97 type: 7,
98 // IP
99 ip: '127.0.0.1'
100 }]
101 }, {
102 name: 'subjectKeyIdentifier'
103 }]);
104 cert.sign(keys.privateKey, _nodeForge.default.md.sha256.create());
105 const privPem = pki.privateKeyToPem(keys.privateKey);
106 const certPem = pki.certificateToPem(cert);
107 await fs.mkdirp(certDirectory);
108 await fs.writeFile(privateKeyPath, privPem);
109 await fs.writeFile(certPath, certPem);
110 return {
111 key: privPem,
112 cert: certPem
113 };
114}
\No newline at end of file