【问题标题】:how to do ssl socket programming如何进行 ssl 套接字编程
【发布时间】:2011-10-10 20:17:07
【问题描述】:

我正在通过以下 IP 地址进行套接字通信,它可以工作,但我不想在 ssl 模式下进行通信,但是我如何将 InetAddress serverAddr = InetAddress.getByName("192.168.1.2"); 更改为 SSL。

public class TCPClient implements Runnable {

    public void run() {

     try {

         InetAddress serverAddr = InetAddress.getByName("192.168.1.2");

             Log.d("TCP", "C: Connecting...");

             Socket socket = new Socket(serverAddr,12345);

             String message = "Hello from Client android emulator";
              try {

                     Log.d("TCP", "C: Sending: '" + message + "'");

                     PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);

                     out.println(message);

                     Log.d("TCP", "C: Sent.");

                 Log.d("TCP", "C: Done.");



         } catch(Exception e) {

             Log.e("TCP", "S: Error", e);
                 } finally {

                    socket.close();

                  }
     } catch (Exception e) {

          Log.e("TCP", "C: Error", e);

     }

}

}

【问题讨论】:

  • https 用于安全的 HTTPS 流量。您似乎正在编写一个原始套接字服务器。就叫它 SSL。
  • 不能 '将InetAddress serverAddr = InetAddress.getByName("192.168.1.2") 更改为 SSL。` 这是一个 IP 地址查找。这个问题没有意义。你要找的是javax.net.ssl.SSLSocket和朋友们。

标签: java ssl


【解决方案1】:

创建 SSLSocket 而不是 Socket。休息也一样。

SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("192.168.1.2", 12345);

您可能想要添加其他 SSL 属性。你必须早点做:

要对服务器进行身份验证,客户端的信任库必须包含服务器的证书。具有服务器身份验证的客户端 SSL 由 URL 属性 ssl 或属性 ssl 设置为 peerAuthentication 启用。另外需要设置系统属性javax.net.ssl.trustStore和javax.net.ssl.trustStorePassword。:

System.setProperty("javax.net.ssl.trustStore","clientTrustStore.key");
System.setProperty("javax.net.ssl.trustStorePassword","qwerty");

如果服务器进行客户端身份验证,客户端将需要密钥对和客户端证书:

System.setProperty("javax.net.ssl.keyStore","clientKeyStore.key");
System.setProperty("javax.net.ssl.keyStorePassword","qwerty");

【讨论】:

  • 没有关于它的“如果客户端想要验证服务器”。这在 SSL 中是强制性的。
  • @user207421 其实不是。
  • 看看gpotter2.github.io/tutos/en/sslsockets,有一些方法可以解决 System.setProperty(这是超级脏)
【解决方案2】:

基本上你需要使用 SSLSocket,它是用于 Java 中的 SSL 通信的。

在创建 SSLSocket 时,首先需要配置用于验证服务器证书的信任库。

然后你需要获取 SSLSocket 并连接到服务器,然后开始与服务器握手。

一旦握手成功完成,您就可以像其他普通套接字连接一样开始与服务器正常交换应用程序数据。

A HTTPS client and HTTPS server demo in Java 提供了如何在 Java 中创建 SSL 服务器和 SSL 客户端的演示。挺好用的。

【讨论】:

    【解决方案3】:

    Java 有 SSLSocket 类。

    http://download.oracle.com/javase/1.4.2/docs/api/javax/net/ssl/SSLSocket.html

    希望这会有所帮助,我自己(还)没有使用过。

    【讨论】:

      猜你喜欢
      • 2014-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多