【问题标题】:Class Not Found Exception X509UsernameRetrieverClassName Tomcat找不到类异常 X509UsernameRetrieverClassName Tomcat
【发布时间】:2016-05-02 15:47:09
【问题描述】:

我正在尝试编写一个通过客户端证书对用户进行身份验证的小型 Java 应用程序。 我在 Tomcat 中看到我可以在领域描述符中指定 X509UsernameRetrieverClassName 来告诉 tomcat 使用我自己实现的将 X509 证书映射到用户名的函数。 唯一不起作用的是它找不到我指定的类,即使我有一个包并且直接在实现函数 org.apache.catalina.realm.X509UsernameRetriever 的类中。 在谷歌上搜索了很多之后,我仍然没有找到这个问题的任何答案。

任何帮助将不胜感激!

更新:

我在我的 context.xml 文件中为 webapp 配置这个类:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/">
    <Realm className="org.apache.catalina.realm.MemoryRealm"
           X509UsernameRetrieverClassName="com.packagename.UserFromCert"
           pathname="conf/tomcat_users.xml"/>
</Context>

我已经实现了这个类(仅用于测试)

package com.packgename;

import java.security.cert.X509Certificate;

public class UserFromCert implements org.apache.catalina.realm.X509UsernameRetriever {

    @Override
    public String getUsername(X509Certificate x509Certificate) {
        System.out.println(x509Certificate.getSubjectDN().toString());
        System.out.println(x509Certificate.getSubjectX500Principal().getName());
        return x509Certificate.getSubjectDN().toString();
    }
}

我试图实现的类在 tomcat 库中。

【问题讨论】:

  • 如果包含 Tomcat 配置文件可能会有所帮助。另外,这个实现类是怎么包含的?它在战争中吗?是在Tomcat的lib目录下吗?
  • 你把你的课放在哪里了?在你的战争中?
  • 我把我的课直接放在包里了。我猜它被部署到了战争中的tomcat。

标签: java tomcat authentication servlets client-certificates


【解决方案1】:

几年前,我在之前的合同中使用 Tomcat 6.0 做了一些非常相似的事情。我的记忆有点模糊,我留下了代码(抱歉!),但我希望这有助于引导您(或其他人)朝着正确的方向前进。

我所做的是:

1) 将 Catalina 源代码导入 Eclipse
2) 在同一个项目的新文件中创建您需要的新类——我的自定义实现是将证书的可分辨名称中的值映射到用户名:

package org.apache.catalina.realm;
import java.security.cert.X509Certificate;

public class CustomX509SubjectDnMapper implements X509UsernameRetriever {

    public String getUsername(X509Certificate clientCert) {
        return clientCert.getSubjectDN().getName().toLowerCase();
    }
}

3) 将代码导出到新的 Catalina.jar 文件
4) 将这个新的 Catalina.jar 文件包含在 Tomcat 的 lib 目录中。

我不记得我是否将自定义实现保存在同一个包中。我发现关键是将自定义实现放入 Tomcat 可以使用的自定义 Catalina.jar 中。也可以导出一个引用 Catalina 的独立 jar 并将其导入到您的 Tomcat 容器中。

无论如何,我希望这对你有所帮助,祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2011-09-13
    • 2012-04-12
    • 1970-01-01
    • 2020-06-13
    • 2016-06-19
    • 2010-12-03
    相关资源
    最近更新 更多