main
ts 40 lines 1.43 KB
Raw
1 import { apiAssertTypes } from './misc'
2 import { ApiHandlers } from './apiMiddleware'
3 import { writeFile } from 'fs/promises'
4 import { pki } from 'node-forge'
5 import { setConfig } from './config'
6
7 export default {
8
9 async make_self_signed_cert({ attributes, fileName }: { fileName?: string, attributes?: Record<string, string> }) {
10 apiAssertTypes({
11 object_undefined: { attributes },
12 string_undefined: { fileName },
13 })
14
15 const keys = pki.rsa.generateKeyPair(2048)
16 const cert = pki.createCertificate()
17 cert.publicKey = keys.publicKey
18 cert.serialNumber = '01'
19 cert.validity.notBefore = new Date()
20 cert.validity.notAfter = new Date()
21 cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1)
22
23 const attrs = Object.entries(attributes || {}).map(x => ({ name: x[0], value: x[1] }))
24 cert.setSubject(attrs)
25 cert.setIssuer(attrs)
26 cert.sign(keys.privateKey)
27 const ret = {
28 cert: pki.certificateToPem(cert),
29 private_key: pki.privateKeyToPem(keys.privateKey),
30 }
31 if (!fileName)
32 return ret
33 const configs = { cert: fileName + '.cer', private_key: fileName + '.key' }
34 await writeFile(configs.private_key, ret.private_key)
35 await writeFile(configs.cert, ret.cert)
36 await setConfig(configs)
37 return configs
38 }
39
40 } satisfies ApiHandlers