ugly first steps

This commit is contained in:
AJ ONeal 2018-05-01 08:15:41 +00:00
parent 4fd5fd8bd9
commit 40200e4dc5
3 changed files with 196 additions and 11 deletions

View File

@ -3,13 +3,143 @@
<title>Greenlock&trade;</title> <title>Greenlock&trade;</title>
</head> </head>
<body> <body>
<form>
<!-- Step 1 Choose Domain(s) -->
<form class="js-acme-form js-acme-form-domains">
<label>What's your domain?</label> <label>What's your domain?</label>
<input type="text" placeholder="www.example.com"> <input class="js-acme-domains" type="text" placeholder="example.com,*.example.com" required>
<button type="submit">Next</button> <button type="submit">Next</button>
</form> </form>
<!-- Step 2 Create Account -->
<form class="js-acme-form js-acme-form-account">
<label>What's your email?</label>
<input class="js-acme-account-email" type="email" placeholder="john@doe.family" required>
<label><input class="js-acme-account-tos" type="checkbox" required>
Agree to <a class="js-le-tos">Let's Encrypt Terms of Service</a>?</label>
<label><input class="js-greenlock-account-tos" type="checkbox" required>
Agree to <a class="js-gl-tos">Greenlock Terms of Service</a>?</label>
<a href="#">advanced (use existing account)</a>
<button type="submit">Next</button>
</form>
<!-- Step 3 Set Challanges -->
<form class="js-acme-form js-acme-form-challenges">
<label>How will you validate your domain?</label>
<label><input class="js-acme-challenge-type" type="radio" value="http-01" checked required>
File Upload to HTTP Web Server</label>
<label><input class="js-acme-challenge-type" type="radio" value="dns-01" required>
TXT Records on DNS Name Server</label>
Verify Domains &amp; Sub-Domains:
<table class="js-acme-table-http-01">
<thead>
<tr>
<th>Hostname</th>
<th>File Location</th>
<th>File Contents</th>
</tr>
</thead>
<tbody>
<tr>
<td>example.com</td>
<td>.well-known/acme-challenge/xxx</td>
<td>sec.ret</td>
</tr>
</tbody>
</table>
<table class="js-acme-table-dns-01">
<thead>
<tr>
<th>Hostname</th>
<th>TXT Host</th>
<th>TXT Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>example.com</td>
<td>_acme-challenge.example.com</td>
<td>4A54</td>
</tr>
</tbody>
</table>
<div class="js-acme-wildcards">
Verify Wildcard Domains:
<table class="js-acme-table-wildcards">
<thead>
<tr>
<th>Hostname</th>
<th>TXT Host</th>
<th>TXT Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>example.com</td>
<td>_acme-challenge.example.com</td>
<td>4A54</td>
</tr>
</tbody>
</table>
</div>
<button type="submit">Next</button>
</form>
<!-- Step 4 Process Challanges -->
<form class="js-acme-form js-acme-form-poll">
Verifying Domains...
<table class="js-acme-table-verifying">
<thead>
<tr>
<th>Hostname</th>
<th>Type</th>
<th>Pass</th>
</tr>
</thead>
<tbody>
<tr>
<td>example.com</td>
<td>http-01</td>
<td>-</td>
</tr>
</tbody>
</table>
<a href="#">advanced (use existing keypair for domain)</a>
<button type="submit">Next</button>
</form>
<!-- Step 4 Process Challanges -->
<form class="js-acme-form js-acme-form-download">
<label>privkey.pem</label>
<textarea>-</textarea>
<label>fullchain.pem</label>
<textarea>-</textarea>
<label>cert.pem</label>
<textarea>-</textarea>
<label>chain.pem</label>
<textarea>-</textarea>
<button type="button">Download SSL Certificates</button>
<a href="#">Advanced (copy and paste)</a>
<button type="submit">Start Over</button>
</form>
<input class="js-acme-directory-url" type="url" placeholder="ACME directory url"> <input class="js-acme-directory-url" type="url" placeholder="ACME directory url">
<script src="./js/pkijs.org/v1.3.33/common.js"></script> <script src="./js/pkijs.org/v1.3.33/common.js"></script>
<script src="./js/pkijs.org/v1.3.33/asn1.js"></script> <script src="./js/pkijs.org/v1.3.33/asn1.js"></script>
<script src="./js/pkijs.org/v1.3.33/x509_schema.js"></script> <script src="./js/pkijs.org/v1.3.33/x509_schema.js"></script>

View File

