【问题标题】:Tomcat 7 Access Log with Client Certificate Subject Name带有客户端证书主题名称的 Tomcat 7 访问日志
【发布时间】:2016-04-13 13:32:18
【问题描述】:

我正在尝试在我的 tomcat 访问日志文件中包含客户端证书信息。

我已经查看了这篇文章:https://serverfault.com/questions/624790/tomcat-log-the-equivalent-of-ssl-client-s-dn,但这只会返回对证书的引用,我实际上无法提取任何属性。

我的日志文件模式如下所示:

pattern="... [%{javax.servlet.request.X509Certificate}r]"

返回:[[Ljava.security.cert.X509Certificate;@667a078]

有没有办法像这样访问证书属性:

pattern="... [%{javax.servlet.request.X509Certificate.SubjectName}r]"

我希望能够在不修改任何代码的情况下提取证书信息。

【问题讨论】:

  • 你有没有想过如何在不修改任何代码的情况下做到这一点?
  • 遗憾的是没有。最终在其他地方终止客户端证书并转储到 splunk。

标签: apache tomcat ssl logging client-certificates


【解决方案1】:

如果您使用该主题名称对用户进行身份验证,那么我认为您可以使用“%u”记录用户名

如果您需要其他任何内容,您需要编写一个javax.servlet.FilterServletRequestListener,将该值设置为ServletRequest 上的一个属性。该值可以是任何实现 toString() 的对象。

javax.servlet.request.X509Certificate 请求属性是一个证书数组,在 Servlet Specification ch.3.9 SSL Attributes (Servlet Spec 3.1) 中定义

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。我想出的唯一方法是覆盖 AccessLogValve。

    1. 创建一个简单的 maven java 项目
    2. <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-catalina</artifactId> <version>x.x.x</version> <scope>provided</scope> </dependency>
    3. 覆盖 AccessLogValve 并实施
      @Override public void log(Request request, Response response, long time) {
    4. 从请求中的 X509Certificate 中读取您的主体(不幸的是,我无法共享此代码) request.setUserPrincipal(xyz)
    5. 包装罐子
    6. 将其复制到您的 tomcat lib 文件夹中
    7. 修改 server.xml 以使用你的 Valve,用你的替换 Valve 类

      <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"-->

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      相关资源
      最近更新 更多