96 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var accountKeypair = await Keypairs.generate({ kty: accKty });
 | |
| if (config.debug) {
 | |
|     console.info('Account Key Created');
 | |
|     console.info(JSON.stringify(accountKeypair, null, 2));
 | |
|     console.info();
 | |
|     console.info();
 | |
| }
 | |
| 
 | |
| var account = await acme.accounts.create({
 | |
|     agreeToTerms: agree,
 | |
|     // TODO detect jwk/pem/der?
 | |
|     accountKeypair: { privateKeyJwk: accountKeypair.private },
 | |
|     subscriberEmail: config.email
 | |
| });
 | |
| 
 | |
| // TODO top-level agree
 | |
| function agree(tos) {
 | |
|     if (config.debug) {
 | |
|         console.info('Agreeing to Terms of Service:');
 | |
|         console.info(tos);
 | |
|         console.info();
 | |
|         console.info();
 | |
|     }
 | |
|     agreed = true;
 | |
|     return Promise.resolve(tos);
 | |
| }
 | |
| if (config.debug) {
 | |
|     console.info('New Subscriber Account');
 | |
|     console.info(JSON.stringify(account, null, 2));
 | |
|     console.info();
 | |
|     console.info();
 | |
| }
 | |
| if (!agreed) {
 | |
|     throw new Error('Failed to ask the user to agree to terms');
 | |
| }
 | |
| 
 | |
| var certKeypair = await Keypairs.generate({ kty: srvKty });
 | |
| var pem = await Keypairs.export({
 | |
|     jwk: certKeypair.private,
 | |
|     encoding: 'pem'
 | |
| });
 | |
| if (config.debug) {
 | |
|     console.info('Server Key Created');
 | |
|     console.info('privkey.jwk.json');
 | |
|     console.info(JSON.stringify(certKeypair, null, 2));
 | |
|     // This should be saved as `privkey.pem`
 | |
|     console.info();
 | |
|     console.info('privkey.' + srvKty.toLowerCase() + '.pem:');
 | |
|     console.info(pem);
 | |
|     console.info();
 | |
| }
 | |
| 
 | |
| // 'subject' should be first in list
 | |
| var domains = randomDomains(rnd);
 | |
| if (config.debug) {
 | |
|     console.info('Get certificates for random domains:');
 | |
|     console.info(
 | |
|         domains
 | |
|             .map(function(puny) {
 | |
|                 var uni = punycode.toUnicode(puny);
 | |
|                 if (puny !== uni) {
 | |
|                     return puny + ' (' + uni + ')';
 | |
|                 }
 | |
|                 return puny;
 | |
|             })
 | |
|             .join('\n')
 | |
|     );
 | |
|     console.info();
 | |
| }
 | |
| 
 | |
| // Create CSR
 | |
| var csrDer = await CSR.csr({
 | |
|     jwk: certKeypair.private,
 | |
|     domains: domains,
 | |
|     encoding: 'der'
 | |
| });
 | |
| var csr = Enc.bufToUrlBase64(csrDer);
 | |
| var csrPem = PEM.packBlock({
 | |
|     type: 'CERTIFICATE REQUEST',
 | |
|     bytes: csrDer /* { jwk: jwk, domains: opts.domains } */
 | |
| });
 | |
| if (config.debug) {
 | |
|     console.info('Certificate Signing Request');
 | |
|     console.info(csrPem);
 | |
|     console.info();
 | |
| }
 | |
| 
 | |
| var results = await acme.certificates.create({
 | |
|     account: account,
 | |
|     accountKeypair: { privateKeyJwk: accountKeypair.private },
 | |
|     csr: csr,
 | |
|     domains: domains,
 | |
|     challenges: challenges, // must be implemented
 | |
|     customerEmail: null
 | |
| });
 |