【问题标题】:SSL Server/Client using Java使用 Java 的 SSL 服务器/客户端
【发布时间】:2014-08-21 22:09:01
【问题描述】:

我正在尝试在 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();
    }
}

之后,我尝试将我的证书添加到特定路径的信任库。 生成的密钥已添加到工作目录中的密钥库中。

如果尝试使用许多不同的关键字按照谷歌前 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)

由于代码只是复制粘贴,我认为这不是代码问题,而是证书问题。所以我的问题是: 我做错了什么,我还需要做什么?

【问题讨论】:

  • 您要连接的服务器,您是否已将它的公钥添加到您的客户端正在使用的信任库中?
  • 我添加了 .csr 文件,其中包含 - 据我所知 - 证书和公钥,我错了吗?
  • 当你说添加时,是不是表示你已经将它导入到客户端的信任库中了?
  • 是的,完全正确。我使用keytool -import 命令这样做。我也尝试使用 Portecle,但这并没有改变任何东西。
  • 这个听起来类似于这个帖子:stackoverflow.com/questions/11113338/…

标签: java ssl keystore truststore sslhandshakeexception


【解决方案1】:

您可能在服务器端使用了一个证书,而该证书可能不在客户端,反之亦然。 尝试使用相同的服务器和客户端证书。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2015-10-20
    • 2010-10-17
    相关资源
    最近更新 更多