繁体   English   中英

在Java HttpsServer上使用肯定SSL多站点证书的问题

[英]Trouble using Positive SSL Multi-Site Cert with Java HttpsServer

我正在尝试将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);
        }
    }
} );

您的服务器证书必须在密钥库条目中为chain[0]

其余证书应按升序排列,即root优先-当您使用keytool时,它们按该次序排列-因为JSSE服务器按密钥库顺序发送它们,而SSL / TLS协议说应按升序发送。 但是,以我的经验(最多?),只要服务器证书是第一位的,浏览器/客户端就可以容忍其余的链混乱。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM