如果不可能,我可以简单地打开一个文件对话框并将客户端证书作为任何标准文件上传吗?
首先,这根本不是 SSL/TLS 客户端身份验证的工作方式。这根本不是上传证书的问题。与证书匹配的私钥用于在 TLS 握手期间对某些内容(在CertificateVerify TLS 消息中)进行签名。这就是执行身份验证的内容。
回到您的主要问题,出于安全原因,SSL/TLS 堆栈是在 JavaScript 代码范围之外处理的。选择客户端证书是其中的一部分。
您可能拥有某种 API 来让 JavaScript 代码访问浏览器的某些加密功能(以及 there has been work in this area)。但是,需要考虑安全因素。
即使证书仅在一定程度上包含公共信息,但这并不意味着它是要分发给世界上任何人的公共信息,至少不一定与浏览任何网站的行为一起。
如果您能够从服务器发送的 JavaScript 代码中列出用户的证书列表,那么您肯定能够通过 Ajax 调用几乎透明地将该列表发回给您自己。虽然有些人担心被 cookie 跟踪对隐私的影响,但被您可能拥有的客户端证书跟踪到另一个层次(例如,CN=John Smith 的主题 DN 和 CN=Department/Ministry of Health/Defence 的颁发者 DN:这有点赠品)。
我的 Web 应用程序不需要 SSL,需要 SSL 证书的是第三方。
在这里,您并不是说该第三方是否直接由用户的浏览器访问,或者您是否希望用户委托他们的凭据让您与该第三方进行交互(无需用户直接参与)。
如果用户可以直接访问该第三方(通过另一个请求),他们的浏览器应该提示他们输入他们要使用的证书。
如果是关于凭证委托,那完全是另一个问题,因为用户永远不会向您提供他们自己的客户端证书的私钥,以便能够以他们的名义登录。 (例如,从技术上讲,用户可能只给你他们的 PKCS#12 文件,但它破坏了首先建立这种身份验证的意义)。
已经完成了关于使用proxy certificates (RFC 3820) 的证书进行身份验证委托的工作。本质上,您的 EEC(最终实体证书)用作迷你 CA,尽管没有 CA 标志,但远程方将接受颁发短期证书。这种机制通常没有很好地集成在浏览器中。
例如,另一种更现实的方法是研究 SSO、SAML 和 Shibboleth 的世界。这确实适用于现有浏览器,但整体架构有点不同(因此您需要与第三方讨论)。