2012-02-08 133 views
13

是否可以請求在瀏覽器中生成客戶端密鑰對,並將公鑰發送給服務器CA進行透明簽名?然後在用戶的瀏覽器中安裝簽名證書?在瀏覽器中生成客戶端證書並在服務器上簽名

場景:

  1. 用戶打開https://examle.com/網頁,服務器身份驗證
  2. 用戶請求的帳戶創建
  3. 密鑰對用戶的瀏覽器生成並沒有透露服務器/ CA
  4. PUBKEY被髮送到服務器簽署
  5. 服務器SIGNES密鑰和證書生成
  6. 證書發送到客戶端,並與私鑰一起安裝在瀏覽器中

下次客戶端連接到服務器時,他的身份將根據客戶端證書進行驗證。

這將是很好,如果服務器可能會迫使/提示客戶使用密碼加密來保護他的私鑰。

我見過使用Java applet進行此任務的網上銀行。是否可以使用本地瀏覽器功能來完成它? Apache/PHP或Node.js解決方案將受到歡迎。

回答

14

是的,這是可能的。雖然沒有跨瀏覽器的解決方案。

  • 對於Internet Explorer,你將不得不使用X509Enrollment.CX509EnrollmentWebClassFactoryCEnroll.CEnroll,取決於它是否對Windows XP或Vista/7上運行使用某些ActiveX控件。這將生成一個PKCS#10證書請求(您可能需要在傳統分隔符之間打包)。
  • 其餘的,您應該可以使用<keygen />標籤。它是傳統的Netscape標籤,以前不是正式的HTML標籤,但是它已經把它變成了HTML 5(儘管MS說他們不會支持它的實現),這將產生一個SPKAC結構(類似於CSR)。使用CRMF functions

Here is an example script應該做的最對ActiveX或註冊機的工作。

當服務器發回證書(可能稍後)時,瀏覽器應將其導入其存儲並將其與其在請求時生成的私鑰相關聯。

如何私鑰保護將取決於瀏覽器或潛在的證書存儲機制。例如,在Firefox中,安全設備上應該有一個主密碼。

在服務器端,您可以使用各種工具實現自己的CA. OpenSSL和BouncyCastle可以處理PKCS#10和SPKAC。這是一個BouncyCastle-based example(與上面的腳本相關)和some code for CRMF

如果你想要一個現成的解決方案,你可能會喜歡OpenCA

+0

我如何使用私鑰解密數據(在HTML5/kegen-tag的情況下)? – MhdSyrwan 2013-11-12 23:51:35

+2

''元素根據[W3C](http://w3c.github.io/html/sec-forms.html#elementdef- keygen),[WHATWG](https://html.spec.whatwg)棄用.org/multipage/forms.html#the-keygen-element)和[MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/keygen),並在Chrome中被故意禁用從版本49開始。 – 2016-04-21 15:44:39

相關問題