在浏览器环境下,是否可以获取JavaScript中的SSL证书列表?

In a browser environment, is it possible to obtain list of SSL certificates in JavaScript?

为了连接到第三方应用程序,我必须让我的用户能够 select 他们安装的 SSL client certificates 之一,并将其​​传输给第三方使用应用服务器。 (我的web应用不需要SSL,需要SSL证书的是第三方)。

在我看来,访问此证书列表是 only possible by the browser itself when connecting to a service that require SSL。是否可以通过 Javascript 启动相同的对话框,或者 Web 应用程序是否可以通过任何方式浏览最终用户的 SSL 存储?

如果不可能,我可以简单地打开一个文件对话框并将客户端证书作为任何标准文件上传吗?

我必须支持 IE9 以上的任何浏览器,并且我们的应用程序中不允许使用任何插件。

谢谢。

证书不是 DOM 的一部分,所以不,这是不可能的。

If it is not possible, can I simply open a file dialog box and upload the client certificate as any standard file ?

首先,这根本不是 SSL/TLS 客户端身份验证的工作方式。这根本不是上传证书的问题。与证书匹配的私钥用于在 TLS 握手期间对某些内容(在 CertificateVerify TLS 消息中)进行签名。这就是执行身份验证的原因。

回到您的主要问题,出于安全原因,SSL/TLS 堆栈在 JavaScript 代码的范围之外处理。选择客户端证书是其中的一部分。

您可能有某种 API 让 JavaScript 代码访问浏览器(和 there has been work in this area)的某些加密功能。但是,需要考虑安全因素。

即使证书在某种程度上仅包含 public 信息,但这并不意味着它是要分发给世界上任何人的 public 信息,至少不一定与浏览任何网站的行为。

如果您能够从服务器发送的 JavaScript 代码中列出用户的证书列表,您肯定能够使用 Ajax 呼叫。虽然有些人担心被 cookie 跟踪对隐私的影响,但被您可能拥有的客户端证书跟踪到另一个级别(例如,带有 CN=John Smith 的主题 DN 和带有 CN=Department/Ministry of Health/Defence 的发行人 DN:会有点赠品)。

My web application does not require SSL, it is the third party that require SSL certificates.

在这里,您并不是说该第三方是否可以通过用户的浏览器直接访问,或者您是否希望用户委托他们的凭据供您与该第三方交互(无需用户直接参与)。

如果用户可以直接访问该第三方(通过另一个请求),他们的浏览器应提示他们提供他们要使用的证书。

如果是关于凭据委托,那完全是另一个问题,因为用户永远不会向您提供他们自己的客户端证书的私钥,以便能够以他们的名义登录。 (例如,用户仅向您提供他们的 PKCS#12 文件在技术上可能是可行的,但它破坏了首先建立这种身份验证的意义)。

关于使用 proxy certificates (RFC 3820) 的证书进行身份验证委托的工作已经完成。本质上,您的 EEC(最终实体证书)被用作迷你 CA,尽管没有 CA 标志,但可以颁发一个短期证书,远程方将接受。这种机制在浏览器中一般没有很好的集成。

另一种更现实的方法是研究 SSO、SAML 和 Shibboleth 等世界。这确实适用于现有的浏览器,但整体架构有点不同(因此您需要与第三方讨论)。

In a browser environment, is it possible to obtain list of SSL certificates in JavaScript?

WebCrypto API 可以让您发现一些东西,例如共享密钥和派生密钥。但是看看他们的章程和用例,我不清楚他们是否允许枚举和发现证书。

我看到过去曾对此进行过讨论并提出了一个问题。这是讨论:Crypto-ISSUE-15: Discovering certificates associated with (private) keys. But I can't find anything on Issue 15 in the WebCrypto Tracker.

另见 Will the WebCrypto API allow discovery/enumeration of certificates? question on the WebCrypto Mailing list。希望会有一个简单的 YES/NO 答案。

但是,如果它不能通过 WebCrypto 获得,请不要感到惊讶。浏览器安全工程师有一种特殊的看待事物的方式,而且通常不包括客户端证书。客户端证书将有效地阻止 MitM 攻击(参见,例如,Origin Bound Certificates), and browsers don't make stopping MitM a priority. Instead, they are OK with mishandling credentials like passwords; and they opt for a One Time Password (OTP) using U2F.

在比小说更离奇的现实中,浏览器甚至会 (1) 使用 Public Key Pinning for HTTP,然后 (2) 破坏已知的良好 pinset,因为用户被钓鱼了!你不能编造这些东西...