gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:10:13 24 4
gpt4 key购买 nike

我正在尝试将 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com