WebCrypto APIは進化し、ChromeおよびFirefoxでサポートされているので、PDFドキュメントにデジタル署名するためにそれを使用したいと思います。 、しかしいくつかの例[1]とPKI.js [2]と呼ばれるライブラリを見つけました。例では、署名プロセスが説明されていますが、最後に署名が返されます。私のBase64 PDFファイルは署名済みのBase64文字列で再度返されますが、残念ながらこれは起こりません。PKI.jsも、私の知る限り、Base64 PDFに署名する方法を提供していません。
PDF JavaScriptとWebCrypto APIのみで署名する方法はありますか?秘密キーは<textarea>
または、ブラウザの証明書設定に保存されています。
Base64 PDF(from REST API)→JS&証明書で署名→署名済みBase64 PDF(RESTに送信))
これを技術的に行うことは可能ですが、実際には、PKIjsを作成したときに私たちが考えていたシナリオの1つです(これがこのサンプルがある理由です)- https://pkijs.org/examples/PDFexample .html
署名を行うには、PDF構造自体を操作する必要があります。これには、カスタムパーサーまたは既存のパーサー(pdfjsなど)の変更が必要です。
要するに、ブラウザでPDFに署名することは多くの作業を必要としますが、それは私たちが取り組んでいるものです。
PDFSign.js は、ブラウザにPDFファイルに署名できるライブラリです。署名には forge を使用します。 PKI.jsは分離されたpkcs7署名をサポートしているので、forgeを簡単に置き換えることができます。
Openpgp.jsを使用して、任意のファイル(PDFを含む)に署名できます
https://openpgpjs.org/openpgpjs/doc/#create-and-verify-detached-signatures
(「作成および検証、分離された署名」までスクロールします)
ファイルをUint8Arrayとして読み取り、秘密鍵で署名します。
開示:私はCISPLで働いています。
現在のところ、WebCrypto APIは(Windows)やその他のキーストア、ローカルの暗号USB /スマートカードデバイスへのアクセスを提供していません。
また、ほとんどの署名シナリオでは、サーバー境界内のPDFファイルを保護する必要があるため、完全なPDFファイルをブラウザーまたは署名APIサーバーに送信することはお勧めしません。
したがって、署名のためのPDFのハッシュを作成し、ブラウザーにハッシュを送信し、ブラウザー拡張機能を介してJavaScriptを使用してローカルシステムで実行されているアプリケーションにアクセスし、ローカルキーストア(またはUSB /スマートカード)にアクセスすることをお勧めします。 )署名を生成し、PDF署名の場合はPKCS7またはCMSコンテナ)をサーバーに送り返して、署名をPDFハッシュは署名用に作成され、ブラウザまたは署名用apiサーバーに送信されました。
ブラウザーベースの署名シナリオでは、サーバーで必要な無料のブラウザー拡張機能Signer.Digitalと.NETライブラリを1つ提供しています。ローカルシステム(chromeブラウザ)の背後で実行されているホスト)は cNETダウンロードサイト からダウンロードできます==このホストをインストールして再起動Chrome Signer.Digital Chrome Extension が自動的に追加されます
この拡張機能の実際の動作を示します here 完全なコードウォークスルーと、動作するサンプルVS 2015プロジェクトのソースコードへのリンクをダウンロードします。
拡張機能からメソッドを呼び出すJavaScript:
//Calculate Sign for the Hash by Calling function from Extension SignerDigital
SignerDigital.signPdfHash(hash, $("#CertThumbPrint").val(), "SHA-256") //or "SHA256"
.then(
function (signDataResp) {
//Send signDataResp to Server
},
function (errmsg) {
//Send errmsg to server or display the result in browser.
}
);
成功した場合、Base64でエンコードされたpkcs7署名を返します-適切なライブラリまたはSigner.Digitalが提供するライブラリを使用して、PDFに署名を挿入します
失敗した場合、「SDHost Error:」で始まるエラーメッセージを返します