reverse engineering the python client
This commit is contained in:
parent
ef9dfe4107
commit
3d42c8450f
|
@ -0,0 +1,80 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var fs = require('fs');
|
||||||
|
var crypto = require('crypto');
|
||||||
|
var ursa = require('ursa');
|
||||||
|
|
||||||
|
// Here are all the places you can discover the account id:
|
||||||
|
//
|
||||||
|
// letsencrypt/account.py
|
||||||
|
//
|
||||||
|
// /etc/letsencrypt/accounts/{{ server }}/directory/{{ accountId }}/private_key.json
|
||||||
|
// /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/f4c33502df3789849f617944253b35ae/private_key.json
|
||||||
|
//
|
||||||
|
// /etc/letsencrypt/renewal/{{ hostname }}.conf
|
||||||
|
// /etc/letsencrypt/renewal/example.com.conf
|
||||||
|
//
|
||||||
|
// Note: each domain has its own private key
|
||||||
|
|
||||||
|
function fromPrivateKeyUrsa(priv, cb) {
|
||||||
|
var pub = priv.toPublicPem();
|
||||||
|
var accountId = crypto.createHash('md5').update(pub).digest('hex');
|
||||||
|
|
||||||
|
cb(null, accountId);
|
||||||
|
}
|
||||||
|
|
||||||
|
function fromAccountPrivateKey(pkj, cb) {
|
||||||
|
Object.keys(pkj).forEach(function (key) {
|
||||||
|
pkj[key] = new Buffer(pkj[key], 'base64');
|
||||||
|
});
|
||||||
|
|
||||||
|
var priv = ursa.createPrivateKeyFromComponents(
|
||||||
|
pkj.n // modulus
|
||||||
|
, pkj.e // exponent
|
||||||
|
, pkj.p
|
||||||
|
, pkj.q
|
||||||
|
, pkj.dp
|
||||||
|
, pkj.dq
|
||||||
|
, pkj.qi
|
||||||
|
, pkj.d
|
||||||
|
);
|
||||||
|
|
||||||
|
fromPrivateKeyUrsa(priv, cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
function fromAccountPrivateKeyFile(privateKeyPath, cb) {
|
||||||
|
// Read ACME account key
|
||||||
|
fs.readFile(privateKeyPath, 'utf8', function (err, privkeyJson) {
|
||||||
|
var pkj;
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
cb(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
pkj = JSON.parse(privkeyJson);
|
||||||
|
} catch(e) {
|
||||||
|
cb(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fromAccountPrivateKey(pkj, cb);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function bogusAccountId(cb) {
|
||||||
|
var priv = ursa.generatePrivateKey(2048, 65537);
|
||||||
|
|
||||||
|
fromPrivateKeyUrsa(priv, cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.bogusAccountId = bogusAccountId;
|
||||||
|
module.exports.fromAccountPrivateKey = fromAccountPrivateKey;
|
||||||
|
|
||||||
|
module.exports.bogusAccountId(function (err, id) {
|
||||||
|
console.log('Random Account Id', id);
|
||||||
|
});
|
||||||
|
module.exports.fromAccountPrivateKey('/etc/letsencrypt/live/example.com/privkey.pem', function (err, id) {
|
||||||
|
console.log(id);
|
||||||
|
});
|
Loading…
Reference in New Issue