Comparing version 1.8.6 to 3.0.2
{ | ||
"name": "acme-v2", | ||
"version": "1.8.6", | ||
"description": "A lightweight library for getting Free SSL certifications through Let's Encrypt, using the ACME protocol.", | ||
"homepage": "https://git.coolaj86.com/coolaj86/acme-v2.js", | ||
"main": "index.js", | ||
"version": "3.0.2", | ||
"description": "Free SSL certificates for Node.js and Browsers. Issued via Let's Encrypt", | ||
"homepage": "https://rootprojects.org/acme/", | ||
"main": "acme.js", | ||
"browser": {}, | ||
"files": [ | ||
"compat.js", | ||
"*.js", | ||
"lib", | ||
"scripts" | ||
"bin", | ||
"scripts", | ||
"dist" | ||
], | ||
"scripts": { | ||
"build": "node_xxx bin/bundle.js", | ||
"lint": "jshint lib bin", | ||
"postinstall": "node scripts/postinstall", | ||
"test": "node ./test.js" | ||
"test": "node server.js", | ||
"start": "node server.js" | ||
}, | ||
"repository": { | ||
"type": "git", | ||
"url": "https://git.coolaj86.com/coolaj86/acme-v2.js.git" | ||
"url": "https://git.rootprojects.org/root/acme.js.git" | ||
}, | ||
"keywords": [ | ||
"ACME", | ||
"Let's Encrypt", | ||
"ACME", | ||
"v02", | ||
"v2", | ||
"draft-11", | ||
"draft-12", | ||
"free ssl", | ||
"tls", | ||
"automated https", | ||
"letsencrypt" | ||
"EC", | ||
"RSA", | ||
"CSR", | ||
"browser", | ||
"greenlock", | ||
"VanillaJS", | ||
"ZeroSSL" | ||
], | ||
"author": "AJ ONeal <coolaj86@gmail.com> (https://solderjs.com/)", | ||
"author": "AJ ONeal <coolaj86@gmail.com> (https://coolaj86.com/)", | ||
"license": "MPL-2.0", | ||
"dependencies": { | ||
"@root/request": "^1.3.11", | ||
"rsa-compat": "^2.0.8" | ||
"@root/acme": "^3.0.2" | ||
}, | ||
"devDependencies": { | ||
"dotenv": "^8.0.0" | ||
"@root/csr": "^0.8.1", | ||
"dotenv": "^8.1.0", | ||
"punycode": "^1.4.1" | ||
}, | ||
"trulyOptionalDependencies": { | ||
"eslint": "^6.5.1", | ||
"webpack": "^4.41.0", | ||
"webpack-cli": "^3.3.9" | ||
} | ||
} |
512
README.md
@@ -1,239 +0,407 @@ | ||
# ACME.js v3 on its way (Nov 1st, 2019) | ||
# Let's Encrypt™ + JavaScript = [ACME.js](https://git.rootprojects.org/root/acme.js) | ||
ACME.js v3 is in private beta and will be available by Nov 1st. | ||
| Built by [Root](https://therootcompany.com) for [Hub](https://rootprojects.org/hub) | ||
Follow the updates on the [campaign page](https://indiegogo.com/at/greenlock), | ||
and contribute to support the project and get beta access now. | ||
ACME.js is a _low-level_ client for Let's Encrypt. | ||
| **acme-v2.js** ([npm](https://www.npmjs.com/package/acme-v2)) | ||
| [acme-v2-cli.js](https://git.coolaj86.com/coolaj86/acme-v2-cli.js) | ||
| [greenlock.js](https://git.coolaj86.com/coolaj86/greenlock.js) | ||
| [goldilocks.js](https://git.coolaj86.com/coolaj86/goldilocks.js) | ||
Looking for an **easy**, _high-level_ client? Check out [Greenlock.js](https://git.rootprojects.org/root/greenlock.js). | ||
# [acme-v2.js](https://git.coolaj86.com/coolaj86/acme-v2.js) | a [Root](https://therootcompany.com) project | ||
# Online Demo | ||
A **Zero (External) Dependency**\* library for building | ||
Let's Encrypt v2 (ACME draft 18) clients and getting Free SSL certificates. | ||
See https://greenlock.domains | ||
The primary goal of this library is to make it easy to | ||
get Accounts and Certificates through Let's Encrypt. | ||
<!-- | ||
We expect that our hosted versions will meet all of yours needs. | ||
If they don't, please open an issue to let us know why. | ||
We'd much rather improve the app than have a hundred different versions running in the wild. | ||
However, in keeping to our values we've made the source visible for others to inspect, improve, and modify. | ||
--> | ||
# Features | ||
- [x] Let's Encrypt™ v2 / ACME Draft 12 | ||
- [ ] (in-progress) Let's Encrypt™ v2.1 / ACME Draft 18 | ||
- [ ] (in-progress) StartTLS Everywhere™ | ||
- [x] Works with any [generic ACME challenge handler](https://git.rootprojects.org/root/acme-challenge-test.js) | ||
- [x] **http-01** for single or multiple domains per certificate | ||
- [x] **dns-01** for wildcards, localhost, private networks, etc | ||
- [x] VanillaJS | ||
- [x] Zero External Dependencies | ||
- [x] Safe, Efficient, Maintained | ||
- [x] Works in Node v6+ | ||
- [ ] (v2) Works in Web Browsers (See [Demo](https://greenlock.domains)) | ||
| 15k gzipped | 55k minified | 88k (2,500 loc) source with comments | | ||
\* <small>The only required dependencies were built by us, specifically for this and related libraries. | ||
There are some, truly optional, backwards-compatibility dependencies for node v6.</small> | ||
Supports the latest (Nov 2019) release of Let's Encrypt in a small, lightweight, Vanilla JS package. | ||
## Looking for Quick 'n' Easy™? | ||
- [x] Let's Encrypt v2 | ||
- [x] ACME RFC 8555 | ||
- [x] November 2019 | ||
- [x] POST-as-GET | ||
- [ ] StartTLS Everywhere™ (in-progress) | ||
- [x] IDN (i.e. `.中国`) | ||
- [x] ECDSA and RSA keypairs | ||
- [x] JWK | ||
- [x] PEM | ||
- [x] DER | ||
- [x] Native Crypto in Node.js | ||
- [x] WebCrypto in Browsers | ||
- [x] Domain Validation Plugins | ||
- [x] tls-alpn-01 | ||
- [x] http-01 | ||
- [x] dns-01 | ||
- [x] **Wildcards** | ||
- [x] **Localhost** | ||
- [x] Private Networks | ||
- [x] [Create your own](https://git.rootprojects.org/root/acme-challenge-test.js) | ||
- [x] Vanilla JS\* | ||
- [x] No Transpiling Necessary! | ||
- [x] Node.js | ||
- [x] Browsers | ||
- [x] WebPack | ||
- [x] Zero External Dependencies | ||
- [x] Commercial Support | ||
- [x] Safe, Efficient, Maintained | ||
If you want something that's more "batteries included" give | ||
[greenlock.js](https://git.coolaj86.com/coolaj86/greenlock.js) | ||
a try. | ||
\* Although we use `async/await` in the examples, | ||
the codebase is written entirely in Common JS. | ||
- [greenlock.js](https://git.coolaj86.com/coolaj86/greenlock.js) | ||
# Use Cases | ||
## v1.7+: Transitional v2 Support | ||
- Home Servers | ||
- IoT | ||
- Enterprise On-Prem | ||
- Web Hosting | ||
- Cloud Services | ||
- Localhost Development | ||
By the end of June 2019 we expect to have completed the migration to Let's Encrypt v2.1 (ACME draft 18). | ||
# API | ||
Although the draft 18 changes themselves don't requiring breaking the API, | ||
we've been keeping backwards compatibility for a long time and the API has become messy. | ||
The public API encapsulates the three high-level steps of the ACME protocol: | ||
We're taking this **mandatory ACME update** as an opportunity to **clean up** and **greatly simplify** | ||
the code with a fresh new release. | ||
1. API Discovery | ||
2. Account Creation | ||
- Subscriber Agreement | ||
3. Certificate Issuance | ||
- Certificate Request | ||
- Authorization Challenges | ||
- Challenge Presentation | ||
- Certificate Redemption | ||
As of **v1.7** we started adding **transitional support** for the **next major version**, v2.0 of acme-v2.js. | ||
We've been really good about backwards compatibility for | ||
## Overview | ||
## Recommended Example | ||
The core API can be show in just four functions: | ||
Due to the upcoming changes we've removed the old documentation. | ||
```js | ||
ACME.create({ maintainerEmail, packageAgent, notify }); | ||
acme.init(directoryUrl); | ||
acme.accounts.create({ subscriberEmail, agreeToTerms, accountKey }); | ||
acme.certificates.create({ | ||
customerEmail, // do not use | ||
account, | ||
accountKey, | ||
csr, | ||
domains, | ||
challenges | ||
}); | ||
``` | ||
Instead we recommend that you take a look at the | ||
[Digital Ocean DNS-01 Example](https://git.rootprojects.org/root/acme-v2.js/src/branch/master/examples/dns-01-digitalocean.js) | ||
Helper Functions | ||
- [examples/dns-01-digitalocean.js](https://git.rootprojects.org/root/acme-v2.js/src/branch/master/examples/dns-01-digitalocean.js) | ||
```js | ||
ACME.computeChallenge({ | ||
accountKey, | ||
hostname: 'example.com', | ||
challenge: { type: 'dns-01', token: 'xxxx' } | ||
}); | ||
``` | ||
That's not exactly the new API, but it's close. | ||
| Parameter | Description | | ||
| ------------------ | ----------------------------------------------------------------------------------------------------------- | | ||
| account | an object containing the Let's Encrypt Account ID as "kid" (misnomer, not actually a key id/thumbprint) | | ||
| accountKey | an RSA or EC public/private keypair in JWK format | | ||
| agreeToTerms | set to `true` to agree to the Let's Encrypt Subscriber Agreement | | ||
| challenges | the 'http-01', 'alpn-01', and/or 'dns-01' challenge plugins (`get`, `set`, and `remove` callbacks) to use | | ||
| csr | a Certificate Signing Request (CSR), which may be generated with `@root/csr`, openssl, or another | | ||
| customerEmail | Don't use this. Given as an example to differentiate between Maintainer, Subscriber, and End-User | | ||
| directoryUrl | should be the Let's Encrypt Directory URL<br>`https://acme-staging-v02.api.letsencrypt.org/directory` | | ||
| domains | the list of altnames (subject first) that are listed in the CSR and will be listed on the certificate | | ||
| maintainerEmail | should be a contact for the author of the code to receive critical bug and security notices | | ||
| notify | all callback for logging events and errors in the form `function (ev, args) { ... }` | | ||
| packageAgent | should be an RFC72321-style user-agent string to append to the ACME client (ex: mypackage/v1.1.1) | | ||
| skipChallengeTests | do not do a self-check that the ACME-issued challenges will pass (not recommended) | | ||
| skipDryRun: false | do not do a self-check with self-issued challenges (not recommended) | | ||
| subscriberEmail | should be a contact for the service provider to receive renewal failure notices and manage the ACME account | | ||
## Let's Encrypt v02 Directory URLs | ||
**Maintainer vs Subscriber vs Customer** | ||
- `maintainerEmail` should be the email address of the **author of the code**. | ||
This person will receive critical security and API change notifications. | ||
- `subscriberEmail` should be the email of the **admin of the hosting service**. | ||
This person agrees to the Let's Encrypt Terms of Service and will be notified | ||
when a certificate fails to renew. | ||
- `customerEmail` should be the email of individual who owns the domain. | ||
This is optional (not currently implemented). | ||
Generally speaking **YOU** are the _maintainer_ and you **or your employer** is the _subscriber_. | ||
If you (or your employer) is running any type of service | ||
you **SHOULD NOT** pass the _customer_ email as the subscriber email. | ||
If you are not running a service (you may be building a CLI, for example), | ||
then you should prompt the user for their email address, and they are the subscriber. | ||
## Events | ||
These `notify` events are intended for _logging_ and debugging, NOT as a data API. | ||
| Event Name | Example Message | | ||
| -------------------- | --------------------------------------------------------------------------------- | | ||
| `certificate_order` | `{ subject: 'example.com', altnames: ['...'], account: { key: { kid: '...' } } }` | | ||
| `challenge_select` | `{ altname: '*.example.com', type: 'dns-01' }` | | ||
| `challenge_status` | `{ altname: '*.example.com', type: 'dns-01', status: 'pending' }` | | ||
| `challenge_remove` | `{ altname: '*.example.com', type: 'dns-01' }` | | ||
| `certificate_status` | `{ subject: 'example.com', status: 'valid' }` | | ||
| `warning` | `{ message: 'what went wrong', description: 'what action to take about it' }` | | ||
| `error` | `{ message: 'a background process failed, and it may have side-effects' }` | | ||
Note: DO NOT rely on **undocumented properties**. They are experimental and **will break**. | ||
If you have a use case for a particular property **open an issue** - we can lock it down and document it. | ||
# Example | ||
A basic example includes the following: | ||
1. Initialization | ||
- maintainer contact | ||
- package user-agent | ||
- log events | ||
2. Discover API | ||
- retrieves Terms of Service and API endpoints | ||
3. Get Subscriber Account | ||
- create an ECDSA (or RSA) Account key in JWK format | ||
- agree to terms | ||
- register account by the key | ||
4. Prepare a Certificate Signing Request | ||
- create a RSA (or ECDSA) Server key in PEM format | ||
- select domains | ||
- choose challenges | ||
- sign CSR | ||
- order certificate | ||
See [examples/README.md](https://git.rootprojects.org/root/acme.js/src/branch/master/examples/README.md) | ||
# Install | ||
To make it easy to generate, encode, and decode keys and certificates, | ||
ACME.js uses [Keypairs.js](https://git.rootprojects.org/root/keypairs.js) | ||
and [CSR.js](https://git.rootprojects.org/root/csr.js) | ||
<detail> | ||
<summary>Node.js</summary> | ||
```js | ||
npm install --save acme | ||
``` | ||
# Production URL | ||
https://acme-v02.api.letsencrypt.org/directory | ||
```js | ||
var ACME = require('acme'); | ||
``` | ||
</detail> | ||
<detail> | ||
<summary>WebPack</summary> | ||
```html | ||
<meta charset="UTF-8" /> | ||
``` | ||
# Staging URL | ||
https://acme-staging-v02.api.letsencrypt.org/directory | ||
(necessary in case the webserver headers don't specify `plain/text; charset="UTF-8"`) | ||
```js | ||
var ACME = require('acme'); | ||
``` | ||
<!-- | ||
## How to build ACME clients | ||
</detail> | ||
As this is intended to build ACME clients, there is not a simple 2-line example | ||
(and if you want that, see [greenlock-express.js](https://git.coolaj86.com/coolaj86/greenlock-express.js)). | ||
<detail> | ||
<summary>Vanilla JS</summary> | ||
I'd recommend first running the example CLI client with a test domain and then investigating the files used for that example: | ||
```html | ||
<meta charset="UTF-8" /> | ||
``` | ||
```bash | ||
node examples/cli.js | ||
(necessary in case the webserver headers don't specify `plain/text; charset="UTF-8"`) | ||
```html | ||
<script src="https://unpkg.com/@root/acme@3.0.0/dist/acme.all.js"></script> | ||
``` | ||
The example cli has the following prompts: | ||
`acme.min.js` | ||
```html | ||
<script src="https://unpkg.com/@root/acme@3.0.0/dist/acme.all.min.js"></script> | ||
``` | ||
What web address(es) would you like to get certificates for? (ex: example.com,*.example.com) | ||
What challenge will you be testing today? http-01 or dns-01? [http-01] | ||
What email should we use? (optional) | ||
What API style would you like to test? v1-compat or promise? [v1-compat] | ||
Put the string 'mBfh0SqaAV3MOK3B6cAhCbIReAyDuwuxlO1Sl70x6bM.VNAzCR4THe4czVzo9piNn73B1ZXRLaB2CESwJfKkvRM' into a file at 'example.com/.well-known/acme-challenge/mBfh0SqaAV3MOK3B6cAhCbIReAyDuwuxlO1Sl70x6bM' | ||
Use | ||
echo 'mBfh0SqaAV3MOK3B6cAhCbIReAyDuwuxlO1Sl70x6bM.VNAzCR4THe4czVzo9piNn73B1ZXRLaB2CESwJfKkvRM' > 'example.com/.well-known/acme-challenge/mBfh0SqaAV3MOK3B6cAhCbIReAyDuwuxlO1Sl70x6bM' | ||
```js | ||
var ACME = window['@root/acme']; | ||
``` | ||
Then hit the 'any' key to continue... | ||
</detail> | ||
# Challenge Callbacks | ||
The challenge callbacks are documented in the [test suite](https://git.rootprojects.org/root/acme-dns-01-test.js), | ||
essentially: | ||
```js | ||
function create(options) { | ||
var plugin = { | ||
init: async function(deps) { | ||
// for http requests | ||
plugin.request = deps.request; | ||
}, | ||
zones: async function(args) { | ||
// list zones relevant to the altnames | ||
}, | ||
set: async function(args) { | ||
// set TXT record | ||
}, | ||
get: async function(args) { | ||
// get TXT records | ||
}, | ||
remove: async function(args) { | ||
// remove TXT record | ||
}, | ||
// how long to wait after *all* TXT records are set | ||
// before presenting them for validation | ||
propagationDelay: 5000 | ||
}; | ||
return plugin; | ||
} | ||
``` | ||
When you've completed the challenge you can hit a key to continue the process. | ||
The `http-01` plugin is similar, but without `zones` or `propagationDelay`. | ||
If you place the certificate you receive back in `tests/fullchain.pem` | ||
you can then test it with `examples/https-server.js`. | ||
Many challenge plugins are already available for popular platforms. | ||
Search `acme-http-01-` or `acme-dns-01-` on npm to find more. | ||
| Type | Service | Plugin | | ||
| ----------- | ----------------------------------------------------------------------------------- | ------------------------ | | ||
| dns-01 | CloudFlare | acme-dns-01-cloudflare | | ||
| dns-01 | [Digital Ocean](https://git.rootprojects.org/root/acme-dns-01-digitalocean.js) | acme-dns-01-digitalocean | | ||
| dns-01 | [DNSimple](https://git.rootprojects.org/root/acme-dns-01-dnsimple.js) | acme-dns-01-dnsimple | | ||
| dns-01 | [DuckDNS](https://git.rootprojects.org/root/acme-dns-01-duckdns.js) | acme-dns-01-duckdns | | ||
| http-01 | File System / [Web Root](https://git.rootprojects.org/root/acme-http-01-webroot.js) | acme-http-01-webroot | | ||
| dns-01 | [GoDaddy](https://git.rootprojects.org/root/acme-dns-01-godaddy.js) | acme-dns-01-godaddy | | ||
| dns-01 | [Gandi](https://git.rootprojects.org/root/acme-dns-01-gandi.js) | acme-dns-01-gandi | | ||
| dns-01 | [NameCheap](https://git.rootprojects.org/root/acme-dns-01-namecheap.js) | acme-dns-01-namecheap | | ||
| dns-01 | [Name.com](https://git.rootprojects.org/root/acme-dns-01-namedotcom.js) | acme-dns-01-namedotcom | | ||
| dns-01 | Route53 (AWS) | acme-dns-01-route53 | | ||
| http-01 | S3 (AWS, Digital Ocean, Scaleway) | acme-http-01-s3 | | ||
| dns-01 | [Vultr](https://git.rootprojects.org/root/acme-dns-01-vultr.js) | acme-dns-01-vultr | | ||
| dns-01 | [Build your own](https://git.rootprojects.org/root/acme-dns-01-test.js) | acme-dns-01-test | | ||
| http-01 | [Build your own](https://git.rootprojects.org/root/acme-http-01-test.js) | acme-http-01-test | | ||
| tls-alpn-01 | [Contact us](mailto:support@therootcompany.com) | - | | ||
# Running the Tests | ||
```bash | ||
npm test | ||
``` | ||
examples/cli.js | ||
examples/genkeypair.js | ||
tests/compat.js | ||
examples/https-server.js | ||
examples/http-server.js | ||
## Usa a dns-01 challenge | ||
Although you can run the tests from a public facing server, its easiest to do so using a dns-01 challenge. | ||
You will need to use one of the [`acme-dns-01-*` plugins](https://www.npmjs.com/search?q=acme-dns-01-) | ||
to run the test locally. | ||
```bash | ||
ENV=DEV | ||
MAINTAINER_EMAIL=letsencrypt+staging@example.com | ||
SUBSCRIBER_EMAIL=letsencrypt+staging@example.com | ||
BASE_DOMAIN=test.example.com | ||
CHALLENGE_TYPE=dns-01 | ||
CHALLENGE_PLUGIN=acme-dns-01-digitalocean | ||
CHALLENGE_OPTIONS='{"token":"xxxxxxxxxxxx"}' | ||
``` | ||
--> | ||
### For Example | ||
## API | ||
```bash | ||
# Get the repo and change directories into it | ||
git clone https://git.rootprojects.org/root/acme.js | ||
pushd acme.js/ | ||
Status: Small, but breaking changes coming in v2 | ||
# Install the challenge plugin you'll use for the tests | ||
npm install --save-dev acme-dns-01-digitalocean | ||
``` | ||
This API is a simple evolution of le-acme-core, | ||
but tries to provide a better mapping to the new draft 11 APIs. | ||
## Create a `.env` config | ||
```js | ||
var ACME = require('acme-v2').ACME.create({ | ||
// used for overriding the default user-agent | ||
userAgent: 'My custom UA String', | ||
getUserAgentString: function(deps) { | ||
return 'My custom UA String'; | ||
}, | ||
You'll need a `.env` in the project root that looks something like the one in `examples/example.env`: | ||
// don't try to validate challenges locally | ||
skipChallengeTest: false, | ||
skipDryRun: false, | ||
```bash | ||
# Copy the sample .env file | ||
rsync -av examples/example.env .env | ||
// ask if the certificate can be issued up to 10 times before failing | ||
retryPoll: 8, | ||
// ask if the certificate has been validated up to 6 times before cancelling | ||
retryPending: 4, | ||
// Wait 1000ms between retries | ||
retryInterval: 1000, | ||
// Wait 10,000ms after deauthorizing a challenge before retrying | ||
deauthWait: 10 * 1000 | ||
}); | ||
# Edit the config file to use a domain in your account, and your API token | ||
#vim .env | ||
code .env | ||
// Discover Directory URLs | ||
ACME.init(acmeDirectoryUrl); // returns Promise<acmeUrls={keyChange,meta,newAccount,newNonce,newOrder,revokeCert}> | ||
# Run the tests | ||
node tests/index.js | ||
``` | ||
// Accounts | ||
ACME.accounts.create(options); // returns Promise<regr> registration data | ||
# Contributions | ||
options = { | ||
email: '<email>', // valid email (server checks MX records) | ||
accountKeypair: { | ||
// privateKeyPem or privateKeyJwt | ||
privateKeyPem: '<ASCII PEM>' | ||
}, | ||
agreeToTerms: function(tosUrl) {} // should Promise the same `tosUrl` back | ||
}; | ||
Did this project save you some time? Maybe make your day? Even save the day? | ||
// Registration | ||
ACME.certificates.create(options); // returns Promise<pems={ privkey (key), cert, chain (ca) }> | ||
Please say "thanks" via Paypal or Patreon: | ||
options = { | ||
domainKeypair: { | ||
privateKeyPem: '<ASCII PEM>' | ||
}, | ||
accountKeypair: { | ||
privateKeyPem: '<ASCII PEM>' | ||
}, | ||
domains: ['example.com'], | ||
- Paypal: [\$5](https://paypal.me/rootprojects/5) | [\$10](https://paypal.me/rootprojects/10) | Any amount: <paypal@therootcompany.com> | ||
- Patreon: <https://patreon.com/rootprojects> | ||
getZones: function(opts) {}, // should Promise an array of domain zone names | ||
setChallenge: function(opts) {}, // should Promise the record id, or name | ||
removeChallenge: function(opts) {} // should Promise null | ||
}; | ||
``` | ||
Where does your contribution go? | ||
# Changelog | ||
[Root](https://therootcompany.com) is a collection of experts | ||
who trust each other and enjoy working together on deep-tech, | ||
Indie Web projects. | ||
- v1.8 | ||
- more transitional prepwork for new v2 API | ||
- support newer (simpler) dns-01 and http-01 libraries | ||
- v1.5 | ||
- perform full test challenge first (even before nonce) | ||
- v1.3 | ||
- Use node RSA keygen by default | ||
- No non-optional external deps! | ||
- v1.2 | ||
- fix some API out-of-specness | ||
- doc some magic numbers (status) | ||
- updated deps | ||
- v1.1.0 | ||
- reduce dependencies (use lightweight @coolaj86/request instead of request) | ||
- v1.0.5 - cleanup logging | ||
- v1.0.4 - v6- compat use `promisify` from node's util or bluebird | ||
- v1.0.3 - documentation cleanup | ||
- v1.0.2 | ||
- use `options.contact` to provide raw contact array | ||
- made `options.email` optional | ||
- file cleanup | ||
- v1.0.1 | ||
- Compat API is ready for use | ||
- Eliminate debug logging | ||
- Apr 10, 2018 - tested backwards-compatibility using greenlock.js | ||
- Apr 5, 2018 - export http and dns challenge tests | ||
- Apr 5, 2018 - test http and dns challenges (success and failure) | ||
- Apr 5, 2018 - test subdomains and its wildcard | ||
- Apr 5, 2018 - test two subdomains | ||
- Apr 5, 2018 - test wildcard | ||
- Apr 5, 2018 - completely match api for acme v1 (le-acme-core.js) | ||
- Mar 21, 2018 - _mostly_ matches le-acme-core.js API | ||
- Mar 21, 2018 - can now accept values (not hard coded) | ||
- Mar 20, 2018 - SUCCESS - got a test certificate (hard-coded) | ||
- Mar 20, 2018 - download certificate | ||
- Mar 20, 2018 - poll for status | ||
- Mar 20, 2018 - finalize order (submit csr) | ||
- Mar 20, 2018 - generate domain keypair | ||
- Mar 20, 2018 - respond to challenges | ||
- Mar 16, 2018 - get challenges | ||
- Mar 16, 2018 - new order | ||
- Mar 15, 2018 - create account | ||
- Mar 15, 2018 - generate account keypair | ||
- Mar 15, 2018 - get nonce | ||
- Mar 15, 2018 - get directory | ||
Our goal is to operate as a sustainable community. | ||
# Legal | ||
Your contributions - both in code and _especially_ monetarily - | ||
help to not just this project, but also our broader work | ||
of [projects](https://rootprojects.org) that fuel the **Indie Web**. | ||
[acme-v2.js](https://git.coolaj86.com/coolaj86/acme-v2.js) | | ||
Also, we chat on [Keybase](https://keybase.io) | ||
in [#rootprojects](https://keybase.io/team/rootprojects) | ||
# Commercial Support | ||
Do you need... | ||
- more features? | ||
- bugfixes, on _your_ timeline? | ||
- custom code, built by experts? | ||
- commercial support and licensing? | ||
You're welcome to [contact us](mailto:aj@therootcompany.com) in regards to IoT, On-Prem, | ||
Enterprise, and Internal installations, integrations, and deployments. | ||
We have both commercial support and commercial licensing available. | ||
We also offer consulting for all-things-ACME and Let's Encrypt. | ||
# Legal & Rules of the Road | ||
ACME.jsk™ is a [trademark](https://rootprojects.org/legal/#trademark) of AJ ONeal | ||
The rule of thumb is "attribute, but don't confuse". For example: | ||
> Built with [ACME.js](https://git.rootprojects.org/root/acme.js) (a [Root](https://rootprojects.org) project). | ||
Please [contact us](mailto:aj@therootcompany.com) if have any questions in regards to our trademark, | ||
attribution, and/or visible source policies. We want to build great software and a great community. | ||
[ACME.js](https://git.rootprojects.org/root/acme.js) | | ||
MPL-2.0 | | ||
[Terms of Use](https://therootcompany.com/legal/#terms) | | ||
[Privacy Policy](https://therootcompany.com/legal/#privacy) |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Trivial Package
Supply chain riskPackages less than 10 lines of code are easily copied into your own project and may not warrant the additional supply chain risk of an external dependency.
Found 1 instance in 1 package
No website
QualityPackage does not have a website.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
1
408
32799
3
4
3
1
2
+ Added@root/acme@^3.0.2
+ Added@root/acme@3.1.0(transitive)
+ Added@root/asn1@1.0.2(transitive)
+ Added@root/csr@0.8.1(transitive)
+ Added@root/encoding@1.0.1(transitive)
+ Added@root/keypairs@0.10.3(transitive)
+ Added@root/pem@1.0.4(transitive)
+ Added@root/x509@0.7.2(transitive)
+ Added@types/root__asn1@1.0.5(transitive)
- Removed@root/request@^1.3.11
- Removedrsa-compat@^2.0.8
- Removedeckles@1.4.1(transitive)
- Removedkeypairs@1.2.14(transitive)
- Removedrasha@1.2.5(transitive)
- Removedrsa-compat@2.0.8(transitive)