Disclosure: I work for CISPL.
As of now, WebCrypto API does not provide access to (Windows) or any other Key stores or local crypto USB/Smartcard device.
Also in most of the signing scenarios, for requirement to protect pdf file within the server boundaries, its not recommended to send complete pdf file to browser or to signing API server.
Thus, its good practice, to create hash of PDF for signing, send hash to browser and use javascript through browser extension to access some application running on local system to access local keystore (or USB/Smartcard) and produce the signature and send back (PKCS7 or CMS container in case of PDF signing) to server where the signature may be injected back to PDF from which hash was created for signing and was sent to browser or to signing api server.
For browser based signing scenarios, my company provides one such free Browser extension Signer.Digital and .NET library required on server. Local system (host running behind the chrome browser on windows) may be downloaded from cNET Download site
Installing this host and restarting Chrome will automatically add Signer.Digital Chrome Extension and/or Signer.Digital Firefox Extension
The actual working of this extension is illustrated here along with complete code walk through and download link to working sample VS 2015 project source code.
Javascript to call method from extension:
//Calculate Sign for the Hash by Calling function from Extension SignerDigital
SignerDigital.signPdfHash(hash, $("#CertThumbPrint").val(), "SHA-256") //or "SHA256"
//SignerDigitial.signHashCAdESBr method may be used for producing ICP-Brazil Signature
.then(
function (signDataResp) {
//Send signDataResp to Server
},
function (errmsg) {
//Send errmsg to server or display the result in browser.
}
);
If success, returns Base64 encoded pkcs7 signature - use suitable library or one provided by Signer.Digital to inject sign to pdf
If Failed, returns error msg starting with "SDHost Error:"
Digital Signing from Browser
- Server send Hash of data/document/content to be signed to browser.
- Browser uses Signer.Digital Browser Extension Javascript API to invoke action from Signer.Digital Browser Extension Host.
- On Windows, Browser Extension Host uses Microsoft Certificate store and underlaying CSP to get hash signed.
- On Linux, Browser Extension Host uses PKCS#11 .SO library of Crypto Device to get hash signed.
- Raw Signature (Signature of Hash) or Signature Container is returned to browser by Signer.Digital Browser EXtension Host.
- In case of Crypto Device viz. USB Token or Smartcard, private key of the user never comes out of the device but hash to be signed is sent to device to get it signed.
- The web application (Javascript in Browser) sends Signature back to server and same can be emended in PDF Document, or XML or Json or as required.
JULY 2022: Added method signCAdESBr to sign PDF or content as per ICP-Brazil standard and method signCAdESEg to sign as per Egypt ITIDA CAdES-BES.