带有客户端证书主题名称的 Tomcat 7 访问日志
Posted
技术标签:
【中文标题】带有客户端证书主题名称的 Tomcat 7 访问日志【英文标题】:Tomcat 7 Access Log with Client Certificate Subject Name 【发布时间】: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.X509Certificater]"
返回:[[Ljava.security.cert.X509Certificate;@667a078]
有没有办法像这样访问证书属性:
pattern="... [%javax.servlet.request.X509Certificate.SubjectNamer]"
我希望能够在不修改任何代码的情况下提取证书信息。
【问题讨论】:
你有没有想过如何在不修改任何代码的情况下做到这一点? 遗憾的是没有。最终在其他地方终止客户端证书并转储到 splunk。 【参考方案1】:如果您使用该主题名称对用户进行身份验证,那么我认为您可以使用“%u
”记录用户名
如果您需要其他任何内容,您需要编写一个javax.servlet.Filter
或ServletRequestListener
,将该值设置为ServletRequest
上的一个属性。该值可以是任何实现 toString() 的对象。
javax.servlet.request.X509Certificate
请求属性是一个证书数组,在 Servlet Specification ch.3.9 SSL Attributes (Servlet Spec 3.1) 中定义
【讨论】:
【参考方案2】:我遇到了同样的问题。我想出的唯一方法是覆盖 AccessLogValve。
-
创建一个简单的 maven java 项目
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>x.x.x</version>
<scope>provided</scope>
</dependency>
覆盖 AccessLogValve 并实施@Override
public void log(Request request, Response response, long time)
从请求中的 X509Certificate 中读取您的主体(不幸的是,我无法共享此代码)
request.setUserPrincipal(xyz)
包装罐子
将其复制到您的 tomcat lib 文件夹中
修改 server.xml 以使用你的 Valve,用你的替换 Valve 类
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"-->
【讨论】:
以上是关于带有客户端证书主题名称的 Tomcat 7 访问日志的主要内容,如果未能解决你的问题,请参考以下文章