zoukankan      html  css  js  c++  java
  • SSLServerSocket代码实现

    理解一个设计思想,结合代码是最好的途径。安全套接字服务端的实现代码如下:

    X509TrustManager MyX509TrustManager = new X509TrustManager() {  
            public X509Certificate[] getAcceptedIssuers() {  
                System.out.println("getAcceptedIssuers");
                return null;  
            }  
            public void checkServerTrusted(X509Certificate[] chain,  
                    String authType) throws CertificateException {  
                System.out.println("checkServerTrusted:"+authType+"////"+chain.length);
            }  
            public void checkClientTrusted(X509Certificate[] chain,String authType) throws CertificateException {  
                System.out.println("checkClientTrusted");
            }
        };
    try {
            //此文件是Keytool工具生成的证书(生成的路径在cmd目录下)
            String keyName = "C:/cnkey"; 
        //String keyName = "cnkey";  
            char[] keyPwd = "123456".toCharArray();  
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
         //可以直接在src路径下加载文件名为keyName的文件,返回输入流 
            // Test2.class.getClassLoader().getResourceAsStream(keyName)
            // 装载当前目录下的key store. 可用jdk中的keytool工具生成keystore  
            InputStream in = new FileInputStream(keyName);  
            
            keyStore.load(in, keyPwd);  
            in.close();
          
            // 初始化key manager factory  
            KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory  
                    .getDefaultAlgorithm());  
            kmf.init(keyStore, keyPwd);  
          
            // 初始化ssl context  
            SSLContext context = SSLContext.getInstance("SSL");  
            context.init(kmf.getKeyManagers(),
                    new TrustManager[] { MyX509TrustManager },  
                    new SecureRandom());  
          
            // 监听和接收客户端连接  
            SSLServerSocketFactory factory = context.getServerSocketFactory();  
            SSLServerSocket server = (SSLServerSocket) factory  
                    .createServerSocket(10002);  
            System.out.println("ok");  
            Socket client = server.accept();  
            System.out.println(client.getRemoteSocketAddress());  
          
            // 向客户端发送接收到的字节序列  
            OutputStream output = client.getOutputStream();  
          
            // 当一个普通 socket 连接上来, 这里会抛出异常  
            // Exception in thread "main" javax.net.ssl.SSLException: Unrecognized  
            // SSL message, plaintext connection?  
            InputStream input = client.getInputStream();  
            byte[] buf = new byte[1024];  
            int len = 0;  
            while ((len = input.read(buf))!=-1) {
                String sf = new String(buf, 0, len);
                System.out.print(sf); 
                if(sf.contains("
    
    ")){
                    break;
                }
            }
            String html = "<html><head><title>wv</title></head><body><h2>as</h2></body><html>";
            String s = "HTTP/1.1 200 OK" +
            "
    " +
            "Date: Sat, 31 Dec 2005 23:59:59 GMT" +
            "
    " +
            "Content-Type: text/html;charset=ISO-8859-1" +
            "
    " +
            "Content-Length: " +
            html.length() +
            "
    " +
            "
    " +
            html;
            output.write(s.getBytes());  
            output.flush();  
            output.close();  
            input.close();  
          
            // 关闭socket连接  
            client.close();  
            server.close();  
          } catch (Exception e) {
                e.printStackTrace();
            }

    客户端的代码实现如下:

    X509TrustManager MyX509TrustManager = new X509TrustManager() {  
            public X509Certificate[] getAcceptedIssuers() {  
                System.out.println("getAcceptedIssuers");
                return null;  
            }  
            public void checkServerTrusted(X509Certificate[] chain,  
                    String authType) throws CertificateException {  
                System.out.println("checkServerTrusted:"+authType+"////"+chain.length);
            }  
            public void checkClientTrusted(X509Certificate[] chain,String authType) throws CertificateException {  
                System.out.println("checkClientTrusted");
            }
        };
        try {
            SSLContext context = SSLContext.getInstance("SSL");  
            // 初始化  
            context.init(null,new TrustManager[] { MyX509TrustManager },new SecureRandom());  
            SSLSocketFactory factory = context.getSocketFactory();  
            SSLSocket s = (SSLSocket) factory.createSocket("localhost", 10002);
            System.out.println("ok");
            
            OutputStream output = s.getOutputStream();
            InputStream input = s.getInputStream();
            
            output.write("alert
    
    ".getBytes());
            System.out.println("sent: alert");  
            output.flush();  
            byte[] buf = new byte[1024];  
            int len = 0; 
            while ((len = input.read(buf))!=-1) {
                System.out.println("received:" + new String(buf, 0, len));
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
  • 相关阅读:
    mixer: 一个用go实现的mysql proxy
    【Unity Shaders】Using Textures for Effects——打包和混合textures
    sharding jdbc:分库、分表;读写分离;
    springboot(四):thymeleaf使用详解
    spring boot(三):spring data jpa的使用
    深入理解Java虚拟机JVM
    Java入门(4)内部类
    .NET 定时器类及使用方法
    JDK源码
    Java入门(3)面向对象三大特性:封装、继承、多态
  • 原文地址:https://www.cnblogs.com/wbjgogogo/p/5175752.html
Copyright © 2011-2022 走看看