Decouple request and response via WebSocket
This commit is contained in:
parent
08be6e68bc
commit
2093bf2429
12 changed files with 369 additions and 146 deletions
|
@ -148,32 +148,60 @@
|
|||
document.getElementById("csr").innerHTML = csrPem;
|
||||
progressBar.style.width = "75%";
|
||||
progressBar.setAttribute("aria-valuenow", "3");
|
||||
progressBar.classList.add('progress-bar-striped', 'progress-bar-animated');
|
||||
progressBar.innerHTML = i18n.t('keygen.generated', {seconds: seconds}) + ', ' + i18n.t('certificate.waiting');
|
||||
postData("/sign/", {"csr": csrPem, "commonName": subject}, csrfToken)
|
||||
.then(data => {
|
||||
document.getElementById("crt").innerHTML = data["certificate"];
|
||||
let certificates = []
|
||||
certificates.push(forge.pki.certificateFromPem(data["certificate"]));
|
||||
|
||||
for (let certificatePemData of data["ca_chain"]) {
|
||||
certificates.push(forge.pki.certificateFromPem(certificatePemData));
|
||||
const request_id = data["request_id"]
|
||||
const webSocket = new WebSocket(
|
||||
"wss://" + window.location.toString().substring(
|
||||
"https://".length
|
||||
).split("/")[0] + "/ws/")
|
||||
webSocket.onopen = function () {
|
||||
webSocket.send(JSON.stringify({"request_id": request_id}))
|
||||
}
|
||||
webSocket.onmessage = function (event) {
|
||||
handleCertificateResponse(JSON.parse(event.data));
|
||||
}
|
||||
webSocket.onclose = function (event) {
|
||||
if (event.wasClean) {
|
||||
console.debug("websocket closed cleanly");
|
||||
} else {
|
||||
console.error("websocket connection died");
|
||||
}
|
||||
}
|
||||
webSocket.onerror = function (error) {
|
||||
console.error(error.message);
|
||||
}
|
||||
|
||||
// browsers have trouble importing anything but 3des encrypted PKCS#12
|
||||
const p12asn1 = forge.pkcs12.toPkcs12Asn1(
|
||||
keys.privateKey, certificates, password,
|
||||
{algorithm: '3des'}
|
||||
);
|
||||
const p12Der = forge.asn1.toDer(p12asn1).getBytes();
|
||||
const p12B64 = forge.util.encode64(p12Der);
|
||||
|
||||
const downloadLink = document.getElementById('download-link');
|
||||
downloadLink.download = 'client_certificate.p12';
|
||||
downloadLink.setAttribute('href', 'data:application/x-pkcs12;base64,' + p12B64);
|
||||
|
||||
document.getElementById('download-wrapper').classList.remove("d-none");
|
||||
progressBar.style.width = "100%";
|
||||
progressBar.setAttribute("aria-valuenow", "4");
|
||||
});
|
||||
|
||||
function handleCertificateResponse(data) {
|
||||
document.getElementById("crt").innerHTML = data["certificate"];
|
||||
let certificates = []
|
||||
certificates.push(forge.pki.certificateFromPem(data["certificate"]));
|
||||
|
||||
for (let certificatePemData of data["ca_chain"]) {
|
||||
certificates.push(forge.pki.certificateFromPem(certificatePemData));
|
||||
}
|
||||
|
||||
// browsers have trouble importing anything but 3des encrypted PKCS#12
|
||||
const p12asn1 = forge.pkcs12.toPkcs12Asn1(
|
||||
keys.privateKey, certificates, password,
|
||||
{algorithm: '3des'}
|
||||
);
|
||||
const p12Der = forge.asn1.toDer(p12asn1).getBytes();
|
||||
const p12B64 = forge.util.encode64(p12Der);
|
||||
|
||||
const downloadLink = document.getElementById('download-link');
|
||||
downloadLink.download = 'client_certificate.p12';
|
||||
downloadLink.setAttribute('href', 'data:application/x-pkcs12;base64,' + p12B64);
|
||||
|
||||
document.getElementById('download-wrapper').classList.remove("d-none");
|
||||
progressBar.classList.remove("progress-bar-animated", 'progress-bar-striped');
|
||||
progressBar.style.width = "100%";
|
||||
progressBar.innerHTML = i18n.t('keygen.generated', {seconds: seconds}) + ', ' + i18n.t('certificate.received');
|
||||
progressBar.setAttribute("aria-valuenow", "4");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Reference in a new issue