0

Java で安全な接続を作成しようとしています。そのために、次のサーバーとクライアントを作成しました

サーバ:

    public static void main(String[] args){
    try {
        // relative keystorepath
        String certificateChain = "keystore";
        String password = "***";
        System.setProperty("javax.net.ssl.keyStore", certificateChain);
        System.setProperty("javax.net.ssl.keyStorePassword", password);
        SSLServerSocketFactory sslserversocketfactory =
                (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
        SSLServerSocket sslserversocket =
                (SSLServerSocket) sslserversocketfactory.createServerSocket(9999);
        SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();

        InputStream inputstream = sslsocket.getInputStream();
        InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
        BufferedReader bufferedreader = new BufferedReader(inputstreamreader);

        String string = null;
        while ((string = bufferedreader.readLine()) != null) {
            System.out.println(string);
            System.out.flush();
        }
    } catch (Exception exception) {
        exception.printStackTrace();
    }

}

クライアント:

    public static void main(String[] arstring) {
    try {
        // Pfad zum Truststore
        String certificateChain = "/usr/lib64/jvm/java-1.7.0-openjdk-1.7.0/jre/lib/security/cacerts";
        String password = "***";
        System.setProperty("javax.net.ssl.trustStore", certificateChain);
        System.setProperty("javax.net.ssl.trustStorePassword", password);

        SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
        SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("localhost", 9999);

        OutputStream outputstream = sslsocket.getOutputStream();
        OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream);
        BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter);

        String string = "testmessage";
            bufferedwriter.write(string + '\n');
            bufferedwriter.flush();

    } catch (Exception exception) {
        exception.printStackTrace();
    }
}

その後、特定のパスのトラストストアに証明書を追加しようとしました。生成されたキーは、作業ディレクトリのキーストアに追加されました。

Google の最初の 5 ページにあるすべてのチュートリアルと指示に従おうとすると、さまざまなキーワードを使用して運が悪くなります。私は常にhandshake_failure例外を取得しています:

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1959)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1077)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:702)
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
at java.io.BufferedWriter.flush(BufferedWriter.java:254)
at client.SSLClientMain.main(SSLClientMain.java:151)

コードはコピーして貼り付けただけなので、コードの問題ではなく、証明書の問題だと思います。だから私の質問は、私は何を間違っているのか、もっと何をする必要があるのか​​?

4

1 に答える 1

0

クライアント側にない証明書をサーバー側で使用している可能性があり、その逆も同様です。サーバーとクライアントの同じ証明書で試してみてください。

于 2018-10-15T05:45:51.277 に答える