java - 数据未使用 SSL 在客户端和服务器之间传输

标签 java sockets ssl ssl-certificate sslsocketfactory

这是我的服务器代码

import java.io.InputStream;

import java.io.OutputStream; 
import java.security.Key;

import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;

public class SSLServer {
   final static String pathToStores = "C:/Users/Amee";
final static String keyStoreFile = "server.jks";
final static String passwd = "changeit";

final static int theServerPort = 8443;

static boolean debug = false;

public static void main(String args[]) throws Exception {

    String trustFilename = pathToStores + "/" + keyStoreFile;
    // System.out.println("Verifying KeyStore File of Client..");

    System.setProperty("javax.net.ssl.keyStore", trustFilename);
    System.setProperty("javax.net.ssl.keyStorePassword", passwd);
    if (debug)
        System.setProperty("javax.net.debug", "all");
    System.out.println("Setting up SSL parameters");

    // Initialize socket connection
    SSLServerSocketFactory sslssf = (SSLServerSocketFactory) SSLServerSocketFactory
            .getDefault();
    SSLServerSocket sslServerSocket = (SSLServerSocket) sslssf
            .createServerSocket(theServerPort);
    System.out.println("Server Started..Waiting for clients");
    //sslServerSocket.setNeedClientAuth(true);

    SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();
    // sslSocket.startHandshake();
    System.out.println("Client Connected!");

    InputStream sslIS = sslSocket.getInputStream();

    OutputStream sslOS = sslSocket.getOutputStream();

    final int RSAKeySize = 1024;
    final String newline = "\n";

    Key pubKey = null;
    Key privKey = null;
    boolean flag = sslSocket.getNeedClientAuth();
    System.out.println("Flag value: " + flag);

    String messgae = "Hello Client!"; 
    sslOS.write(messgae.getBytes());
//  sslOS.close();
}

============================================= ==================

这是我的客户端代码

=============================================

import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;

public class SSLClient{
    final static String pathToStores = "C:/Users/Amee";
    final static String trustStoreFile = "client.jks";
    final static String passwd = "changeit";
    final static String theServerName = "localhost";
    final static int theServerPort = 8443;

static boolean debug = false;

public static void main(String args[]) throws Exception {

    String trustFilename = pathToStores + "/" + trustStoreFile;
    System.out.println("Validating KeyStore file of Server..");

    System.setProperty("javax.net.ssl.trustStore", trustFilename);
    System.setProperty("javax.net.ssl.trustStorePassword", passwd);
    if (debug)
        System.setProperty("javax.net.debug", "all");


    SSLSocketFactory sslssf = (SSLSocketFactory) SSLSocketFactory.getDefault();
    SSLSocket sslSocket = (SSLSocket)sslssf.createSocket(theServerName, 8443);
    System.out.println("Connected to Server!");

    while (true) {

        if (sslSocket.getInputStream().available() > 0) {
            byte[] data = new byte[sslSocket.getInputStream().available()];
            sslSocket.getInputStream().read(data);
            System.out.println(new String(data));
        }
    }
}

============================================= =================

给出一些建议...我怎样才能通过 channel 传输数据?

最佳答案

Javadoc 中特别警告您使用 available() 的方式。使用固定大小的缓冲区,并阻塞在 read() 方法中。

关于java - 数据未使用 SSL 在客户端和服务器之间传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27665087/

相关文章:

java - 使用 Java 和 LDAP 将用户添加到 AD LDS (ADAM)

java - 如何从 Android 中的应用程序访问我的相机

java - 关闭 AsynchronousSocketChannel 时连接重置错误

java - 使用 Java 通过套接字发送数组

java - 扫描仪只接受一次输入

java - 在java软件工具中运行java类时不确定要设置什么属性 "Classpath"

node.js - 如何以最少的延迟发送 Websocket 消息?

ruby-on-rails - 在 Ruby/Rails 中使用带有 restful_authentication 的 ssl_requirement 时遇到问题

java - NoSuchAlgorithmException : TLSv1. 2 未知协议(protocol)

java - Android 如何允许来自特定服务器的特定 SSL 证书