编辑:我意识到这可能从下面的答案中不清楚......但从您的应用程序的角度来看,无论您自己运行 PKI/CA 还是使用一个或多个,都没有任何区别第三方 CA。即使您选择运行自己的 PKI,您也真的不想自己编写代码 - 因此您会使用现有的其中一个,它在逻辑上与应用程序是分开的,并且与 CA 的任何交互都将通过通常的协议。编辑结束
我真的应该自己操作 PKI 并颁发证书吗?
作为一般规则,除非您已经知道如何运行 PKI,否则您不应该这样做。它比你想象的要复杂得多,而且事情可能出错的方式也更多。即使是以 PKI 为核心业务的公司有时也会出错;参见Diginotar,他们的证书基础设施遭到黑客攻击并最终破产。
允许第三方证书,尤其是多个 CA 的证书,有其自身的缺陷。我有一张智能卡,其中包含我用来访问我的银行和几个政府网站的电子 ID。但我可能还有一个“软”证书,用于访问其他内容。如果您的站点接受这两个证书颁发机构,您是否有办法知道这两个证书指的是同一个人(或用户)?您希望每个证书拥有一个用户,还是希望一个用户能够使用多个证书?证书过期时会发生什么 - 你怎么知道我的新证书仍然指向我?在设计应用程序和信任链时,需要仔细考虑这些问题。
有没有办法让它们的行为就像 SSH 密钥一样,用户在注册期间提供任何密钥并且该密钥绑定到帐户?
这只是编程的一个小问题......(换句话说,不是那么小,但并非不可能。)您可能还需要一些方法让用户也可以添加/删除证书。
关于在我的应用程序中验证它们,我发现的大多数文档都使 Web 服务器根据 CA(在这种情况下是我自己的 CA,这使我们回到 PKI 问题)检查证书,并在证书受信任时设置环境变量...这在我的情况下不起作用,因为我想摆脱 CA 并让客户提供他们自己的证书,所以基于我不能依赖于检查它们与 CA 的事实,什么我可以检查它们吗?客户端证书是否具有相当于我可以存储在我的数据库中并检查的 SSH 公钥?
您不会保存整个证书,您只需保存足够的信息,以便下次用户出示证书时可以验证该证书。这通常是证书序列号、CN 和颁发 CA。您可能还想存储到期日期,以便提醒用户在证书到期之前更新他们的证书。(这当然可以在您在登录时检查他们的证书时完成,但存储数据可能是明智的,这样您就可以通过电子邮件发送提醒,以防他们在收到警告期间没有登录。)
即使证书是由第三方 CA 颁发的,证书也会包含有关如何验证其有效性的信息。这通常是通过 OCSP(在线证书状态协议)进行的,它是对颁发 CA 的数据库的实时检查。还有 CRL,一个证书撤销列表,其中包含 CA 撤销哪些证书的信息。这不是实时的;CRL 将每隔一段时间重新发布一次。
最后,新客户将如何注册我的网站;他被要求出示证书,但他没有,他如何生成证书?
如果您选择使用第三方 CA,则应向他们提供指向您信任的一个或多个 CA 的链接。
如果您运行自己的 CA,您将向他们提供指向该 CA 的链接,该链接必须配置为允许(以前)匿名用户以及现有用户请求新证书。
最后,如果您想了解如何设置 PKI,可以尝试EJBCA,一种开源 CA/VA。它将使您对所涉及的复杂性有一个基本的了解。