This commit is contained in:
AJ ONeal 2015-12-16 00:13:07 +00:00
parent aec8958ca8
commit 4015e792dd
3 changed files with 222 additions and 218 deletions

View File

@ -23,10 +23,10 @@ leCore.
## API
```
LeCore.registerNewAccount();
```javascript
LeCore.registerNewAccount(options, cb);
LeCore.getCertificate();
LeCore.getCertificate(options, cb);
LeCore.Acme // Signs requests with JWK
acme = new Acme(lePrivateKey) // privateKey format is abstract
@ -35,7 +35,9 @@ LeCore.Acme // Signs requests with JWK
acme.getNonce(url, cb) // (internal) HEAD request to get 'replay-nonce' strings
LeCore.leCrypto
generateSignature(lePrivateKey, nodeBufferBody, nonceString)
thumbprint(lePubKey) // generates thumbprint
generateSignature(lePrivKey, bodyBuf, nonce) // generates a signature
importPemPrivateKey(privateKeyPem); // returns abstract private key
```
For testing and development, you can also inject the dependencies you want to use:

View File

@ -4,16 +4,18 @@
* Some code used from https://github.com/letsencrypt/boulder/tree/master/test/js
* MPL 2.0
*/
'use strict';
var NOOP=function () {}, log=NOOP;
var request=require('request');
var util=require('./acme-util');
var cryptoUtil=require('./crypto-util');
var Acme = require('./acme-client');
module.exports.create = function (deps) {
var NOOP=function () {}, log=NOOP;
var request=require('request');
var util=require('./acme-util');
var importPemPrivateKey = deps.leCrypto.importPemPrivateKey;
var thumbprinter = deps.leCrypto.thumbprint;
var generateCsr = deps.leCrypto.generateCsr || deps.leCrypto.generateCSR;
var Acme = deps.Acme;
function getCert(options, cb) {
function getCert(options, cb) {
var state={
validatedDomains:[]
, validAuthorizationUrls:[]
@ -40,10 +42,10 @@ function getCert(options, cb) {
state.domains = options.domains.slice(0); // copy array
try {
state.accountKeyPem=options.accountPrivateKeyPem;
state.accountKeyPair=cryptoUtil.importPemPrivateKey(state.accountKeyPem);
state.accountKeyPair=importPemPrivateKey(state.accountKeyPem);
state.acme=new Acme(state.accountKeyPair);
state.certPrivateKeyPem=options.domainPrivateKeyPem;
state.certPrivateKey=cryptoUtil.importPemPrivateKey(state.certPrivateKeyPem);
state.certPrivateKey=importPemPrivateKey(state.certPrivateKeyPem);
} catch(err) {
return handleErr(err, 'Failed to parse privateKey');
}
@ -100,7 +102,7 @@ function getCert(options, cb) {
}
challenge=httpChallenges[0];
thumbprint=cryptoUtil.thumbprint(state.accountKeyPair.publicKey);
thumbprint=thumbprinter(state.accountKeyPair.publicKey);
keyAuthorization=challenge.token+'.'+thumbprint;
state.responseUrl=challenge.uri;
@ -152,7 +154,7 @@ function getCert(options, cb) {
}
function getCertificate() {
var csr=cryptoUtil.generateCSR(state.certPrivateKey, state.validatedDomains);
var csr=generateCsr(state.certPrivateKey, state.validatedDomains);
log('Requesting certificate...');
state.acme.post(state.newCertificateUrl, {
resource:'new-cert',
@ -234,13 +236,13 @@ function getCert(options, cb) {
log(text, err, info);
cb(err || new Error(text));
}
}
}
function certBufferToPem(cert) {
function certBufferToPem(cert) {
cert=util.toStandardB64(cert.toString('base64'));
cert=cert.match(/.{1,64}/g).join('\n');
return '-----BEGIN CERTIFICATE-----\n'+cert+'\n-----END CERTIFICATE-----';
}
}
module.exports = getCert;
return getCert;
};

View File

@ -9,7 +9,7 @@ function create(deps) {
var LeCore = {};
LeCore.leCrypto = deps.leCrypto;
LeCore.Acme = require('./lib/acme-client').create(deps);
deps.Acme = LeCore.Acme = require('./lib/acme-client').create(deps);
LeCore.registerNewAccount = require('./lib/register-new-account').create(deps);
LeCore.getCertificate = require('./lib/get-certificate').create(deps);