我想使用证书限制对 Tomcat 实例的 SSL 访问,而不依赖任何“用户”帐户。
我有一个用于签署证书的 CA,但如果我将 Tomcat 配置为信任该 CA,那么它就会信任任何人由它签名,而我希望更加严格并且只允许我已批准该特定用途的证书(即,对于我在该服务器上运行的应用程序)。
在我看来,这正是 X.509 的扩展密钥用法部分的用途,我可以创建将该字段定义为自定义值的证书,但我不知道是否有任何方法可以让 Tomcat 关注该字段并仅允许某些用法。有人知道怎么做吗?即使是 Apache httpd 的指针也会很有用,因为我可以在紧急情况下将 Tomcat 置于 https 前端后面。
答案1
这无法在 tomcat 的 SSL 层使用 extendedKeyUsage 完成。mod_ssl(来自 APR)仅允许您使用 SSLRequire 执行此操作,但由于这在服务器范围内无效,因此将被忽略。我不认为非 APR 实现支持这一点,因为我根本没有看到任何证据。
最好的情况下,您可以在 servlet 中自己查看证书(假设它向您公开了证书;我不确定如何做到这一点),然后在那里检查扩展。
但是,您尝试做的事情并不典型。通常的做法是创建自己的信任根(不信任浏览器信任根或任何东西)并使用它来颁发客户端证书。它们需要是客户端证书(带有 clientAuth,如果是 v3,则带有相应的 EKU),但其他任何内容都不必特殊。您可以合理地依赖 DN 来识别用户。
答案2
Apache 特定的东西,因为我用它比直接用 tomcat 舒服得多——
证书使用情况未在SSL 环境变量列表Apache 默认提供此功能。但它好像SSLRequire
你可以使用这样的自定义:
SSLRequire "certUsageSSLClient" in PeerExtList("SECCertUsages")
我相信这些名称是正确的,但是如果短名称与您的 ssl 实现所期望的不完全一致,您可能需要深入研究那里的 OID。
http://www.mozilla.org/projects/security/pki/nss/tech-notes/tn3.html