与java服务器的安全连接失败

与java服务器的安全连接失败,java,ssl,Java,Ssl,在下载证书(certificate.crt)并将其添加到密钥库(keystore.jks)后,我尝试保护与java服务器的连接。我的服务器正常运行并读取证书。但是如果我想通过navigator(firefox)使用服务我收到一个PR_END_OF_FILE_错误您试图查看的页面无法显示,因为无法验证接收到的数据的真实性。ps:使用firefox工作并使用服务和检索数据,我认为这是导航器无法获取的私钥问题,我真的需要帮助,谢谢 ps如果我尝试使用我使用keytool创建的证书,它会工作 您可以通过

在下载证书(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);
}