与java服务器的安全连接失败
在下载证书(certificate.crt)并将其添加到密钥库(keystore.jks)后,我尝试保护与java服务器的连接。我的服务器正常运行并读取证书。但是如果我想通过navigator(firefox)使用服务我收到一个PR_END_OF_FILE_错误您试图查看的页面无法显示,因为无法验证接收到的数据的真实性。ps:使用firefox工作并使用服务和检索数据,我认为这是导航器无法获取的私钥问题,我真的需要帮助,谢谢 ps如果我尝试使用我使用keytool创建的证书,它会工作与java服务器的安全连接失败,java,ssl,Java,Ssl,在下载证书(certificate.crt)并将其添加到密钥库(keystore.jks)后,我尝试保护与java服务器的连接。我的服务器正常运行并读取证书。但是如果我想通过navigator(firefox)使用服务我收到一个PR_END_OF_FILE_错误您试图查看的页面无法显示,因为无法验证接收到的数据的真实性。ps:使用firefox工作并使用服务和检索数据,我认为这是导航器无法获取的私钥问题,我真的需要帮助,谢谢 ps如果我尝试使用我使用keytool创建的证书,它会工作 您可以通过
您可以通过IP地址进行连接。但SSL证书通常颁发给完全限定的域名(FQDN),如“”。如果您的SSL证书不应明确针对IP地址而不是域名颁发,则通过IP地址连接将始终导致上述错误。您必须使用证书中指定的公用名称来连接到服务器。这是正确的,但为什么当我使用keytool.exe创建证书并将其添加到我的信任库时,它可以工作,或者在我创建的证书上,我没有提到您写的任何IP地址“当我将其添加到我的信任库时,它可以工作”。那么您也尝试通过Java应用程序进行连接?如果答案应该是“是”,您确定您的java客户端没有使用虚拟HostnameVerifier吗?不,我尝试仅使用浏览器上的url进行连接。如果我使用keytool(keytool-genkey…),然后从中导出证书并将其导入信任存储,我尝试从导航器连接,我可以检索数据。但是,如果我将签名证书添加到信任存储中,它将不起作用,在导航器上,我会得到“安全连接失败”。如果导出签名证书,则必须确保浏览器也信任根证书,即。中间的每一张证书。您必须导出完整的证书链。以下问题可能会有所帮助:您通过IP地址进行连接。但SSL证书通常颁发给完全限定的域名(FQDN),如“”。如果您的SSL证书不应明确针对IP地址而不是域名颁发,则通过IP地址连接将始终导致上述错误。您必须使用证书中指定的公用名称来连接到服务器。这是正确的,但为什么当我使用keytool.exe创建证书并将其添加到我的信任库时,它可以工作,或者在我创建的证书上,我没有提到您写的任何IP地址“当我将其添加到我的信任库时,它可以工作”。那么您也尝试通过Java应用程序进行连接?如果答案应该是“是”,您确定您的java客户端没有使用虚拟HostnameVerifier吗?不,我尝试仅使用浏览器上的url进行连接。如果我使用keytool(keytool-genkey…),然后从中导出证书并将其导入信任存储,我尝试从导航器连接,我可以检索数据。但是,如果我将签名证书添加到信任存储中,它将不起作用,在导航器上,我会得到“安全连接失败”。如果导出签名证书,则必须确保浏览器也信任根证书,即。中间的每一张证书。您必须导出完整的证书链。以下问题可能会有所帮助:
private void startHttpsServer(RestFactory factory, int port, int minWorkers, int maxWorkers, int socketTimeoutMS,
boolean keepConnection, boolean ignoreContentLength, boolean debug, Compression compression, boolean useClassicServer, boolean requireCertificate) throws Exception {
String alias = "server-alias";
String pwd = "changeit";
char [] storepass = pwd.toCharArray();
String keystoreName = "c:\\keystore.jks";
FileInputStream in = new FileInputStream(keystoreName);
KeyStore keystore = KeyStore.getInstance("JKS");
keystore.load(in, storepass);
Certificate cert = keystore.getCertificate(alias);
Log.debug("the certification is here : " + cert);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
char [] keypass = pwd.toCharArray();
kmf.init(keystore, keypass);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keystore);
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SSLEngine engine = sslContext.createSSLEngine();
engine.setEnabledCipherSuites(new String[] {"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"});
SSLParameters defaultSSLParameters = sslContext.getDefaultSSLParameters();
engine.setSSLParameters(defaultSSLParameters);
HttpsRestServer server = new HttpsRestServer(factory, port, minWorkers, maxWorkers, debug, compression, keystore, keypass, false);
server.addCleaner(new CleanupListener() {
@Override
public void cleanup(CleanupEvent event) {
Database.disconnectAllThreadConnections(event.thread, false);
}
});
this.servers.add(server);
log.info("Starting classic HTTPS replication server on port " + port);
server.start();
log.info("Secure XML replication server started on port " + port);
}