【问题标题】:Connect Java SSL Server to a Java SSL server [duplicate]将 Java SSL 服务器连接到 Java SSL 服务器 [重复]
【发布时间】:2018-08-31 22:54:32
【问题描述】:

我在尝试将 java ssl 服务器连接到另一个 java ssl 服务器时遇到了困难。它们都使用相同的 ssl 密钥运行。

这是第一个服务器的样子:

public HostServer() throws IOException {

        System.setProperty("javax.net.ssl.keyStore", HOST_SERVER_KEY_FILE);
        System.setProperty("javax.net.ssl.keyStorePassword", SSL_KEY_PASSWORD);
        serverSocket = ((SSLServerSocketFactory) SSLServerSocketFactory.getDefault()).createServerSocket(HOST_SERVER_PORT);
        System.out.println("Host server is running and waiting for clients to connect...");
        connectedRequestServers = new ArrayList<ClientData>();
        connectedRequestServersSemaphore = new Semaphore(1);


}

public void start() {

    try {
        while (true) {
            Socket socket = serverSocket.accept();
            Thread clientHandler = new Thread(new ClientHandler(socket));
            clientHandler.start();

        }
    } catch (IOException ex) {
        Logger.getLogger(HostServer.class.getName()).log(Level.SEVERE, null, ex);
    }

}

这是第二台服务器的样子:

  public RequstServer() throws IOException, NoSuchAlgorithmException, KeyManagementException, GeneralSecurityException {



        System.setProperty("javax.net.ssl.keyStore", HostServer.HOST_SERVER_KEY_FILE);// REQUST_SERVER_KEY_FILE);
        System.setProperty("javax.net.ssl.keyStorePassword", HostServer.SSL_KEY_PASSWORD); //SSL_KEY_PASSWORD);
        serverSocket = ((SSLServerSocketFactory) SSLServerSocketFactory.getDefault()).createServerSocket(REQUEST_SERVER_PORT);

        System.out.println("Request Server is up and running!");

        System.setProperty("javax.net.ssl.trustStore", HostServer.HOST_SERVER_KEY_FILE);

        hostSocket = ((SSLSocketFactory) SSLSocketFactory.getDefault()).createSocket(HostServer.HOST_SERVER_ADDRESS, HostServer.HOST_SERVER_PORT);
        os = new ObjectOutputStream(hostSocket.getOutputStream());
        is = new ObjectInputStream(hostSocket.getInputStream());


    }

第一台服务器运行良好,但是当我尝试运行第二台服务器时,我收到以下错误,这意味着与第一台服务器的连接失败。 如果有人可以帮助我,我会很高兴!

Request Server is up and running!

3:12:47 PM Ver1.RequstServer main
SEVERE: null
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1509)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:914)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
    at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:747)
    at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)
    at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1877)
    at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1786)
    at java.io.ObjectOutputStream.<init>(ObjectOutputStream.java:247)
    at Ver1.RequstServer.<init>(RequstServer.java:70)
    at Ver1.RequstServer.main(RequstServer.java:38)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
    at sun.security.validator.Validator.validate(Validator.java:260)
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491)
    ... 12 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
    ... 18 more

【问题讨论】:

    标签: java ssl server client


    【解决方案1】:

    服务器端:

    System.setProperty("javax.net.ssl.trustStore", keyStore);
    System.setProperty("javax.net.ssl.keyStore", keyStore);
    System.setProperty("javax.net.ssl.keyStorePassword", keyStorePass);
    
    SSLServerSocketFactory sslFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
    serverSocket = (SSLServerSocket) sslFactory.createServerSocket(port, queueLength);
    
    Socket clientConnection = socket.accept();
    

    客户端:

    System.setProperty("javax.net.ssl.trustStore", keyStore);
    System.setProperty("javax.net.ssl.keyStore", keyStore);
    System.setProperty("javax.net.ssl.keyStorePassword", keyStorePass);
    
    SSLSocketFactory sslFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
    socket = (SSLSocket) sslFactory.createSocket(address, port);
    socket.startHandshake();
    

    要生成密钥库:

    keytool -genkey -alias server -keyalg RSA -keystore server.jks
    keytool -genkey -alias client -keyalg RSA -keystore client.jks
    
    keytool -export -file server.cert -keystore server.jks -storepass 123456 -alias server
    keytool -export -file client.cert -keystore client.jks -storepass 123456 -alias client
    
    keytool -import -file client.cert -keystore server.jks -storepass 123456 -alias client
    keytool -import -file server.cert -keystore client.jks -storepass 123456 -alias server
    

    【讨论】:

    • 非常感谢!!!它对我有用!您帮助我理解了私钥-公钥的概念!
    • 通过导出私钥并将其导入另一个公钥,您可以使用它做什么,这就是所谓的“自签名”。如果您愿意,请将我的回答标记为有帮助。
    • @MatanIssler 请将我的答案标记为已解决。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    相关资源
    最近更新 更多