带有客户端证书主题名称的 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.FilterServletRequestListener,将该值设置为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 访问日志的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat配置HTTPS访问

TOMCAT配置HTTPS双向认证,为啥始终无法访问

在 Tomcat 中读出传入的证书

带有嵌入式清单的 C# 4.0 应用程序是不是需要在客户端计算机上安装数字证书或强名称?

[svc]证书各个字段的含义

Tomcat 8 中的 SSL:服务器和客户端 JKS + 客户端公共证书