keygen タグは、ブラウザーに秘密鍵を生成させるために使用され、POST結果のCSRをサーバーに送信し、サーバーが証明書を発行できるようになりました。現在は 非推奨 、かなり愚かな理由のためですが、それは要点の外です。
では、ブラウザがクライアント証明書を取得するための代替手段は何ですか?
Chromiumフォーラムのこの投稿 に代替案があります
ブラウザスペース内には、次のような選択肢があります。
- 企業のユースケースの場合は、デバイスのネイティブ管理機能を使用します。 Windowsでは、これはグループポリシーです。 iOS/Androidでは、これはモバイルデバイス管理スイートです。 OS Xでは、これはエンタープライズ設定です。 ChromeOSには、企業が管理する拡張機能用のchrome.enterprise.platformKeys [11]があります。
- WebCryptoを使用して証明書の登録を実装し、証明書と(エクスポートされた)秘密鍵をプラットフォーム(PKCS#7など)に適した形式で配信し、ネイティブOS UIが証明書と鍵のインストールを通じてユーザーをガイドできるようにします。
WebCryptoは多くのブラウザでサポートされています: [link]
また、openpgp.jsやその他のソリューションを使用できます。 [openpgp.js]
ここ はいくつかの例です。
CSRを生成することもできます: https://www.w3.org/community/webcryptoapi/draft/#generatecertrequest-method
CSRを生成するためのいくつかのライブラリ: https://pkijs.org/
次に、自己署名されたX509証明書とキーペアを生成するためのPKIjsの例を示します。
https://github.com/infotechinc/create-x509-certificate
generateKey()
関数はキーペアを作成します。
https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#SubtleCrypto-method-generateKey
WebCrypto API仕様 で確認されているように、現在、WebCrypto APIはkeygenタグの代替手段ではありません。
このAPIは、アプリケーションがキー情報を生成、取得、および操作できるようにしますが、セキュリティで保護された要素やスマートカードなどの特定の種類のキーストレージでのキーのプロビジョニングには特に対応していません。これは、そのようなプロビジョニング操作が、ベンダーに依存しないインターフェースの定義を不適切に無制限のタスクにするベンダー固有の詳細に負担がかかることが多いためです。さらに、このAPIは暗号化モジュールの検出を処理または処理しません。そのような概念は、基盤となるユーザーエージェントに依存し、一般的なオペレーティングシステム、暗号化ライブラリ、および実装間で移植可能な概念ではないためです。
すでに<keygen>
ベースのセットアップがあり、それを使い続けたい場合は、<keygen>
のJavaScriptポリフィルを実装しようとするプロジェクトを作成しました。
この時点(2017年4月)で、ネイティブアプリを作成する必要がありました。 FireFoxのみがkeygenタグで動作します。また、どのJavaScriptライブラリを使用していても、証明書をWindowsにインポートできないため、たとえばChromeから使用できます。
これ は、現在の状況を非常によくまとめています。
KEYGENはFirefoxで動作し、Mozillaはこれをサポートすることを約束しましたが、Chromeは適切な代替なしで問題なく削除しました。
完全にクロスブラウザーであるWebベースのクライアント証明書ユーティリティを作成しました(最新のブラウザーが必要です)。これにより、ユーザーはシングルパスワード認証とシングルクリック認証を行うことができます。キーは単一のパスワードで暗号化されるため、<keygen>
キーよりも少し安全です(これらはパスワードで保護されていないため)。ユーザーは最終的に、異なるWebサイトで異なる、または同じサイト間で切り替えられる複数のIDを作成して使用できるようになります。また、完全にjavascriptを介して制御されるため、ページをロードする直前だけでなく、いつでも好きなときに誰かを認証できます。
ここで確認してください: https://github.com/webkey-auth/webkey-auth.github.io