diff --git a/dist/smartacme.classes.acmeaccount.d.ts b/dist/smartacme.classes.acmeaccount.d.ts index e69de29..709829e 100644 --- a/dist/smartacme.classes.acmeaccount.d.ts +++ b/dist/smartacme.classes.acmeaccount.d.ts @@ -0,0 +1,3 @@ +import 'typings-global'; +export declare class AcmeAccount { +} diff --git a/dist/smartacme.classes.acmeaccount.js b/dist/smartacme.classes.acmeaccount.js index 3beab7a..9ad1454 100644 --- a/dist/smartacme.classes.acmeaccount.js +++ b/dist/smartacme.classes.acmeaccount.js @@ -1 +1,6 @@ -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuYWNtZWFjY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFjbWUuY2xhc3Nlcy5hY21lYWNjb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0= \ No newline at end of file +"use strict"; +require("typings-global"); +class AcmeAccount { +} +exports.AcmeAccount = AcmeAccount; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuYWNtZWFjY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFjbWUuY2xhc3Nlcy5hY21lYWNjb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEJBQXVCO0FBRXZCO0NBRUM7QUFGRCxrQ0FFQyJ9 \ No newline at end of file diff --git a/dist/smartacme.classes.acmecert.d.ts b/dist/smartacme.classes.acmecert.d.ts index e69de29..d66570b 100644 --- a/dist/smartacme.classes.acmecert.d.ts +++ b/dist/smartacme.classes.acmecert.d.ts @@ -0,0 +1,3 @@ +import 'typings-global'; +export declare class AcmeCert { +} diff --git a/dist/smartacme.classes.acmecert.js b/dist/smartacme.classes.acmecert.js index 5469d07..967677a 100644 --- a/dist/smartacme.classes.acmecert.js +++ b/dist/smartacme.classes.acmecert.js @@ -1 +1,6 @@ -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuYWNtZWNlcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFjbWUuY2xhc3Nlcy5hY21lY2VydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0= \ No newline at end of file +"use strict"; +require("typings-global"); +class AcmeCert { +} +exports.AcmeCert = AcmeCert; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuYWNtZWNlcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFjbWUuY2xhc3Nlcy5hY21lY2VydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEJBQXVCO0FBRXZCO0NBRUM7QUFGRCw0QkFFQyJ9 \ No newline at end of file diff --git a/dist/smartacme.classes.helper.d.ts b/dist/smartacme.classes.helper.d.ts index 87cc31a..e20c4eb 100644 --- a/dist/smartacme.classes.helper.d.ts +++ b/dist/smartacme.classes.helper.d.ts @@ -14,7 +14,7 @@ export declare class SmartacmeHelper { */ createKeypair(bit?: number): IRsaKeypair; /** - * getReg + * gets an existing registration * @executes ASYNC */ getReg(): q.Promise<{}>; diff --git a/dist/smartacme.classes.helper.js b/dist/smartacme.classes.helper.js index 62d5a18..a04892c 100644 --- a/dist/smartacme.classes.helper.js +++ b/dist/smartacme.classes.helper.js @@ -17,7 +17,7 @@ class SmartacmeHelper { }; } /** - * getReg + * gets an existing registration * @executes ASYNC */ getReg() { diff --git a/dist/smartacme.classes.smartacme.d.ts b/dist/smartacme.classes.smartacme.d.ts index 6f0e654..5a2df31 100644 --- a/dist/smartacme.classes.smartacme.d.ts +++ b/dist/smartacme.classes.smartacme.d.ts @@ -2,7 +2,18 @@ import 'typings-global'; import * as q from 'q'; import { SmartacmeHelper, IRsaKeypair } from './smartacme.classes.helper'; -export declare type TChallenge = 'dns-01' | 'http-01'; +export declare type TChallengeType = 'dns-01' | 'http-01'; +export declare type TChallengeStatus = 'pending'; +export interface ISmartAcmeChallenge { + uri: string; + status: TChallengeStatus; + type: TChallengeType; + token: string; + keyAuthorization: string; +} +export interface ISmartAcmeChallengeAccepted extends ISmartAcmeChallenge { + keyHash: string; +} /** * class SmartAcme exports methods for maintaining SSL Certificates */ @@ -30,11 +41,15 @@ export declare class SmartAcme { * @param domainNameArg - the domain name to request a challenge for * @param challengeType - the challenge type to request */ - requestChallenge(domainNameArg: string, challengeTypeArg?: TChallenge): q.Promise<{}>; + requestChallenge(domainNameArg: string, challengeTypeArg?: TChallengeType): q.Promise; /** * getCertificate - takes care of cooldown, validation polling and certificate retrieval */ getCertificate(): void; + /** + * validates a challenge + */ + validate(challenge: ISmartAcmeChallengeAccepted): q.Promise<{}>; /** * accept a challenge - for private use only */ diff --git a/dist/smartacme.classes.smartacme.js b/dist/smartacme.classes.smartacme.js index 5a7163d..d20f434 100644 --- a/dist/smartacme.classes.smartacme.js +++ b/dist/smartacme.classes.smartacme.js @@ -1,8 +1,10 @@ "use strict"; -require("typings-global"); -const q = require("q"); -let rsaKeygen = require('rsa-keygen'); -let rawacme = require('rawacme'); +// typings +require("typings-global"); // typings for node +// third party modules +const q = require("q"); // promises +let rsaKeygen = require('rsa-keygen'); // rsa keygen +let rawacme = require('rawacme'); // acme helper functions const smartacme_classes_helper_1 = require("./smartacme.classes.helper"); /** * class SmartAcme exports methods for maintaining SSL Certificates @@ -98,7 +100,7 @@ class SmartAcme { return x.type === challengeTypeArg; })[0]; this.acceptChallenge(dnsChallenge) - .then(x => { + .then((x) => { done.resolve(x); }); }); @@ -109,14 +111,46 @@ class SmartAcme { */ getCertificate() { } + /** + * validates a challenge + */ + validate(challenge) { + let done = q.defer(); + this.rawacmeClient.poll(challenge.uri, function (err, res) { + if (err) { + console.log(err); + done.reject(err); + } + console.log(res.status); + console.log(JSON.stringify(res.body)); + done.resolve(); + }); + return done.promise; + } /** * accept a challenge - for private use only */ acceptChallenge(challenge) { let done = q.defer(); + /** + * the key is needed to accept the challenge + */ let authKey = rawacme.keyAuthz(challenge.token, this.keyPair.publicKey); - let dnsKeyHash = rawacme.dnsKeyAuthzHash(authKey); // needed if dns challenge is chosen - console.log(authKey); + /** + * needed in case selected challenge is of type dns-01 + */ + let keyHash = rawacme.dnsKeyAuthzHash(authKey); // needed if dns challenge is chosen + /** + * the return challenge + */ + let returnDNSChallenge = { + uri: challenge.uri, + type: challenge.type, + token: challenge.token, + keyAuthorization: challenge.keyAuthorization, + keyHash: keyHash, + status: challenge.status + }; this.rawacmeClient.post(challenge.uri, { resource: 'challenge', keyAuthorization: authKey @@ -125,12 +159,10 @@ class SmartAcme { console.log(err); done.reject(err); } - console.log('acceptChallenge:'); - console.log(JSON.stringify(res.body)); - done.resolve(dnsKeyHash); + done.resolve(returnDNSChallenge); }); return done.promise; } } exports.SmartAcme = SmartAcme; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuc21hcnRhY21lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhY21lLmNsYXNzZXMuc21hcnRhY21lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwwQkFBdUI7QUFDdkIsdUJBQXNCO0FBRXRCLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtBQUdyQyxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7QUFHaEMseUVBQXlFO0FBS3pFOztHQUVHO0FBQ0g7SUFVSTs7T0FFRztJQUNILFlBQVksZ0JBQXlCLEtBQUs7UUFDdEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUE7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLDBDQUFlLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQzFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQTtRQUMxQyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQTtRQUNsRCxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILGFBQWE7UUFDVCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDcEIsT0FBTyxDQUFDLFlBQVksQ0FDaEI7WUFDSSxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDakIsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUztZQUNqQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO1NBQ3RDLEVBQ0QsQ0FBQyxHQUFH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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuc21hcnRhY21lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhY21lLmNsYXNzZXMuc21hcnRhY21lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxVQUFVO0FBQ1YsMEJBQXVCLENBQUMsbUJBQW1CO0FBRTNDLHNCQUFzQjtBQUN0Qix1QkFBc0IsQ0FBQyxXQUFXO0FBRWxDLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQSxDQUFDLGFBQWE7QUFDbkQsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBLENBQUMsd0JBQXdCO0FBT3pELHlFQUF5RTtBQWlCekU7O0dBRUc7QUFDSDtJQVVJOztPQUVHO0lBQ0gsWUFBWSxnQkFBeUIsS0FBSztRQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQTtRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksMENBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDMUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFBO1FBQzFDLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNKLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixDQUFBO1FBQ2xELENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsYUFBYTtRQUNULElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNwQixPQUFPLENBQUMsWUFBWSxDQUNoQjtZQUNJLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTztZQUNqQixTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTO1lBQ2pDLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVU7U0FDdEMsRUFDRCxDQUFDLEdBQUcsRUFBRSxNQUFNO1lBQ1IsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDTixPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUE7Z0JBQ2pELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2hCLE1BQU0sQ0FBQTtZQUNWLENBQUM7WUFFRCxrQ0FBa0M7WUFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUE7WUFFM0IsMEJBQTBCO1lBQzFCLE1BQU0sQ0FBQyxNQUFNLENBQ1Q7Z0JBQ0ksT0FBTyxFQUFFLENBQUMsNkJBQTZCLENBQUM7YUFDM0MsRUFDRCxDQUFDLEdBQUcsRUFBRSxHQUFHO2dCQUNMLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFBO29CQUNqRCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO29CQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO29CQUNoQixNQUFNLENBQUE7Z0JBQ1YsQ0FBQztnQkFDRCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFBO2dCQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFBO2dCQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQTtnQkFDcEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQ2xCLENBQUMsQ0FBQyxDQUFBO1FBRVYsQ0FBQyxDQUNKLENBQUE7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUN2QixDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNwQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNyQyxJQUFJLGNBQWMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzFDLElBQUksR0FBRyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUNsRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRztZQUNqRixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2hCLE1BQU0sQ0FBQTtZQUNWLENBQUM7WUFDRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDbEIsQ0FBQyxDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUN2QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdCQUFnQixDQUFDLGFBQXFCLEVBQUUsbUJBQW1DLFFBQVE7UUFDL0UsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBK0IsQ0FBQTtRQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FDdkI7WUFDSSxVQUFVLEVBQUU7Z0JBQ1IsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsS0FBSyxFQUFFLGFBQWE7YUFDdkI7U0FDSixFQUNELElBQUksQ0FBQyxPQUFPLEVBQ1osQ0FBQyxHQUFHLEVBQUUsR0FBRztZQUNMLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFBO2dCQUNqRCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3BCLENBQUM7WUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7WUFDckMsSUFBSSxZQUFZLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFBO1lBQ3RDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ0wsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUM7aUJBQzdCLElBQUksQ0FBQyxDQUFDLENBQThCO2dCQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ25CLENBQUMsQ0FBQyxDQUFBO1FBQ1YsQ0FBQyxDQUNKLENBQUE7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjO0lBRWQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUSxDQUFDLFNBQXNDO1FBQzNDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFVBQVMsR0FBRyxFQUFFLEdBQUc7WUFDcEQsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDTixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3BCLENBQUM7WUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7WUFDckMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ2xCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDdkIsQ0FBQztJQUdEOztPQUVHO0lBQ0ssZUFBZSxDQUFDLFNBQThCO1FBQ2xELElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUVwQjs7V0FFRztRQUNILElBQUksT0FBTyxHQUFXLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRS9FOztXQUVHO1FBQ0gsSUFBSSxPQUFPLEdBQVcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQSxDQUFDLG9DQUFvQztRQUUzRjs7V0FFRztRQUNILElBQUksa0JBQWtCLEdBQWdDO1lBQ2xELEdBQUcsRUFBRSxTQUFTLENBQUMsR0FBRztZQUNsQixJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7WUFDcEIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLO1lBQ3RCLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxnQkFBZ0I7WUFDNUMsT0FBTyxFQUFFLE9BQU87WUFDaEIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNO1NBQzNCLENBQUE7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDbkIsU0FBUyxDQUFDLEdBQUcsRUFDYjtZQUNJLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLGdCQUFnQixFQUFFLE9BQU87U0FDNUIsRUFDRCxJQUFJLENBQUMsT0FBTyxFQUNaLENBQUMsR0FBRyxFQUFFLEdBQUc7WUFDTCxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDcEIsQ0FBQztZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUNwQyxDQUFDLENBQ0osQ0FBQTtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3ZCLENBQUM7Q0FHSjtBQWpNRCw4QkFpTUMifQ== \ No newline at end of file diff --git a/package.json b/package.json index 264b425..d290b81 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,9 @@ }, "homepage": "https://gitlab.com/pushrocks/smartacme#README", "dependencies": { + "@types/node-forge": "^0.6.5", "@types/q": "0.x.x", + "node-forge": "^0.6.46", "q": "^1.4.1", "rawacme": "^0.2.1", "rsa-keygen": "^1.0.6", diff --git a/test/test.js b/test/test.js index 6a8b60f..594d74b 100644 --- a/test/test.js +++ b/test/test.js @@ -5,6 +5,7 @@ const should = require("should"); const smartacme = require("../dist/index"); describe('smartacme', function () { let testAcme; + let testChallenge; it('should create a valid instance', function () { this.timeout(10000); testAcme = new smartacme.SmartAcme(); @@ -30,9 +31,17 @@ describe('smartacme', function () { }); it('should request a challenge for a domain', function (done) { this.timeout(10000); - testAcme.requestChallenge('bleu.de').then(() => { + testAcme.requestChallenge('bleu.de').then((challengeAccepted) => { + console.log(challengeAccepted); + testChallenge = challengeAccepted; + done(); + }); + }); + it('should poll for validation of a challenge', function (done) { + this.timeout(10000); + testAcme.validate(testChallenge).then(x => { done(); }); }); }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUNyQixpQ0FBZ0M7QUFFaEMsNEJBQTRCO0FBQzVCLDJDQUEwQztBQUUxQyxRQUFRLENBQUMsV0FBVyxFQUFFO0lBQ2xCLElBQUksUUFBNkIsQ0FBQTtJQUVqQyxFQUFFLENBQUMsZ0NBQWdDLEVBQUU7UUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNuQixRQUFRLEdBQUcsSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUE7UUFDcEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3ZELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDZCQUE2QixFQUFFO1FBQzlCLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDakQsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsK0JBQStCLEVBQUUsVUFBVSxJQUFJO1FBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkIsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLElBQUksRUFBRSxDQUFBO1FBQ1YsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUc7WUFDUixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNiLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMscUJBQXFCLEVBQUUsVUFBUyxJQUFJO1FBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQztZQUNyQixJQUFJLEVBQUUsQ0FBQTtRQUNWLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMseUNBQXlDLEVBQUUsVUFBUyxJQUFJO1FBQ3ZELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkIsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUN0QyxJQUFJLEVBQUUsQ0FBQTtRQUNWLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQSJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUNyQixpQ0FBZ0M7QUFFaEMsNEJBQTRCO0FBQzVCLDJDQUEwQztBQUUxQyxRQUFRLENBQUMsV0FBVyxFQUFFO0lBQ2xCLElBQUksUUFBNkIsQ0FBQTtJQUNqQyxJQUFJLGFBQW9ELENBQUE7SUFDeEQsRUFBRSxDQUFDLGdDQUFnQyxFQUFFO1FBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkIsUUFBUSxHQUFHLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBQ3BDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUN2RCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyw2QkFBNkIsRUFBRTtRQUM5QixNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2pELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLCtCQUErQixFQUFFLFVBQVUsSUFBSTtRQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ25CLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixJQUFJLEVBQUUsQ0FBQTtRQUNWLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQ1IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDYixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHFCQUFxQixFQUFFLFVBQVMsSUFBSTtRQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ25CLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDckIsSUFBSSxFQUFFLENBQUE7UUFDVixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLFVBQVMsSUFBSTtRQUN2RCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ25CLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUI7WUFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1lBQzlCLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQTtZQUNqQyxJQUFJLEVBQUUsQ0FBQTtRQUNWLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsMkNBQTJDLEVBQUMsVUFBUyxJQUFJO1FBQ3hELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxJQUFJLEVBQUUsQ0FBQTtRQUNWLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQSJ9 \ No newline at end of file diff --git a/test/test.ts b/test/test.ts index 3767923..99219e4 100644 --- a/test/test.ts +++ b/test/test.ts @@ -6,13 +6,13 @@ import * as smartacme from '../dist/index' describe('smartacme', function () { let testAcme: smartacme.SmartAcme - + let testChallenge: smartacme.ISmartAcmeChallengeAccepted it('should create a valid instance', function () { this.timeout(10000) testAcme = new smartacme.SmartAcme() should(testAcme).be.instanceOf(smartacme.SmartAcme) }) - + it('should have created keyPair', function () { should(testAcme.acmeUrl).be.of.type('string') }) @@ -36,7 +36,16 @@ describe('smartacme', function () { it('should request a challenge for a domain', function(done) { this.timeout(10000) - testAcme.requestChallenge('bleu.de').then(() => { + testAcme.requestChallenge('bleu.de').then((challengeAccepted) => { + console.log(challengeAccepted) + testChallenge = challengeAccepted + done() + }) + }) + + it('should poll for validation of a challenge',function(done) { + this.timeout(10000) + testAcme.validate(testChallenge).then(x => { done() }) }) diff --git a/ts/smartacme.classes.acmeaccount.ts b/ts/smartacme.classes.acmeaccount.ts index 00a35bf..ba2666f 100644 --- a/ts/smartacme.classes.acmeaccount.ts +++ b/ts/smartacme.classes.acmeaccount.ts @@ -1,5 +1,8 @@ import 'typings-global' +/** + * class AcmeAccount represents an AcmeAccount + */ export class AcmeAccount { } \ No newline at end of file diff --git a/ts/smartacme.classes.acmecert.ts b/ts/smartacme.classes.acmecert.ts index 1ea078a..6b17e50 100644 --- a/ts/smartacme.classes.acmecert.ts +++ b/ts/smartacme.classes.acmecert.ts @@ -1,5 +1,8 @@ import 'typings-global' +/** + * class AcmeCert represents a cert for domain + */ export class AcmeCert { - + fullchain: string } \ No newline at end of file diff --git a/ts/smartacme.classes.acmecsr.ts b/ts/smartacme.classes.acmecsr.ts new file mode 100644 index 0000000..097ef6f --- /dev/null +++ b/ts/smartacme.classes.acmecsr.ts @@ -0,0 +1,52 @@ +import * as plugins from './smartacme.plugins' +import * as helpers from './smartacme.helpers' + +import { IRsaKeypair } from './smartacme.classes.smartacme' + +export interface IAcmeCsrConstructorOptions { + bit: number, + key: string, + domain: string, + country: string, + country_short: string, + locality: string, + organization: string, + organization_short: string, + password: string, + unstructured: string, + subject_alt_names: string[] +} + +export class AcmeCsr { + validFrom: Date + validTo: Date + keypair: IRsaKeypair + keyPairForged: IRsaKeypair + constructor(optionsArg: IAcmeCsrConstructorOptions) { + 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.keyPairForged = { + privateKey: privateKeyForged, + publicKey: publicKeyForged + } + + // set dates + this.validFrom = new Date() + this.validTo = new Date() + this.validTo.setDate(this.validFrom.getDate() + 90) + + // create the csr + let attributes = [ + { name: "commonName", value: domain }, + { name: "countryName", value: country }, + { shortName: "ST", value: country_short }, + { name: "localityName", value: locality }, + { name: "organizationName", value: organization }, + { shortName: "OU", value: organization_short } + ] + + } +} diff --git a/ts/smartacme.classes.helper.ts b/ts/smartacme.classes.helper.ts deleted file mode 100644 index b4936a5..0000000 --- a/ts/smartacme.classes.helper.ts +++ /dev/null @@ -1,53 +0,0 @@ -import 'typings-global' -import * as q from 'q' -let rsaKeygen = require('rsa-keygen') - -import { SmartAcme } from './smartacme.classes.smartacme' - -export interface IRsaKeypair { - publicKey: string - privateKey: string -} - -export class SmartacmeHelper { - parentSmartAcme: SmartAcme - - constructor(smartAcmeArg: SmartAcme) { - this.parentSmartAcme = smartAcmeArg - } - - /** - * creates a keypair to use with requests and to generate JWK from - */ - createKeypair(bit = 2048): IRsaKeypair { - let result = rsaKeygen.generate(bit) - return { - publicKey: result.public_key, - privateKey: result.private_key - } - } - - /** - * getReg - * @executes ASYNC - */ - getReg() { - let done = q.defer() - let body = { resource: 'reg' } - this.parentSmartAcme.rawacmeClient.post( - this.parentSmartAcme.location, - body, this.parentSmartAcme.keyPair, - (err, res) => { - if (err) { - console.error('smartacme: something went wrong:') - console.log(err) - done.reject(err) - return - } - console.log(JSON.stringify(res.body)) - done.resolve() - } - ) - return done.promise - } -} \ No newline at end of file diff --git a/ts/smartacme.classes.smartacme.ts b/ts/smartacme.classes.smartacme.ts index 8d88c06..475e6a6 100644 --- a/ts/smartacme.classes.smartacme.ts +++ b/ts/smartacme.classes.smartacme.ts @@ -1,22 +1,32 @@ -import 'typings-global' -import * as q from 'q' -import * as path from 'path' -let rsaKeygen = require('rsa-keygen') -import * as smartfile from 'smartfile' -import * as smartstring from 'smartstring' -let rawacme = require('rawacme') -import * as paths from './smartacme.paths' +// third party modules +import * as q from 'q' // promises +import * as plugins from './smartacme.plugins' +import * as helpers from './smartacme.helpers' -import { SmartacmeHelper, IRsaKeypair } from './smartacme.classes.helper' +export interface IRsaKeypair { + publicKey: string + privateKey: string +} -export type TChallenge = 'dns-01' | 'http-01' +export type TChallengeType = 'dns-01' | 'http-01' +export type TChallengeStatus = 'pending' +export interface ISmartAcmeChallenge { + uri: string + status: TChallengeStatus + type: TChallengeType + token: string + keyAuthorization: string +} + +export interface ISmartAcmeChallengeAccepted extends ISmartAcmeChallenge { + keyHash: string +} /** * class SmartAcme exports methods for maintaining SSL Certificates */ export class SmartAcme { - helper: SmartacmeHelper // bundles helper methods that would clutter the main SmartAcme class acmeUrl: string // the acme url to use productionBool: boolean // a boolean to quickly know wether we are in production or not keyPair: IRsaKeypair // the keyPair needed for account creation @@ -30,12 +40,11 @@ export class SmartAcme { */ constructor(productionArg: boolean = false) { this.productionBool = productionArg - this.helper = new SmartacmeHelper(this) - this.keyPair = this.helper.createKeypair() + this.keyPair = helpers.createKeypair() if (this.productionBool) { - this.acmeUrl = rawacme.LETSENCRYPT_URL + this.acmeUrl = plugins.rawacme.LETSENCRYPT_URL } else { - this.acmeUrl = rawacme.LETSENCRYPT_STAGING_URL + this.acmeUrl = plugins.rawacme.LETSENCRYPT_STAGING_URL } } @@ -45,7 +54,7 @@ export class SmartAcme { */ createAccount() { let done = q.defer() - rawacme.createClient( + plugins.rawacme.createClient( { url: this.acmeUrl, publicKey: this.keyPair.publicKey, @@ -107,8 +116,8 @@ export class SmartAcme { * @param domainNameArg - the domain name to request a challenge for * @param challengeType - the challenge type to request */ - requestChallenge(domainNameArg: string, challengeTypeArg: TChallenge = 'dns-01') { - let done = q.defer() + requestChallenge(domainNameArg: string, challengeTypeArg: TChallengeType = 'dns-01') { + let done = q.defer() this.rawacmeClient.newAuthz( { identifier: { @@ -128,7 +137,7 @@ export class SmartAcme { return x.type === challengeTypeArg })[0] this.acceptChallenge(dnsChallenge) - .then(x => { + .then((x: ISmartAcmeChallengeAccepted) => { done.resolve(x) }) } @@ -143,16 +152,51 @@ export class SmartAcme { } + /** + * validates a challenge + */ + validate(challenge: ISmartAcmeChallengeAccepted) { + let done = q.defer() + this.rawacmeClient.poll(challenge.uri, function(err, res) { + if (err) { + console.log(err) + done.reject(err) + } + console.log(res.status) + console.log(JSON.stringify(res.body)) + done.resolve() + }) + return done.promise + } + + /** * accept a challenge - for private use only */ - private acceptChallenge(challenge) { + private acceptChallenge(challenge: ISmartAcmeChallenge) { let done = q.defer() - let authKey: string = rawacme.keyAuthz(challenge.token, this.keyPair.publicKey) - let dnsKeyHash: string = rawacme.dnsKeyAuthzHash(authKey) // needed if dns challenge is chosen + /** + * the key is needed to accept the challenge + */ + let authKey: string = plugins.rawacme.keyAuthz(challenge.token, this.keyPair.publicKey) - console.log(authKey) + /** + * needed in case selected challenge is of type dns-01 + */ + let keyHash: string = plugins.rawacme.dnsKeyAuthzHash(authKey) // needed if dns challenge is chosen + + /** + * the return challenge + */ + let returnDNSChallenge: ISmartAcmeChallengeAccepted = { + uri: challenge.uri, + type: challenge.type, + token: challenge.token, + keyAuthorization: challenge.keyAuthorization, + keyHash: keyHash, + status: challenge.status + } this.rawacmeClient.post( challenge.uri, @@ -166,9 +210,7 @@ export class SmartAcme { console.log(err) done.reject(err) } - console.log('acceptChallenge:') - console.log(JSON.stringify(res.body)) - done.resolve(dnsKeyHash) + done.resolve(returnDNSChallenge) } ) return done.promise diff --git a/ts/smartacme.helpers.ts b/ts/smartacme.helpers.ts new file mode 100644 index 0000000..85e1b35 --- /dev/null +++ b/ts/smartacme.helpers.ts @@ -0,0 +1,43 @@ +import 'typings-global' +import * as q from 'q' + +import * as plugins from './smartacme.plugins' + +import { SmartAcme, IRsaKeypair } from './smartacme.classes.smartacme' + + + +/** + * creates a keypair to use with requests and to generate JWK from + */ +export let createKeypair = (bit = 2048): IRsaKeypair => { + let result = plugins.rsaKeygen.generate(bit) + return { + publicKey: result.public_key, + privateKey: result.private_key + } +} + +/** + * gets an existing registration + * @executes ASYNC + */ +let getReg = (smartAcmeArg: SmartAcme) => { + let done = q.defer() + let body = { resource: 'reg' } + smartAcmeArg.rawacmeClient.post( + smartAcmeArg.location, + body, smartAcmeArg.keyPair, + (err, res) => { + if (err) { + console.error('smartacme: something went wrong:') + console.log(err) + done.reject(err) + return + } + console.log(JSON.stringify(res.body)) + done.resolve() + } + ) + return done.promise +} diff --git a/ts/smartacme.plugins.ts b/ts/smartacme.plugins.ts new file mode 100644 index 0000000..795e22d --- /dev/null +++ b/ts/smartacme.plugins.ts @@ -0,0 +1,20 @@ +import 'typings-global' // typings for node + +import * as path from 'path' // native node path module +let rsaKeygen = require('rsa-keygen') // rsa keygen +let rawacme = require('rawacme') // acme helper functions +let nodeForge = require('node-forge') + +// push.rocks modules here +import * as smartfile from 'smartfile' +import * as smartstring from 'smartstring' +import * as paths from './smartacme.paths' + +export { + rsaKeygen, + rawacme, + nodeForge, + smartfile, + smartstring, + paths +} \ No newline at end of file