Tomcat 7使用客户端证书访问日志主题名称

时间:2016-01-08 19:08:16

标签: apache tomcat ssl logging client-certificates

我正在尝试在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]"

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

2 个答案:

答案 0 :(得分:0)

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

记录用户名

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

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

答案 1 :(得分:0)

我有同样的问题。我发现的唯一方法是覆盖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. 从请求中的X509证书中读取您的委托人(不幸的是,我无法共享此代码) request.setUserPrincipal(xyz)
  5. 包装罐子
  6. 将其复制到您的tomcat lib文件夹中
  7. 修复server.xml以使用Valve,用您的Valve替换Valve类

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