https://github.com/clshortfuse/acmejs
Zero-dependency ACME Client
https://github.com/clshortfuse/acmejs
acme deno js letsencrypt nodejs web zero-dependency
Last synced: 8 months ago
JSON representation
Zero-dependency ACME Client
- Host: GitHub
- URL: https://github.com/clshortfuse/acmejs
- Owner: clshortfuse
- Created: 2023-02-27T03:39:35.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2024-10-17T16:04:10.000Z (over 1 year ago)
- Last Synced: 2024-10-19T23:34:20.670Z (over 1 year ago)
- Topics: acme, deno, js, letsencrypt, nodejs, web, zero-dependency
- Language: JavaScript
- Homepage:
- Size: 105 KB
- Stars: 4
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# acmejs
Zero-dependency ACME Client
# Compatiblity
Uses:
| Feature | Chrome | Firefox | Safari | NodeJS | Deno |
| -------------------------------------------------------------------------------------------------- | -----: | ------: | -----: | -----: | ---: |
| [SubtleCrypto](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto) | 37 | 34 | 11 | 15.0.0 | 1.17 |
| [Fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch) | 42 | 39 | 10.1 | 18.0.0 | 1.0 |
| [EventTarget](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/EventTarget)* | 64 | 59 | 14 | 15.0.0 | 1.0 |
| [BigInt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt)† | 67 | 68 | 14 | 10.4.0 | 1.0 |
| | | | | | |
| Supported | 67 | 68 | 14 | 18.0.0 | 1.17 |
*Used by helper functions
†Used by helper ASN1 operations
Notes:
* Compatibility may be extended via polyfills (not included)
* Deno does not support ECDSA P-521
# Libraries
* [ACMEClient](./lib/ACMEAgent.js)
* [JOSE Functions](./lib/jose.js)
* [JWA Functions](./lib/jwa.js)
* [JWE Functions](./lib/jwe.js) (incomplete)
* [JWK Functions](./lib/jwk.js)
* [JWS Functions](./lib/jws.js)
* [KeyStore](./lib/KeyStore.js)
# Helpers
* [JWK Import Functions](./helpers/jwkImporter.js)
* [name.com DNS API](./lib/nameDotCom.js)
* [Quick Certificate Order](./lib/quickOrder.js)
# Utilities
* [ASN1 Encoder/Decoder](./utils/asn1.js)
* [Base64 Encoder/Decoder](./utils/base64.js)
* [Bit Functions](./utils/bit.js)
* [SubtleCrypto Wrapper](./utils/crypto.js)
* [DNS Resolver](./utils/dns.js)
* [PKCS1, PKCS8, PKCS10, SPKI, EC, PEM Functions](./utils/certificate.js)
* [UTF-8 Decoder](./utils/utf8.js)
# Usage
# Quick Order with name.com (defaults to Lets Encrypt ACME);
````js
import { buildEventTarget } from '@shortfuse/acmejs/helpers/nameDotCom.js';
import { getWildcardCertificate } from '@shortfuse/acmejs/helpers/quickOrder.js';
// as JWK
const ACCOUNT_PRIVATE_KEY = {
alg: 'ES256',
kty: 'EC',
crv: 'P-256',
x: 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
y: 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
d: 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
};
// as PEM
const CSR_PRIVATE_KEY = `
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDD0tPV/du2vftjvXj1t/gXTK39
sNBVrOAEb/jKzXae+Xa0H+3LhZaQIQNMfACiBSgIfZUvEGb+7TqXWQpoLoFR/R7MvGWcSk98JyrV
tveD8ZmZYyItSY7m2hcasqAFiKyOouV5vzyRe87/lEyzzBpF3bQQ4IDaQu+K9Hj5fKuU6rrOeOhs
dnJc+VdDQLScHxvMoLZ9Vtt+oK9J4/tOLwr4CG8khDlBURcBY6gPcLo3dPU09SW+6ctX2cX4mkXx
6O/0mmdTmacr/vu50KdRMleFeZYOWPAEhhMfywybTuzBiPVIZVP8WFCSKNMbfi1S9A9PdBqnebww
HhX3/hsEBt2BAgMBAAECggEABEI1P6nf6Zs7mJlyBDv+Pfl5rjL2cOqLy6TovvZVblMkCPpJyFuN
IPDK2tK2i897ZaXfhPDBIKmllM2Hq6jZQKB110OAnTPDg0JxzMiIHPs32S1d/KilHjGff4Hjd4NX
p1l1Dp8BUPOllorR2TYm2x6dcCGFw9lhTr8O03Qp4hjn84VjGIWADYCk83mgS4nRsnHkdiqYnWx1
AjKlY51yEK6RcrDMi0Th2RXrrINoC35sVv+APt2rkoMGi52RwTEseA1KZGFrxjq61ReJif6p2VXE
cvHeX6CWLx014LGk43z6Q28P6HgeEVEfIjyqCUea5Du/mYb/QsRSCosXLxBqwQKBgQD1+fdC9ZiM
rVI+km7Nx2CKBn8rJrDmUh5SbXn2MYJdrUd8bYNnZkCgKMgxVXsvJrbmVOrby2txOiqudZkk5mD3
E5O/QZWPWQLgRu8ueYNpobAX9NRgNfZ7rZD+81vh5MfZiXfuZOuzv29iZhU0oqyZ9y75eHkLdrer
NkwYOe5aUQKBgQDLzapDi1NxkBgsj9iiO4KUa7jvD4JjRqFy4Zhj/jbQvlvM0F/uFp7sxVcHGx4r
11C+6iCbhX4u+Zuu0HGjT4d+hNXmgGyxR8fIUVxOlOtDkVJa5sOBZK73/9/MBeKusdmJPRhalZQf
MUJRWIoEVDMhfg3tW/rBj5RYAtP2dTVUMQKBgDs8yr52dRmT+BWXoFWwaWB0NhYHSFz/c8v4D4Ip
5DJ5M5kUqquxJWksySGQa40sbqnD05fBQovPLU48hfgr/zghn9hUjBcsoZOvoZR4sRw0UztBvA+7
jzOz1hKAOyWIulR6Vca0yUrNlJ6G5R56+sRNkiOETupi2dLCzcqb0PoxAoGAZyNHvTLvIZN4iGSr
jz5qkM4LIwBIThFadxbv1fq6pt0O/BGf2o+cEdq0diYlGK64cEVwBwSBnSg4vzlBqRIAUejLjwED
AJyA4EE8Y5A9l04dzV7nJb5cRak6CrgXxay/mBJRFtaHxVlaZGxYPGSYE6UFS0+3EOmmevvDZQBf
4qECgYEA0ZF6Vavz28+8wLO6SP3w8NmpHk7K9tGEvUfQ30SgDx4G7qPIgfPrbB4OP/E0qCfsIImi
3sCPpjvUMQdVVZyPOIMuB+rV3ZOxkrzxEUOrpOpR48FZbL7RN90yRQsAsrp9e4iv8QwB3VxLe7X0
TDqqnRyqrc/osGzuS2ZcHOKmCU8=
-----END PRIVATE KEY-----
`;
const NAME_DOT_COM_USERNAME = 'foo';
const NAME_DOT_COM_TOKEN = 'bar';
const certificate = await getWildcardCertificate({
tosAgreed: true,
domain: 'foo.com',
accountKey: ACCOUNT_PRIVATE_KEY,
email: 'admin@foo.com',
eventTarget: buildEventTarget(NAME_DOT_COM_USERNAME, NAME_DOT_COM_TOKEN),
countryName: 'US',
localityName: 'New York',
organizationName: 'Foo Products',
organizationalUnitName: 'IT',
stateOrProvinceName: 'NY',
csrKey: CSR_PRIVATE_KEY,
},
});
await store('foo-com.crt', certificate);
````
See [quickOrder.js](./helpers/quickOrder.js) source code for a working example.