106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | var forge=require('node-forge'), assert=require('better-assert'), fs=require('fs'), | ||
|  |   letiny=require('../lib/client'), config=require('./config.json'), | ||
|  |   res, newReg='https://acme-staging.api.letsencrypt.org/acme/new-reg'; | ||
|  | 
 | ||
|  | config.newReg=config.newReg || newReg; | ||
|  | config.pfxFile=config.pfxFile || './tmp.pfx'; | ||
|  | config.pfxPassword=config.pfxPassword || 'passwd'; | ||
|  | 
 | ||
|  | describe('config.json', function() { | ||
|  |   it('should contain required settings', function() { | ||
|  |     assert(config.email && config.email!=='me@example.com'); | ||
|  |     assert(config.domains && config.domains!=='example.com'); | ||
|  |     assert(config.webroot && config.webroot!=='/var/www/example.com'); | ||
|  |     assert(config.agreeTerms===true); | ||
|  |   }); | ||
|  | }); | ||
|  | 
 | ||
|  | describe('getCert', function() { | ||
|  |   this.timeout(60000); | ||
|  |   it('should return cert, key and ca', function(done) { | ||
|  |     letiny.getCert(config, function(err, cert, key, ca) { | ||
|  |       if (err) { | ||
|  |         throw err; | ||
|  |       } | ||
|  |       assert(cert); | ||
|  |       assert(key); | ||
|  |       assert(ca); | ||
|  |       res={cert:cert, key:key, ca:ca}; | ||
|  |       done(); | ||
|  |     }); | ||
|  |   }); | ||
|  | }); | ||
|  | 
 | ||
|  | describe('Certificate', function() { | ||
|  |   var cert, ms89days=89*24*60*60000; | ||
|  |   it('should be parsable', function() { | ||
|  |     cert=forge.pki.certificateFromPem(res.cert); | ||
|  |   }); | ||
|  |   it('should contain correct domain name', function() { | ||
|  |     assert(cert.subject.getField('CN').value===config.domains); | ||
|  |   }); | ||
|  |   it('should be valid at least 89 days', function() { | ||
|  |     assert(cert.validity.notBefore<new Date()); | ||
|  |     assert(cert.validity.notAfter>new Date(Date.now()+ms89days)); | ||
|  |   }); | ||
|  | }); | ||
|  | 
 | ||
|  | describe('Private key', function() { | ||
|  |   it('should be parsable', function() { | ||
|  |     forge.pki.privateKeyFromPem(res.key); | ||
|  |   }); | ||
|  | }); | ||
|  | 
 | ||
|  | describe('Issuer certificate', function() { | ||
|  |   var ca; | ||
|  |   it('should be parsable', function() { | ||
|  |     ca=forge.pki.certificateFromPem(res.ca); | ||
|  |   }); | ||
|  |   it('should be valid', function() { | ||
|  |     assert(ca.validity.notBefore<new Date()); | ||
|  |     assert(ca.validity.notAfter>new Date()); | ||
|  |   }); | ||
|  | }); | ||
|  | 
 | ||
|  | describe('PKCS#12', function() { | ||
|  |   var pfx; | ||
|  |   it('should create .pfx file', function() { | ||
|  |     pfx=fs.readFileSync('./tmp.pfx').toString('base64'); | ||
|  |     fs.unlinkSync('./tmp.pfx'); | ||
|  |   }); | ||
|  |   it('should be parsable', function() { | ||
|  |     var p12=forge.util.decode64(pfx); | ||
|  |     p12=forge.asn1.fromDer(p12); | ||
|  |     p12=forge.pkcs12.pkcs12FromAsn1(p12, 'passwd'); | ||
|  |     assert(p12.safeContents.length); | ||
|  |   }); | ||
|  | }); | ||
|  | 
 | ||
|  | describe('challenge option', function() { | ||
|  |   this.timeout(40000); | ||
|  |   it('should provide domain and challenge path and data', function(done) { | ||
|  |     config.webroot=false; | ||
|  |     config.challenge=function(domain, path, data) { | ||
|  |       assert(domain===config.domains); | ||
|  |       assert(path.match(/^\/\.well-known\/acme-challenge\/[\w-]{43}$/)); | ||
|  |       assert(data.length>60); | ||
|  |       done(); | ||
|  |     }; | ||
|  |     letiny.getCert(config, function() {}); | ||
|  |   }); | ||
|  | }); | ||
|  | 
 | ||
|  | describe('Error handling', function() { | ||
|  |   this.timeout(40000); | ||
|  |   it('should call callback with err', function(done) { | ||
|  |     config.challenge=function(domain, path, data, cb) { | ||
|  |       cb(); | ||
|  |     }; | ||
|  |     letiny.getCert(config, function(err) { | ||
|  |       assert(err instanceof Error); | ||
|  |       done(); | ||
|  |     }); | ||
|  |   }); | ||
|  | }); | ||
|  | 
 |