smartacme/dist/smartacme.classes.acmecert.js

182 lines
15 KiB
JavaScript
Raw Normal View History

2017-01-14 13:14:50 +00:00
"use strict";
2017-01-15 21:30:33 +00:00
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
2017-01-14 17:36:33 +00:00
const q = require("q");
const plugins = require("./smartacme.plugins");
const helpers = require("./smartacme.helpers");
2017-01-15 21:30:33 +00:00
// Dnsly instance (we really just need one)
let myDnsly = new plugins.dnsly.Dnsly('google');
2017-01-14 17:36:33 +00:00
/**
* class AcmeCert represents a cert for domain
*/
2017-01-14 13:14:50 +00:00
class AcmeCert {
2017-01-15 11:21:29 +00:00
constructor(optionsArg, parentAcmeAccount) {
this.domainName = optionsArg.domain;
this.parentAcmeAccount = parentAcmeAccount;
2017-01-14 17:36:33 +00:00
this.keypair = helpers.createKeypair(optionsArg.bit);
let privateKeyForged = plugins.nodeForge.pki.privateKeyFromPem(this.keypair.privateKey);
let publicKeyForged = plugins.nodeForge.pki.publicKeyToPem(plugins.nodeForge.pki.setRsaPublicKey(privateKeyForged.n, privateKeyForged.e));
this.keyPairFinal = {
privateKey: privateKeyForged,
publicKey: publicKeyForged
};
// set dates
this.validFrom = new Date();
this.validTo = new Date();
this.validTo.setDate(this.validFrom.getDate() + 90);
// set attributes
this.attributes = [
{ name: 'commonName', value: optionsArg.domain },
{ name: 'countryName', value: optionsArg.country },
{ shortName: 'ST', value: optionsArg.country_short },
{ name: 'localityName', value: optionsArg.locality },
{ name: 'organizationName', value: optionsArg.organization },
{ shortName: 'OU', value: optionsArg.organization_short },
{ name: 'challengePassword', value: optionsArg.password },
{ name: 'unstructuredName', value: optionsArg.unstructured }
];
// set up csr
this.csr = plugins.nodeForge.pki.createCertificationRequest();
this.csr.setSubject(this.attributes);
this.csr.setAttributes(this.attributes);
}
/**
* requests a challenge for a domain
* @param domainNameArg - the domain name to request a challenge for
* @param challengeType - the challenge type to request
*/
2017-01-15 11:21:29 +00:00
requestChallenge(challengeTypeArg = 'dns-01') {
2017-01-14 17:36:33 +00:00
let done = q.defer();
this.parentAcmeAccount.parentSmartAcme.rawacmeClient.newAuthz({
identifier: {
type: 'dns',
2017-01-15 11:21:29 +00:00
value: this.domainName
2017-01-14 17:36:33 +00:00
}
}, this.parentAcmeAccount.parentSmartAcme.keyPair, (err, res) => {
if (err) {
console.error('smartacme: something went wrong:');
console.log(err);
done.reject(err);
}
2017-01-25 01:45:48 +00:00
let preChosenChallenge = res.body.challenges.filter(x => {
2017-01-14 17:36:33 +00:00
return x.type === challengeTypeArg;
})[0];
2017-01-25 01:45:48 +00:00
/**
* the key is needed to accept the challenge
*/
let authKey = plugins.rawacme.keyAuthz(preChosenChallenge.token, this.parentAcmeAccount.parentSmartAcme.keyPair.publicKey);
/**
* needed in case selected challenge is of type dns-01
*/
this.dnsKeyHash = plugins.rawacme.dnsKeyAuthzHash(authKey); // needed if dns challenge is chosen
/**
* the return challenge
*/
this.chosenChallenge = {
uri: preChosenChallenge.uri,
type: preChosenChallenge.type,
token: preChosenChallenge.token,
keyAuthorization: authKey,
status: preChosenChallenge.status,
dnsKeyHash: this.dnsKeyHash,
domainName: this.domainName,
domainNamePrefixed: helpers.prefixName(this.domainName)
};
done.resolve(this.chosenChallenge);
2017-01-14 17:36:33 +00:00
});
return done.promise;
}
2017-01-15 21:30:33 +00:00
/**
2017-01-15 21:59:58 +00:00
* checks if DNS records are set, will go through a max of 30 cycles
2017-01-15 21:30:33 +00:00
*/
2017-01-15 21:59:58 +00:00
checkDns(cycleArg = 1) {
2017-01-15 21:30:33 +00:00
return __awaiter(this, void 0, void 0, function* () {
2017-01-27 00:09:38 +00:00
let result = yield myDnsly.checkUntilAvailable(helpers.prefixName(this.domainName), 'TXT', this.dnsKeyHash);
if (result) {
2017-01-25 01:45:48 +00:00
console.log('DNS is set!');
2017-01-27 00:09:38 +00:00
return;
2017-01-25 01:45:48 +00:00
}
2017-01-27 00:09:38 +00:00
else {
throw new Error('DNS not set!');
2017-01-15 21:30:33 +00:00
}
});
}
2017-01-14 17:36:33 +00:00
/**
* validates a challenge, only call after you have set the challenge at the expected location
*/
requestValidation() {
2017-01-22 20:50:04 +00:00
return __awaiter(this, void 0, void 0, function* () {
let makeRequest = () => {
let done = q.defer();
2017-01-25 01:45:48 +00:00
this.parentAcmeAccount.parentSmartAcme.rawacmeClient.poll(this.chosenChallenge.uri, (err, res) => __awaiter(this, void 0, void 0, function* () {
2017-01-22 20:50:04 +00:00
if (err) {
console.log(err);
return;
}
console.log(`Validation response:`);
console.log(JSON.stringify(res.body));
2017-01-27 00:09:38 +00:00
if (res.body.status === 'pending' || res.body.status === 'invalid') {
2017-01-25 01:45:48 +00:00
yield plugins.smartdelay.delayFor(3000);
2017-01-22 20:50:04 +00:00
makeRequest().then((x) => { done.resolve(x); });
}
else {
2017-01-27 00:09:38 +00:00
console.log('perfect!');
2017-01-22 20:50:04 +00:00
done.resolve(res.body);
}
}));
return done.promise;
};
yield makeRequest();
2017-01-14 17:36:33 +00:00
});
}
/**
* requests a certificate
*/
requestCert() {
let done = q.defer();
let payload = {
csr: plugins.rawacme.base64.encode(plugins.rawacme.toDer(plugins.nodeForge.pki.certificationRequestToPem(this.csr))),
notBefore: this.validFrom.toISOString(),
notAfter: this.validTo.toISOString()
};
this.parentAcmeAccount.parentSmartAcme.rawacmeClient.newCert(payload, helpers.createKeypair(), (err, res) => {
if (err) {
console.log(err);
done.reject(err);
}
console.log(res.body);
done.resolve(res.body);
2017-01-14 17:36:33 +00:00
});
return done.promise;
}
/**
* getCertificate - takes care of cooldown, validation polling and certificate retrieval
*/
getCertificate() {
}
/**
* accept a challenge - for private use only
*/
2017-01-25 01:45:48 +00:00
acceptChallenge() {
2017-01-14 17:36:33 +00:00
let done = q.defer();
2017-01-25 01:45:48 +00:00
this.parentAcmeAccount.parentSmartAcme.rawacmeClient.post(this.chosenChallenge.uri, {
2017-01-14 17:36:33 +00:00
resource: 'challenge',
2017-01-25 01:45:48 +00:00
keyAuthorization: this.chosenChallenge.keyAuthorization
2017-01-14 17:36:33 +00:00
}, this.parentAcmeAccount.parentSmartAcme.keyPair, (err, res) => {
if (err) {
console.log(err);
done.reject(err);
}
2017-01-25 01:45:48 +00:00
done.resolve(res.body);
2017-01-14 17:36:33 +00:00
});
return done.promise;
}
2017-01-14 13:14:50 +00:00
}
exports.AcmeCert = AcmeCert;
2017-01-27 00:09:38 +00:00
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuYWNtZWNlcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFjbWUuY2xhc3Nlcy5hY21lY2VydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSx1QkFBc0I7QUFFdEIsK0NBQThDO0FBQzlDLCtDQUE4QztBQTJDOUMsMkNBQTJDO0FBQzNDLElBQUksT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7QUFFL0M7O0dBRUc7QUFDSDtJQVlJLFlBQVksVUFBc0MsRUFBRSxpQkFBOEI7UUFDOUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFBO1FBQ25DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQTtRQUMxQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3BELElBQUksZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUN2RixJQUFJLGVBQWUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQ3RELE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQ2hGLENBQUE7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHO1lBQ2hCLFVBQVUsRUFBRSxnQkFBZ0I7WUFDNUIsU0FBUyxFQUFFLGVBQWU7U0FDN0IsQ0FBQTtRQUVELFlBQVk7UUFDWixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7UUFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLElB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