一般的なブラウザ(http(s)を介してサーバーに接続されている)、できればJavascriptからローカルスマートカードにアクセスするための可能なクライアント側アーキテクチャは何ですか?サーバーは、少なくとも選択したAPDUをカードに発行できる必要があります(または、その一部を生成するクライアント側コードに委任する必要がある場合があります)。スマートカードリーダーを備えた動作中のPC/SCスタックのクライアント側での可用性を想定しています。これは、少なくともXP以降のWindows、最新のOS X、Unixでは合理的な仮定です。
これまでのところ、次のオプションを特定しました。
javax.smartcardio
。機能的な観点からは十分に文書化されており、いくつかの既知のバグに耐えることができますが、Javaとしてのブラウザ拡張機能の受け入れに関しては、抵抗できない下方スパイラルを恐れています。他のアイデアは?
また、不正なサーバーによるブラウザーのPC/SCインターフェースの悪用を防ぐ方法はありますか(例:カードをブロックするために3つの間違ったPINを提示して、カードの厄介さのために、またはいくつかのさらに悪いことをする)。
更新(2016年8月):Web用の新しいAPIはWebUSB API と呼ばれますが議論されています。 すでにChrome v54 + で使用できます。
この標準はすべての主要なブラウザに実装され、サードパーティのアプリケーションやSmardカードの拡張機能の必要性を置き換えます:-)
新しい答えはイエスです!
OSIに似たアーキテクチャスタックは次のとおりです。
2019 Update:@vlpがコメントしたように、Chromeで動作しないように思われるいくつかの具体的な理由でスマートカードのWebUSBをブロックします:
注:Googleは、彼らが---(2017年にChrome Apps を放棄すると発表しました。
以前のanwser:
今(2015)、Googleを作成できますChromeアプリを使用して、 chrome.usb
API 。
次に、 CCID準拠 インターフェースを介してスマートカードリーダーにアクセスします。
クロスブラウザではなく、JavaScriptでプログラム可能なクロスプラットフォームです。
とにかく、Netscape Plugin API(NPAPI)は、最新のブラウザーではサポートされなくなりました。そしてJavaアプレットはブラウザベンダーによって却下されています。
事実、ブラウザーはSSLを確立する以外の目的で(暗号化された)スマートカードと通信することはできません。
shallスマートカードにアクセスするには、ブラウザで実行される追加のコードが必要です。
少なくともヨーロッパや他の場所では確かに標準的な方法や普遍的に受け入れられている方法がないため、さまざまな目的(署名が最も一般的であると思われます)のために構築されたカスタムおよび独自のプラグインが(あなたが言及した3つのオプションをすべて使用して)数十あります同様に。
ブラウザーは毎月リリースされ、新しいリリースはUIトリックのサンボックス化を変更するため、コードを頻繁に調整する必要がある場合があるため、独自の作成、配布、および保守は急を要するものです。
そして、少なくともユーザーにカードまたはカード上の何らかの機能にアクセスする許可を求めるためのGUI機能が必要になるでしょう。
複数のプラットフォーム、複数のブラウザプラグインを作成するには、 firebreath のようなものを使用できます。
個人的には、PC/SCをWebに公開することは何の役にも立たないと思います。 PC/SCは本質的に低レベルのプロトコルであり、これを公開する場合、ディスクへのブロックレベルのアクセスを公開し、「Web上のアプリケーションは私のものであり、適切に動作する」ことを期待できます(これは、 ")。同時に、JConnectスクリプトplugin.sendAPDU()スタイルのコードを提供するために、SConnectのようなシンシムを作成するのが最も簡単です(または、すべてのPC/SC APIをラップして、javascript呼び出し元に同じレベルの詳細を処理させます)ネイティブPC/SC APIの使用例のように)。
この目的のためのプラグインの作成は、通常、急性currentの不足によって引き起こされます。
W3C webcrypto やOpenMobile APIのようなものがおそらく最終的に何らかの方法でWebアプリケーションにクライアント側のキーコンテナーを公開する何かを作成する未来(モバイルなど)に対処することです。スマートカードを使用するターゲットが暗号化である場合、PC/SCを避けてプラットフォームサービスを使用することをお勧めします(WindowsではCryptoAPI、OSXではキーチェーン、LinuxではPKCS#11)
どんな種類のデザインにも要件があります。これは、任意のAPDU-sではなくkeysの使用を考えている場合にすべて当てはまります。任意のAPDU-sを送信する必要がある場合は、プラグインを作成して、そのまま使用します。
この問題に対処するベータプラグインをリリースしました。このベータコードは次の場所から入手できます。
https://github.com/ubinity/webpcsc-firebreath
このプラグインはfirebreathフレームワークに基づいており、FireofxおよびChrome= Linux/WinXP/Win7でベータテスト済みです。ソースコードと拡張パックが提供されています。
基本的な考え方は、PCSLite APIアクセスを提供し、この上でより使いやすいJS-apiを開発することです。
このプラグインは活発に開発されているので、レポートやリクエストを送信してください。
http://github.com/cardid/WebCard で利用可能な@cslashmによって提案されたものに類似した別のブラウザプラグインがあります。また、オープンソースであり、元の質問の必要に応じて「最小インストールの手間」でインストールできます。 http://plugin.cardid.org にアクセスして使用例を見ることができます。
WebCardは、IE 8から11、ChromeとFirefoxはWindowsで、ChromeとSafariはMac OSでテストされています。 X.はPC/SCの単なるラッパーであるため、Mac OS Xでは http://smartcardservices.macosforge.com からSmartCard Servicesをインストールする必要があります。
最初の質問については、あまり期待していません:スマートカード機能の非常に小さなサブセット(電子メールやPDFへの署名など)に満足している場合は、PKCSなどによって管理されている既製のソフトウェアを使用できます。スマートカード会社、またはより広範な機能が必要であり、かなりの労力を自分で投資する必要がある場合。確かにPCSCが選択の出発点です。
少なくともあなたの "また:"には、いくつかの希望があります。
1)一部の仕様(例:ICAO/German BSI TR-3110)は、a PINはブロックされませんが、エラーカウンターがすぐにかなりの時間を使用するメソッドを要求します応答する前に1を押す最後の試行は、別のコマンドを使用して有効にする必要があります。
2)安全なメッセージングを要求することにより、単にVerifyコマンドを保護します。機密性の高いアプリケーションはすべてにセキュアメッセージングを使用するため、最初のステップではセッションキーが無効になり、次にセッションキーが後続のすべてのコマンドおよび応答に適用されます。結果は、エラーカウンターの比較または変更が行われるずっと前に、不正なMACのためにコマンドが拒否されることです。
chromeおよびfirefoxはNPAPIプラグインのサポートを停止するため、カードの証明書が相互SSLをサポートする代わりにスマートカード読み取りのセッションを維持するための安全なソリューションはありません。同様の質問に対する回答 source 、It can help
Chromeについて言えば、PC/SC-Liteポートと汎用CCIDドライバーがバンドルされているGoogleが提供する スマートカードコネクタアプリ を使用できるようになりました。
アプリ自体は chrome.usb API を介して機能します。これは以前のコメント投稿者によって言及されました。
したがって、スタック全体を書き換えるのではなく(最低レベル-raw USBから開始)、開発者はコネクタアプリによって公開されるPC/SC API上で動作する部分のみをコーディングできるようになりました。
汚れていますが、クライアントマシンにブリッジデーモン/サービスをインストールするのに許容/実行可能であれば、スマートカードを公開するローカルブリッジサービス(たとえばpython/pyscard))を記述できますa RESTインターフェイス、その後、そのローカルサービス(ファサード)とリモートサーバーAPIを仲介するjavascriptをブラウザーに配置します。
この問題の別の解決策は FortifyApp と呼ばれます。その仕組みについて読むことができます here 。
TL; DR;これは、OSX、Windows、Linuxで動作するクライアントインストール可能なアプリケーションであり、他の証明書/キーストアへのアクセスも提供できるWeb暗号化ポリフィルを介してスマートカードを公開します。
Clients、clients、clients ... plugins、.. JSApis ..まあ..確かにこれを知っている:すべてのブラウザーは、ApacheまたはIISサーバーと通信するとき、実際に署名しています- something "https/SSLハンドシェイクプロセスが必要な場合。
たとえば、次のような典型的なApache構成:
SSLVerifyClient require
SSLVerifyDepth 10
SSLOptions +FakeBasicAuth +StdEnvVars +ExportCertData +OptRenegotiate
PINパッドポップアップを開始し、ユーザーは続行するためにスマートカードピンを挿入する必要があります。
さて、私の考えは次のとおりです。ハンドシェークが開始されたときに何かに署名するためにバイトストリームをアップロードするために、サーバーに向いて、その振る舞いを微調整してみませんか?
Javaアプレット、Active Xなどは、既に廃止されているか、新しいModern Browserから廃止されています。最近、WebCrypto APIについて多くのことが話題になっていますが、現時点では、WebCrypto APIは(Windows)またはその他のキーストアまたはローカル暗号USB /スマートカードデバイスへのアクセスを提供していません。
デジタル署名とPDFまたはeReturn署名を使用したブラウザからの認証の場合、そのような無料のChrome利用可能な拡張機能はSigner.Digital chrome =拡張機能。ローカルシステム(Windows上のchromeブラウザー)の背後で実行されているホスト)セットアップは、 https://signer.digital/downloads/Signer.Digital.Chrome.Hostからダウンロードできます。 .Setup.Zip このホストのインストールと再起動Chromeは自動的に追加されます Signer.Digital Chrome Extension
この拡張機能の実際の動作を説明します here
テスト手順:
USBトークンまたはスマートカードのデバイスドライバーをインストールします-これにより、Windows証明書ストアに証明書が作成されます。
上記のセットアップをインストールします。
再起動Chromeブラウザ。
開く このリンク
ユーザーIDとパスワードを入力して、Registerボタンをクリックします。これにより、デジタル署名を選択してサーバーに登録するように求められます(このセッションのみ-永続的ではありません)。
次に、同じユーザーIDとパスワードを再度入力し、同じ証明書を選択して、ログインをクリックします。別の証明書を選択すると、ログインが許可されません。
拡張機能からメソッドを呼び出すJavascript:
サーバーに証明書を登録するには:
//Get Selected Certificate Information
SignerDigital.getSelectedCertificate()
.then(
function (CertInfo) {
//Success returns Certificate Subject and Thumbprint
},
function (errmsg) {
//Send errmsg to server or display the result in browser.
}
);
デジタル署名を使用して認証またはログインするには:
SignerDigital.signAuthToken(authToken, "SHA-256") //or "SHA256"
.then(
function (SignData) { //Success returns Signed Auth Token
},
function (errmsg) {
//Send errmsg to server or display the result in browser.
}
);
PDFに署名するには:
//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.
}
);
失敗した場合:は「SDHost Error:」で始まるエラーメッセージを返します
ユーザーをログインするためにスマートカードリーダーをスキャンするセットアップがあります。 PC/SCライブラリは、デスクトップで最適に動作します。 c ++をJavaScriptコードにコンパイルするEmscripten( https://github.com/kripken/emscripten )コンパイラを使用することを誰かが言及していた。しかし、PC/SCで使用されている機能の一部はサーバー側でしか使用できないため、それはうまくいきませんでした。多くの研究の後。私は最終的にクライアント側のソリューションをあきらめました、chrome web usb APIもリーダーを認識できませんでした。
それから、signalRを試して、スマートカードリーダーに接続されたPCにハブをセットアップすることにしました。このアプローチは非常にうまくいきました。