Now that its possible to decode and verify the signature on X.509 certificates within the browser the natural question to ask is what can I do with that?
Well first off to build an interesting application you will need to have the ability to validate that a certificate is trusted the first step in doing that is building the certificate path associated with the certificate.
The defacto standard for path building libraries is the NIST PKITS tests our goal is to create a library that will be able to pass the sane tests from this suite (some are odd for sure).
This is a pretty high bar and will take some time. At the time of writing this blog post we pass 1-33 of this test suite in with flying colors these tests cover all of the basic certificate validation rules. We also think the library will pass all Policy Constraints and Name Constraints but more testing is needed to confirm.
So how does building a chain look like today with this library?
var certs = new Array(); // Load cert to be validated, its intermediates and root for(var i = 0; i < cert_buffers.length; i++) { var asn1 = org.pkijs.fromBER(cert_buffers[i]); certs.push(new org.pkijs.simpl.CERT({ schema: asn1.result })); } var crls = new Array(); // Load any CRLs we have for(var i = 0; i < crl_buffers.length; i++) { var asn1 = org.pkijs.fromBER(crl_buffers[i]); crls.push(new org.pkijs.simpl.CRL({ schema: asn1.result })); } var cert_chain_simpl = new org.pkijs.simpl.CERT_CHAIN({ certs: certs, crls: crls }); cert_chain_simpl.verify().then( function(result) { alert("Good result"); }, function(error) { alert("Error: " + error); } );
The current incarnation of the API expects that the bag of certificates that is passed in will include all intermediates as well as all trust anchors. We will be changing this in a future release so that trust anchors are passed in another bag.
This will help ensure that the certificate inputs to be validated don’t contain anything that might accidentally result in the certificate being treated as valid when it should not be. With that said as it is currently structured we can begin developing automated testing which is great.
Note: Updated the post to indicate the goal is to pass the sane PKITS tests, some of which are not and some are not possible to pass in a web environment.