Java 具有Glassfish3/4或Tomcat 8和自签名证书的双向(相互)SSL

Java 具有Glassfish3/4或Tomcat 8和自签名证书的双向(相互)SSL,java,tomcat,ssl,x509certificate,mutual-authentication,Java,Tomcat,Ssl,X509certificate,Mutual Authentication,我试图实现双向(相互)SSL身份验证,但在Glassfish3/4和Tomcat 8服务器上(stacktrace来自Tomcat 8)经常会出现以下异常: 经过长时间的搜索,我只在JBoss上找到了同样的问题。这真的与密钥/信任库中条目的大小/数量有关吗?我现在存储了大约66.000个证书,但随着开发的进行,我们预计会有更多的证书(比如数十万个) 由于密钥库几乎为空(其中只有服务器和一个测试客户端证书),使用curl测试SSL连接是成功的 更新 好吧,我想我发现它确实与truststore有关

我试图实现双向(相互)SSL身份验证,但在Glassfish3/4和Tomcat 8服务器上(stacktrace来自Tomcat 8)经常会出现以下异常:

经过长时间的搜索,我只在JBoss上找到了同样的问题。这真的与密钥/信任库中条目的大小/数量有关吗?我现在存储了大约66.000个证书,但随着开发的进行,我们预计会有更多的证书(比如数十万个)

由于密钥库几乎为空(其中只有服务器和一个测试客户端证书),使用
curl
测试SSL连接是成功的

更新

好吧,我想我发现它确实与truststore有关。以下是来自
sun.security.ssl.HandshakeMessage.CertificateRequest
的代码片段:

        // put certificate_authorities
        int len = 0;
        for (int i = 0; i < authorities.length; i++) {
            len += authorities[i].length();
        }

        output.putInt16(len);
//放置证书\u权限
int len=0;
for(int i=0;i

异常是在
putInt()
方法中触发的,因此我假设我确实存储了太多的证书。我现在正在生成自签名证书,因此我必须将生成的每个证书作为CA放在服务器上,以信任客户端,这一定是问题所在。现在的问题是,有没有一种方法可以从Java生成非自签名的证书(例如,我可以使用glassfish的自签名证书作为CA?或者我可以吗?

好的,我通过创建证书,将颁发者设置为服务器自己的证书(在glassfish中,特别是别名为
s1as
来实现这一点)并使用服务器的私钥对其进行签名。现在,我不必在服务器上存储任何内容,因为它可以识别客户机,因为它知道他们的颁发者是其信任库中的CA(本质上是它自己)。

如果我正确理解您的问题,理想情况下,你需要使用你公司的证书,或者如果你没有证书,请为你的域名免费生成一个证书,使用诸如Refer:是的,我想我需要这样的网站;现在,我将尝试使用Glassfish的自动生成、自签名证书。我将把客户端证书的颁发者设置为Glassfish证书,并使用Glassfish私钥对客户端证书进行签名。它似乎在本地工作,现在我正在将其部署到live server,以查看它是否也适用于真正的客户端!和。
        // put certificate_authorities
        int len = 0;
        for (int i = 0; i < authorities.length; i++) {
            len += authorities[i].length();
        }

        output.putInt16(len);