zoukankan      html  css  js  c++  java
  • HTTPS 证书制作及使用

    一 证书的制作

    进入jdk/bin,使用keytools.exe制作证书。

    1.创建keystore

    创建一个别名为serverkeystore的证书,该证书存放在名为server.keystore的密钥库中,若server.keystore密钥库不存在则创建

    keytool -genkeypair -alias "serverkeystore" -keyalg "RSA" -keystore "d:/server.keystore"

    注意:如果提示下图错误,本人Jdk装载c盘当中,而C盘都是只读文件,在c盘当中生成 文件的话,是没有写入权限的。所以指定生成 server.keystore在D盘。

    2.导出证书

    keytool -export -alias serverkeystore -file d:/server.crt -keystore d:/server.keystore

    3.使用2中导出的证书生成truestkeystore

    keytool -import -v -file D:/server.crt -keystore D:/trustserver.keystore

      

    同理我们在为client制作同样的文件。

    二 代码中证书文件的使用

     server

    package com.xiaodeyao;
    
    import javax.net.ssl.SSLServerSocket;
    import javax.net.ssl.KeyManagerFactory;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManagerFactory;
    import java.io.*;
    import java.net.Socket;
    import java.security.KeyStore;
    public class HttpsServer {
        private static final int DEFAULT_PORT     = 7777;
        private static final String SERVER_KEY_STORE_PASSWORD  = "123456";
        private static final String SERVER_TRUST_KEY_STORE_PASSWORD = "123456";
        private SSLServerSocket serverSocket;
        public static void main(String[] args) {
            HttpsServer server = new HttpsServer();
            server.init();
            server.start();
        }
        /**
         * <ul>
         * <li>听SSL Server Socket</li>
         * <li> 由于该程序不是演示Socket监听,所以简单采用单线程形式,并且仅仅接受客户端的消息,并且返回客户端指定消息</li>
         * </ul>
         */
        public void start() {
            if (serverSocket == null) {
                System.out.println("ERROR");
                return;
            }
            while (true) {
                try {
                    Socket s = serverSocket.accept();
                    InputStream input = s.getInputStream();
                    OutputStream output = s.getOutputStream();
                    BufferedInputStream bis = new BufferedInputStream(input);
                    BufferedOutputStream bos = new BufferedOutputStream(output);
                    byte[] buffer = new byte[20];
                    bis.read(buffer);
                    System.out.println(new String(buffer));
                    bos.write("Server Echo".getBytes());
                    bos.flush();
                    s.close();
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        }
        /**
         * <ul>
         * <li>ssl连接的重点:</li>
         * <li>初始化SSLServerSocket</li>
         * <li>导入服务端私钥KeyStore,导入服务端受信任的KeyStore(客户端的证书)</li>
         * </ul>
         */
        public void init() {
            try {
                SSLContext ctx = SSLContext.getInstance("SSL");
                KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
                TrustManagerFactory tmf = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
                KeyStore ks = KeyStore.getInstance("JKS");
                KeyStore tks = KeyStore.getInstance("JKS");
                ks.load(new FileInputStream("D://server.keystore"), SERVER_KEY_STORE_PASSWORD.toCharArray());
                tks.load(new FileInputStream("D://trustclient.keystore"), SERVER_TRUST_KEY_STORE_PASSWORD.toCharArray());
                kmf.init(ks, SERVER_KEY_STORE_PASSWORD.toCharArray());
                tmf.init(tks);
                ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
                serverSocket = (SSLServerSocket) ctx.getServerSocketFactory().createServerSocket(DEFAULT_PORT);
                serverSocket.setNeedClientAuth(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

      client

    package com.xiaodeyao;
    
    import javax.net.ssl.KeyManagerFactory;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocket;
    import javax.net.ssl.TrustManagerFactory;
    import java.io.*;
    import java.security.KeyStore;
    
    public class HttpsClient {
        private static final String DEFAULT_HOST     = "127.0.0.1";
        private static final int DEFAULT_PORT     = 7777;
        private static final String CLIENT_KEY_STORE_PASSWORD  = "123456";
        private static final String CLIENT_TRUST_KEY_STORE_PASSWORD = "123456";
        private SSLSocket sslSocket;
    
        /**
         * 启动客户端程序
         *
         * @param args
         */
        public static void main(String[] args) {
            HttpsClient client = new HttpsClient();
            client.init();
            client.process();
        }
        /**
         * 通过ssl socket与服务端进行连接,并且发送一个消息
         */
        public void process() {
            if (sslSocket == null) {
                System.out.println("ERROR");
                return;
            }
            try {
                InputStream input = sslSocket.getInputStream();
                OutputStream output = sslSocket.getOutputStream();
                BufferedInputStream bis = new BufferedInputStream(input);
                BufferedOutputStream bos = new BufferedOutputStream(output);
                bos.write("Client Message".getBytes());
                bos.flush();
                byte[] buffer = new byte[20];
                bis.read(buffer);
                System.out.println(new String(buffer));
                sslSocket.close();
            } catch (IOException e) {
                System.out.println(e);
            }
        }
        /**
         * <ul>
         * <li>ssl连接的重点:</li>
         * <li>初始化SSLSocket</li>
         * <li>导入客户端私钥KeyStore,导入客户端受信任的KeyStore(服务端的证书)</li>
         * </ul>
         */
        public void init() {
            try {
                SSLContext ctx = SSLContext.getInstance("SSL");
                KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
                TrustManagerFactory tmf = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
                KeyStore ks = KeyStore.getInstance("JKS");
                KeyStore tks = KeyStore.getInstance("JKS");
                ks.load(new FileInputStream("D://client.keystore"), CLIENT_KEY_STORE_PASSWORD.toCharArray());
                tks.load(new FileInputStream("D://trustserver.keystore"), CLIENT_TRUST_KEY_STORE_PASSWORD.toCharArray());
                kmf.init(ks, CLIENT_KEY_STORE_PASSWORD.toCharArray());
                tmf.init(tks);
                ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
                sslSocket = (SSLSocket) ctx.getSocketFactory().createSocket(DEFAULT_HOST, DEFAULT_PORT);
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }
    

      

    参考:

    https://www.cnblogs.com/xdp-gacl/p/3750965.html 

    https://blog.csdn.net/moonpure/article/details/82836517

  • 相关阅读:
    程序员的数学基础课 时间和空间复杂度(上):优化性能是否只是“纸上谈兵”?5
    程序员的数学基础课 原来取余操作本身就是个哈希函数 4
    程序员的数学基础课 1 append
    https://www.tiobe.com/tiobe-index//
    贝多芬的《D 小调第九交响曲》
    Hive基础(11):元数据(二)分析Hive表和分区的统计信息(Statistics)
    Hive基础(10):元数据(一)Hive的元数据表结构详解
    qemu-system-aarch64: failed to find romfile "efi-virtio.rom"
    vhost + qemu-system-aarch64
    qemu-system-aarch64: -enable-kvm: No machine specified, and there is no default Use -machine help to list supported machines
  • 原文地址:https://www.cnblogs.com/xiaodeyao/p/11031153.html
Copyright © 2011-2022 走看看