java ssl通信

SSL证书与Java开发

生成ssl证书请参考如下:

http://blog.youkuaiyun.com/u014410763/article/details/50555902

参考文章:

https://yq.aliyun.com/articles/40408

客户端私钥与证书导出(java需要特定格式)

openssl pkcs12 - export  -clcerts -name foobar  -inkey  client.key  - in   client .crt -out  client .keystore

服务器端私钥与证书导出

openssl pkcs12 - export  -clcerts -name foobar  -inkey  server.key  - in   server .crt -out  server .keystore
受信任CA证书导出

keytool -importcert -trustcacerts - alias foobar  - file  ca .crt  -keystore  ca-trust .keystore

注意代码中的密码,可能你设置的各个证书的不同

服务器端代码

package online.geekgalaxy.test;

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.security.KeyStore;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.TrustManagerFactory;


public class sslServer {

    private SSLServerSocket sslServerSocket;

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

        sslServer server = new sslServer();

        server.init();

        System.out.println("SSLServer initialized.");

        server.process();

    }



    //服务器端将要使用到server.keystore和ca-trust.keystore

    private void init() throws Exception {

        int port = 1234;

        String keystorePath = "certs/server.keystore";

        String trustKeystorePath = "certs/ca-trust.keystore";

        String keystorePassword = "";
        String caPassword = "111111";

        SSLContext context = SSLContext.getInstance("SSL");



        //客户端证书库

        KeyStore keystore = KeyStore.getInstance("pkcs12");

        FileInputStream keystoreFis = new FileInputStream(keystorePath);

        keystore.load(keystoreFis, keystorePassword.toCharArray());

        //信任证书库

        KeyStore trustKeystore = KeyStore.getInstance("jks");

        FileInputStream trustKeystoreFis = new FileInputStream(trustKeystorePath);

        trustKeystore.load(trustKeystoreFis, caPassword.toCharArray());



        //密钥库

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("sunx509");

        kmf.init(keystore, keystorePassword.toCharArray());


        //信任库

        TrustManagerFactory tmf = TrustManagerFactory.getInstance("sunx509");

        tmf.init(trustKeystore);



        //初始化SSL上下文

        context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

        //初始化SSLSocket

        sslServerSocket = (SSLServerSocket)context.getServerSocketFactory().createServerSocket(port);

        //设置这个SSLServerSocket需要授权的客户端访问

        sslServerSocket.setNeedClientAuth(true);

    }



    private void process() throws Exception {

        String bye = "Bye!";

        byte[] buffer = new byte[50];

        while(true) {

            Socket socket = sslServerSocket.accept();

            InputStream in = socket.getInputStream();

            in.read(buffer);

            System.out.println("Received: " + new String(buffer));

            OutputStream out = socket.getOutputStream();

            out.write(bye.getBytes());

            out.flush();

        }

    }
}

客户端代码

package online.geekgalaxy.test;

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.KeyStore;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManagerFactory;


public class sslClient {

    private SSLSocket sslSocket;

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

        sslClient client = new sslClient();

        client.init();

        System.out.println("SSLClient initialized.");

        client.process();

    }



    //客户端将要使用到client.keystore和ca-trust.keystore

    private void init() throws Exception {

        String host = "127.0.0.1";

        int port = 1234;

        String keystorePath = "certs/client.keystore";

        String trustKeystorePath = "certs/ca-trust.keystore";

        String keystorePassword = "";
        String caPassword = "111111";

        SSLContext context = SSLContext.getInstance("SSL");

        //客户端证书库

        KeyStore clientKeystore = KeyStore.getInstance("pkcs12");

        FileInputStream keystoreFis = new FileInputStream(keystorePath);

        clientKeystore.load(keystoreFis, keystorePassword.toCharArray());

        //信任证书库

        KeyStore trustKeystore = KeyStore.getInstance("jks");

        FileInputStream trustKeystoreFis = new FileInputStream(trustKeystorePath);

        trustKeystore.load(trustKeystoreFis, caPassword.toCharArray());



        //密钥库

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("sunx509");

        kmf.init(clientKeystore, keystorePassword.toCharArray());


        //信任库

        TrustManagerFactory tmf = TrustManagerFactory.getInstance("sunx509");

        tmf.init(trustKeystore);



        //初始化SSL上下文

        context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);



        sslSocket = (SSLSocket)context.getSocketFactory().createSocket(host, port);

    }



    private void process() throws Exception {

        //往SSLSocket中写入数据

        String hello = "hello boy!";

        OutputStream out = sslSocket.getOutputStream();

        out.write(hello.getBytes(), 0, hello.getBytes().length);

        out.flush();



        //从SSLSocket中读取数据

        InputStream in = sslSocket.getInputStream();

        byte[] buffer = new byte[50];

        in.read(buffer);

        System.out.println(new String(buffer));

    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值