@ -1,6 +1,57 @@
(function () { (function () {
'use strict'; 'use strict';
//window.document.querySelector('.js-acme-directory-url').value = 'https://acme-v02.api.letsencrypt.org/directory'; var $qs = function (s) { return window.document.querySelector(s); };
window.document.querySelector('.js-acme-directory-url').value = 'https://acme-staging-v02.api.letsencrypt.org/directory'; var $qsa = function (s) { return window.document.querySelectorAll(s); };
var info = {};
var steps = {};
var i = 1;
//$qs('.js-acme-directory-url').value = 'https://acme-v02.api.letsencrypt.org/directory';
$qs('.js-acme-directory-url').value = 'https://acme-staging-v02.api.letsencrypt.org/directory';
function hideForms() {
$qsa('.js-acme-form').forEach(function (el) {
el.hidden = true;
});
}
$qs('.js-acme-form-domains').addEventListener('submit', function (ev) {
ev.preventDefault();
info.identifiers = $qs('.js-acme-domains').value.split(/,/g).map(function (hostname) {
return { type: 'dns', value: hostname.trim() };
});
return BACME.directory($qs('.js-acme-directory-url').value).then(function () {
i += 1;
steps[i]();
});
});
steps[1] = function () {
hideForms();
$qs('.js-acme-form-domains').hidden = false;
};
steps[2] = function () {
hideForms();
$qs('.js-acme-form-account').hidden = false;
};
steps[3] = function () {
hideForms();
$qs('.js-acme-form-challenges').hidden = false;
};
steps[4] = function () {
hideForms();
$qs('.js-acme-form-poll').hidden = false;
}
steps[5] = function () {
hideForms();
$qs('.js-acme-form-download').hidden = false;
}
steps[1]();
}()); }());

View File

@ -8,13 +8,13 @@ var webCrypto = exports.crypto;
var directoryUrl = 'https://acme-staging-v02.api.letsencrypt.org/directory'; var directoryUrl = 'https://acme-staging-v02.api.letsencrypt.org/directory';
var directory; var directory;
var nonceUrl = directory.newNonce || 'https://acme-staging-v02.api.letsencrypt.org/acme/new-nonce'; var nonceUrl;
var nonce; var nonce;
var accountKeypair; var accountKeypair;
var accountJwk; var accountJwk;
var accountUrl = directory.newAccount; var accountUrl;
var signedAccount; var signedAccount;
BACME.challengePrefixes = { BACME.challengePrefixes = {
@ -38,6 +38,9 @@ BACME.directory = function (url) {
BACME._logHeaders(resp); BACME._logHeaders(resp);
return resp.json().then(function (body) { return resp.json().then(function (body) {
directory = body; directory = body;
nonceUrl = directory.newNonce || 'https://acme-staging-v02.api.letsencrypt.org/acme/new-nonce';
accountUrl = directory.newAccount || 'https://acme-staging-v02.api.letsencrypt.org/acme/new-account';
orderUrl = directory.newOrder || "https://acme-staging-v02.api.letsencrypt.org/acme/new-order";
BACME._logBody(body); BACME._logBody(body);
return body; return body;
}); });
@ -169,7 +172,7 @@ BACME.accounts.set = function () {
}); });
}; };
var orderUrl = directory.newOrder || "https://acme-staging-v02.api.letsencrypt.org/acme/new-order"; var orderUrl;
var signedOrder; var signedOrder;
BACME.orders = {}; BACME.orders = {};
@ -305,7 +308,8 @@ BACME.challenges['http-01'] = function () {
path: httpPath path: httpPath
, value: keyAuth , value: keyAuth
}; };
}); };
BACME.challenges['dns-01'] = function () { BACME.challenges['dns-01'] = function () {
return window.crypto.subtle.digest( return window.crypto.subtle.digest(
{ name: "SHA-256", } { name: "SHA-256", }
@ -326,7 +330,7 @@ BACME.challenges['dns-01'] = function () {
return { return {
type: 'TXT' type: 'TXT'
, host: dnsRecord , host: dnsRecord
, answer: dnsAuth; , answer: dnsAuth
}; };
}); });
}; };
@ -424,13 +428,13 @@ BACME.domains.generateKeypair = function () {
}); });
}; };
BACME.order.generateCsr = function (keypair, domains) { BACME.orders.generateCsr = function (keypair, domains) {
return Promise.resolve(CSR.generate(keypair, domains)); return Promise.resolve(CSR.generate(keypair, domains));
}; };
var certificateUrl; var certificateUrl;
BACME.order.finalize = function () { BACME.orders.finalize = function () {
var payload64 = jsto64( var payload64 = jsto64(
{ csr: csr } { csr: csr }
); );