【问题标题】:In a browser environment, is it possible to obtain list of SSL certificates in JavaScript?在浏览器环境中,是否可以在 JavaScript 中获取 SSL 证书列表?
【发布时间】:2015-09-10 15:36:55
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

    标签: javascript ssl openssl ssl-certificate


    【解决方案1】:

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

    首先,这根本不是 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 的世界。这确实适用于现有浏览器,但整体架构有点不同(因此您需要与第三方讨论)。

    【讨论】:

    • 是的,这是凭证委托的问题。要求是让用户选择一个其客户端证书并将其共享给第三方。
    • 客户端证书根本不是要走的路。您可以查看 MyProxy and related browser add-ons 之类的东西来获取代理证书,但这需要各方付出一些努力才能与之集成。 (大多数服务器默认不接受代理证书。)
    【解决方案2】:

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

    【讨论】:

    • IE 上的 ActiveX 怎么样?我不会那么平坦
    • AFAIK,你可以在浏览器中做一些不是严格意义上的“DOM”的事情。客户端证书只是一个不同的问题。
    • WebCrypto 怎么样?它具有发现/枚举功能。
    【解决方案3】:

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

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

    我看到过去曾讨论过它并提出了一个问题。这是讨论:Crypto-ISSUE-15: Discovering certificates associated with (private) keys。但我在WebCrypto Tracker 中找不到关于第 15 期的任何内容。

    另请参阅WebCrypto Mailing list 上的Will the WebCrypto API allow discovery/enumeration of certificates? 问题。希望会有一个简单的“是/否”答案。

    但是,如果它不能通过 WebCrypto 获得,请不要感到惊讶。浏览器安全工程师有一种特殊的看待事物的方式,通常不包括客户端证书。客户端证书将有效地阻止 MitM 攻击(例如,参见 Origin Bound Certificates),并且浏览器不会优先考虑阻止 MitM。相反,他们可以处理错误的凭据,例如密码;他们选择使用 U2F 的一次性密码 (OTP)。

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

    【讨论】:

    • "浏览器不会优先阻止 MitM":这有点不公平,在过去几年中已经尝试过解决这些问题(例如 HSTS ,尝试提供更好的 UI、EV 证书……),尽管并非所有这些都必须做得那么好或出于正确的原因。只是它通常是一个很难解决的问题。根据我的经验(几年前),大多数用户(甚至是相当具有 IT 知识的用户)发现处理客户端证书过于混乱或痛苦(除了潜在的隐私问题)。它们可以很好地工作,但我看不出它们普遍适用。
    • @Bruno - 他们声称由于Priority of Constituencies,网络钓鱼用户是一个有效的用例。我对写入 Public Key Pinning for HTTPOverrides 表示异议,并在 IETF 邮件列表中表示(遗憾的是,为时已晚):“只是不清楚我(目前)如何破解已知良好的 pinset 以促进在提议的安全控制标准中进行代理/拦截,以阻止这种有趣的业务。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 2017-07-12
    • 2016-08-24
    • 2011-01-25
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多