我正在尝试编写一个小型 Java 应用程序,通过客户端证书对用户进行身份验证。 我在 Tomcat 中看到我可以在领域描述符中指定 X509UsernameRetrieverClassName 以告诉 tomcat 使用我自己实现的将 X509 证书映射到用户名的函数。 唯一不起作用的是它没有找到我指定的类,即使我有一个包并且直接在实现函数 org.apache.catalina.realm.X509UsernameRetriever 的类中。 经过大量谷歌搜索后,我仍然没有找到这个问题的任何答案。
如有任何帮助,我们将不胜感激!
更新:
我在 webapp 的 context.xml 文件中配置了这个类:
<?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 库中。
最佳答案
我在几年前的一份契约(Contract)中使用 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) 在 Tomcat 的 lib 目录中包含这个新的 Catalina.jar 文件。
我不记得我是否将自定义实现保留在同一个包中。我发现关键是将自定义实现放入 Tomcat 可以使用的自定义 Catalina.jar 中。也可以导出引用 Catalina 的独立 jar 并将其导入您的 Tomcat 容器。
无论如何,我希望这在某种程度上有所帮助,祝你好运。
关于java - 未找到类异常 X509UsernameRetrieverClassName Tomcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36986479/