java - 在 Java HttpsServer 中使用 Positive SSL Multi-Site Cert 时出现问题

标签 java web-services ssl

我正在尝试将 comodo Positive SSL Multi-Site 证书加载到 Java 的 HttpsServer 中。我没有从代码中收到任何错误,但是当我尝试在浏览器中访问 URL 时,它告诉我存在 SSL 错误。 Chrome 和 FireFox 均未提供任何其他信息。该证书在 Apache 中运行良好。

下面是我使用的代码。我已经说得很详细了。有什么不正确的地方吗?我已经将私钥转换为 pkcs8 以便导入。我正在加载的证书和包是 PEM 编码的。

serverHttps = HttpsServer.create(new InetSocketAddress(ports[port_selector]), 0);
SSLContext sslContext = SSLContext.getInstance("TLS");

String alias = "alias";

// Load Certificates
InputStream stream = MyClass.class.getResourceAsStream("/certs/mycert.crt");
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate)cf.generateCertificate(stream);
stream.close();

stream = MyClass.class.getResourceAsStream("/certs/bundle.crt");
cf = CertificateFactory.getInstance("X.509");
Collection bundle = cf.generateCertificates(stream);
stream.close();

// Build cert chain
java.security.cert.Certificate[] chain = new Certificate[bundle.size()+1];
Iterator i = bundle.iterator();
int pos = 0;
while (i.hasNext()) {
    chain[pos] = (Certificate)i.next();
    pos++;
}
chain[chain.length-1] = cert;

// Load private key
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
stream = MyClass.class.getResourceAsStream("/certs/pkcs8_my_key");
PKCS8EncodedKeySpec pkcs8 = new PKCS8EncodedKeySpec(IOUtils.toByteArray(stream));
RSAPrivateKey privKey = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8);
stream.close();
stream = null;

KeyStore ks = KeyStore.getInstance("JKS");
char[] ksPassword = "mypass".toCharArray();

ks.load(null, ksPassword);
ks.setKeyEntry(alias, privKey, ksPassword, chain);

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, ksPassword);

TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);

sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

//  serverHttps.setHttpsConfigurator(new HttpsConfigurator(sslContext));
serverHttps.setHttpsConfigurator ( new HttpsConfigurator( sslContext )
{
    @Override
    public void configure ( HttpsParameters params )
    {
        try
        {
            // initialise the SSL context
            SSLContext c = SSLContext.getDefault ();
            SSLEngine engine = c.createSSLEngine ();
            params.setNeedClientAuth ( false );
            params.setCipherSuites ( engine.getEnabledCipherSuites () );
            params.setProtocols ( engine.getEnabledProtocols () );

            // get the default parameters
            SSLParameters defaultSSLParameters = c.getDefaultSSLParameters ();
            params.setSSLParameters ( defaultSSLParameters );
        }
        catch ( Exception ex )
        {
            System.out.println( "Failed to configure HTTPS server: "+ex.getMessage() );
            System.exit(100);
        }
    }
} );

最佳答案

您的服务器证书必须是 keystore 条目中的 chain[0]

剩余的证书应该按向上顺序排列,即 root 排在最后 - 当您使用 keytool 时,它会将它们按此顺序排列 - 因为 JSSE 服务器按 keystore 顺序和 SSL/TLS 协议(protocol)发送它们说他们应该按向上的顺序发送。然而,根据我的经验(大多数?)浏览器/客户端将容忍链的其余部分出现故障,只要服务器证书是第一个。

PS:我认为您的configure 重写中的所有内容都是不必要的。您没有做任何事情来使 SSLContext 的参数与默认参数不同,默认上下文的 SSLParameters 是(并覆盖)您刚刚单独设置的 CipherSuites 和 Protocols。但我不能轻易测试。

关于java - 在 Java HttpsServer 中使用 Positive SSL Multi-Site Cert 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32365940/

相关文章:

web-services - jax-rs rest webservice 身份验证和授权

java - 使用 SSL 代理 Http [Java] 调用 SOAP 网络服务

java - JOptionPane.JOptionDialog 获取用于 if 语句的输入值

java - 如何在 Jetpack 导航中停止 fragment 重新加载/重新创建

java - 无法弄清楚这个 NoClassDefFoundError - 类应该在运行时存在?

web-services - 从 UPC 代码查找产品类别

java - 使用 Spring MVC 在应用程序启动时执行 Java 类

java - 使用模拟框架模拟 Web 服务,而不使用 junit

email - TLS - 证书主机名不验证

所有端口上的 SSL