Java 使用wildfly提供的bouncycastle

Java 使用wildfly提供的bouncycastle,java,x509certificate,bouncycastle,wildfly-8,pfx,Java,X509certificate,Bouncycastle,Wildfly 8,Pfx,我正在尝试用Bouncy Castle解密一些私钥(.pfx X509Certificate)。 如果我独立运行代码(junit),它工作得很好,但是当我在wildfly上运行它并将arquillian部署为war文件时,我面临一些问题: org.jboss.arquillian.test.spi.ArquillianProxyException: javax.ejb.EJBException : JBAS014580: Unexpected Error [Proxied because :

我正在尝试用Bouncy Castle解密一些私钥(.pfx X509Certificate)。 如果我独立运行代码(junit),它工作得很好,但是当我在wildfly上运行它并将arquillian部署为war文件时,我面临一些问题:

org.jboss.arquillian.test.spi.ArquillianProxyException: javax.ejb.EJBException : JBAS014580: Unexpected Error 
[Proxied because : Original exception caused: class java.lang.ClassFormatError: Absent Code attribute in method 
that is not native or abstract in class file javax/ejb/EJBException]
我认为arquillian封装了真正的异常,但日志文件中不再出现错误

在pom文件中,我声明它为提供的,以使用提供的版本

安装的版本包括:

$WILDFLY_HOME\modules\system\layers\base\org\bouncycastle\main\bcmail-jdk15on-1.50.jar
$WILDFLY_HOME\modules\system\layers\base\org\bouncycastle\main\bcpkix-jdk15on-1.50.jar
$WILDFLY_HOME\modules\system\layers\base\org\bouncycastle\main\bcprov-jdk15on-1.50.jar
我还尝试使用pom文件中直接指定的版本bcprov-jdk16,其作用域为compile/runtime,但无论如何它都不起作用

错误具体发生在这一点上:

org.bouncycastle.x509.extension.X509ExtensionUtil.getIssuerAlternativeNames(java.security.cert.X509Certificate);

X509ExtensionUtil.getIssuerAlternativeNames(certificate) = >Unknown type "org.bouncycastle.x509.extension.X509ExtensionUtil"<
org.bouncycastle.x509.extension.X509ExtensionUtil.getIssueralInternativeNames(java.security.cert.X509Certificate);
X509ExtensionUtil.getIssueralInternativeNames(证书)=>未知类型“org.bounchCastle.x509.extension.X509ExtensionUtil”<

其他人有过这个问题,或者知道我如何解决它吗?有什么提示吗?

我只使用java 8 api解决了我的问题,如下所示:

Collection<?> altNames = certificate.getSubjectAlternativeNames();
        for (Object i : altNames) {
            List<Object> item = (java.util.List) i;
            Integer type = (Integer) item.get(0);
            try {
                if (type > 0) {
                    continue;
                }
                String[] arr = StringEscapeUtils.escapeHtml(new String((byte[]) item.get(1))).split(";");
                return Arrays.asList(arr)
                        .stream()
                        .map(k -> k.trim())
                        .filter(u -> isCNPJ(u))
                        .findFirst().get();
            } catch (Exception e) {
                LOG.error(e.getMessage(), e);
            }
        }
        return null;
Collection altNames=certificate.getSubjectAlternativeNames();
用于(对象i:AltName){
列表项=(java.util.List)i;
整数类型=(整数)项。获取(0);
试一试{
如果(类型>0){
持续
}
String[]arr=StringEscapeUtils.escapeHtml(新字符串((字节[])项.get(1)).split(“;”);
返回数组.asList(arr)
.stream()
.map(k->k.trim())
.过滤器(u->isCNPJ(u))
.findFirst().get();
}捕获(例外e){
LOG.error(e.getMessage(),e);
}
}
返回null;
isCNPJ只是一个只过滤我需要的值的方法。 StringEscapeUtils是一个ApacheCommonsLang类