81 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			81 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								'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);
							 | 
						||
| 
								 | 
							
								});
							 |