找不到类异常X509UsernameRetrieverClassName Tomcat

时间:2016-05-02 15:47:10

标签: java tomcat authentication servlets client-certificates

我正在尝试编写一个小型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库中。

1 个答案:

答案 0 :(得分:0)

几年前,我在之前的合同上做过与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容器。

无论如何,我希望这有助于一些能力和好运。