JAVA中SSL证书认证通讯

SSL通讯服务端

/********************************************************************
 * 项目名称    :rochoc   <p>
 * 包名称      :rochoc.net.security <p>
 * 文件名称    :SSLServer   <p>
 * 编写者     :luoc    <p>
 * 编写日期    :2005-6-30    <p>
 * 程序功能(类)描述 :用于安全通讯的服务Socket,采用java中的SSLServerSocket<p>
 * 
 * 程序变更日期   :
 * 变更作者    :
 * 变更说明    :
********************************************************************/
package rochoc.net.security;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.security.KeyStore;
import java.security.SecureRandom;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.TrustManagerFactory;

/**
 * 类名:SSLServer  <p>
 * 类描述:安全通讯的服务端 <p>
 * 编写者 :luoc<p>
 * 编写日期 :2005-6-30<p>
 * 主要public成员变量:<p>
 * 主要public方法:   <p>
 **/

public class SSLServer implements Runnable
{
    /**
     *构造函数说明:       <p>
     *参数说明:   <p>
    **/
    public SSLServer()
    {        
        init();
    }
    
    /**
    * 方法名称:init<p>
    * 方法功能:初始化服务Socket            <p>
    * 参数说明: <p>
    * 返回:void <p>
    * 作者:luoc
    * 日期:2005-6-30
    **/
    public void init()
    {
        String type="TLS";//类型
        String keyf="..\\key\\srvstore";//key文件路径
        String trustf="..\\key\\mytrust";
        String pass="123456";//密码
        int port=2001;//端口
        try
        {
            //初始化上下文
            SSLContext ctx=SSLContext.getInstance(type);
            KeyManagerFactory kmf=KeyManagerFactory.getInstance("SunX509");
            TrustManagerFactory tmf=TrustManagerFactory.getInstance("SunX509");            
            KeyStore ks=KeyStore.getInstance("JKS");
            KeyStore tks=KeyStore.getInstance("JKS");
            //载入keystore
            ks.load(new FileInputStream(keyf),pass.toCharArray());
            tks.load(new FileInputStream(trustf),pass.toCharArray());
            kmf.init(ks,pass.toCharArray());
            tmf.init(tks);
            ctx.init(kmf.getKeyManagers(),tmf.getTrustManagers(),new SecureRandom());
            ss=(SSLServerSocket)ctx.getServerSocketFactory().createServerSocket(port);
            ss.setNeedClientAuth(true);//客户端要认证
        }catch (Exception e) {
      e.printStackTrace();
     }        
    }
    
    /**
    * 方法名称:newListener<p>
    * 方法功能:创建服务器监听            <p>
    * 参数说明: <p>
    * 返回:void <p>
    * 作者:luoc
    * 日期:2005-6-30
    **/
    private void newListener()
    {
        (new Thread(this)).start();
    }
    
    /**
     * 重载方法:run 处理客户端的请求<p>
     * 参阅:@see java.lang.Runnable#run() <p>
     * 参数说明: <p>
    **/
    public void run()
    {
        Socket socket=null;
        //accept a connection
        try
        {
            socket=ss.accept();
        }catch(IOException e)
        {
            System.out.println("Class Server died: " + e.getMessage());
         e.printStackTrace();
         return;
        }
        
        //create a new thread to accept the next connection
        newListener();
        
        //process connection
        try
        {
            OutputStream out=socket.getOutputStream();
            InputStream in=socket.getInputStream();
            //read data from client     
            byte buff[]=new byte [512];  
            byte data[]=new byte [1024];
            System.out.println("buff len="+buff.length);
            int len=0;
            int startpos=0;
            while((len=in.read(buff))!=-1)
            {
                //读联欢数据                
                if(len==1 && buff[0]==TranTool.DATA_END)//数据结束标志
                    break;
                data=TranTool.byteDynExt(data,buff,len,startpos);
                System.out.println("read len:"+len+" data:["+new String(buff,0,len)+"]");
                startpos+=len;
            }               
            System.out.println("recv from client:[");                                   
            System.out.print(new String(data,0,startpos));            
            System.out.println("] data end.");
            //send message to client
            out.write((startpos+" data success receive.").getBytes());
            out.write(TranTool.DATA_END);
            System.out.println("success echo is send.");
            out.flush();
        }catch(IOException e)
        {
            e.printStackTrace();
      return;
        }finally
        {
            try 
            {
          socket.close();
         } catch (IOException e) 
         {}
        }
    }    
    
    /*全局变量*/   
    SSLServerSocket ss=null;
    
    //测试函数
    public static void main(String args[])
    {
        System.out.println("init SSLServer...");
        SSLServer srv=new SSLServer();
        new Thread(srv).start();       
        System.out.println("SSLServer listener begin.");
    }
}

SSL通讯客户

/********************************************************************
 * 项目名称    :rochoc   <p>
 * 包名称      :rochoc.net.security <p>
 * 文件名称    :SSLClient   <p>
 * 编写者     :luoc    <p>
 * 编写日期    :2005-6-30    <p>
 * 程序功能(类)描述 :安全通讯的客户端       <p>
 * 
 * 程序变更日期   :
 * 变更作者    :
 * 变更说明    :
********************************************************************/
package rochoc.net.security;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.SecureRandom;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

/**
 * 类名:SSLClient  <p>
 * 类描述: 安全通讯的客户端<p>
 * 编写者 :luoc<p>
 * 编写日期 :2005-6-30<p>
 * 主要public成员变量:<p>
 * 主要public方法:   <p>
 **/

public class SSLClient
{
    /**
     *构造函数说明:       <p>
     *参数说明:   <p>
    **/
    public SSLClient()
    {
        init();
    }
    
    /**
    * 方法名称:init<p>
    * 方法功能:初始化客户端Socket            <p>
    * 参数说明: <p>
    * 返回:void <p>
    * 作者:luoc
    * 日期:2005-6-30
    **/
    public void init()
    {
        //server socket's ip and port
        String host="localhost";
        int port=2001;
        //keystore path and password
        String keyf="..\\key\\mystore";
        String trustf="..\\key\\srvtrust";
        String pass="123456";
        //set up a connection
        SSLSocketFactory ssf=null;
        try
        {
            //init context
            SSLContext ctx=SSLContext.getInstance("TLS");            
            KeyManagerFactory kmf=KeyManagerFactory.getInstance("SunX509");
            TrustManagerFactory tmf=TrustManagerFactory.getInstance("SunX509");            
            KeyStore ks=KeyStore.getInstance("JKS");
            KeyStore tks=KeyStore.getInstance("JKS");
            //load keystore
            ks.load(new FileInputStream(keyf),pass.toCharArray());
            tks.load(new FileInputStream(trustf),pass.toCharArray());
            kmf.init(ks,pass.toCharArray());
            tmf.init(tks);
            ctx.init(kmf.getKeyManagers(),tmf.getTrustManagers(),new SecureRandom());
            System.out.println("load keystore success.");
            ssf=ctx.getSocketFactory();
            //create socket
            socket=(SSLSocket)ssf.createSocket(host,port);
            System.out.println("create socket success.");
            //handshake
            socket.startHandshake();
            System.out.println("handshake success.");
        }catch(Exception e)
        {
            System.out.println("establish connection error.");
            e.printStackTrace();
            return;
        }
        
    }
    
    /**
    * 方法名称:sendMessage<p>
    * 方法功能:发送信息            <p>
    * 参数说明:@param msg <p>
    * 返回:void <p>
    * 作者:luoc
    * 日期:2005-6-30
    **/
    public void sendMessage(String msg)
    {
        try
        {
            OutputStream out=socket.getOutputStream();
            InputStream in=socket.getInputStream();
            //send message
            System.out.println("send message:["+msg+"]");
            out.write(msg.getBytes());
            out.write(TranTool.DATA_END);
            out.flush();
            //receive message
            byte [] buff=new byte[1024];
            int len=0;
            System.out.println("recv len:"+(len=in.read(buff)));
            System.out.println("receive from srv:[");            
            System.out.print(new String(buff,0,len));            
            System.out.println("] receive end.");
        }catch(IOException e)
        {
            e.printStackTrace();
        }finally
        {
            try
            {
                socket.close();
            }catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    }
    /*全局变量*/
    SSLSocket socket=null;
    
    //测试函数
    public static void main(String args[])
    {
        SSLClient sc=new SSLClient();
        String msg="Hello SSL Server.";
        if(args.length==1)
        {
            msg=args[0];
        }else
        {
            System.out.println("Useage:Please input the message you want to send.");
        }
        sc.sendMessage(msg);
    }
}

安全认证证书的生成

需要两套证书:

 1、客户端(公钥、私钥) 2、服务端(公钥、私钥)

服务端应用‘服务端私钥’和‘客户端公钥’与客户端通讯;客户端应用‘客户端私钥’和‘服务端公钥’与服务端通讯。

 如下介绍证书生成(一套):

 1、用JDK的keytool生成密钥store

keytool -genkey -alias mykey -keystore srvstore

输入密码(程序中密码为‘123456’)和相应的证书信息

2、从srvstore中导出证书

keytool -export -alias mykey -file srvcert.crt -keystore srvstore

输入刚才上面设置的密码

3、将证书导到公钥中

keytool -import -alias mytrust -file srvcert.crt -keystore srvtrust

输入公钥的密码(程序中密码为‘123456’)

另一套证书的生成同上

JAVA中SSL证书认证通讯的更多相关文章

  1. java中 SSL认证和keystore使用

    java中 SSL认证和keystore使用 2013-10-12 11:08 10488人阅读 评论(0) 收藏 举报   目录(?)[+]     好久没用过SSL认证了,东西久不用,就有点生疏. ...

  2. QT https post请求(QNetworkRequest要设置SSL证书,而SSL证书认证有三种,实测成功)

    以VS开发为例.因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com ...

  3. QT https post请求(QNetworkRequest要设置SSL证书,而SSL证书认证有三种)

    因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com/product ...

  4. Java实现 SSL双向认证

    我们常见的SSL验证较多的只是验证我们的服务器是否是真实正确的,当然如果你访问的URL压根就错了,那谁也没有办法.这个就是所谓的SSL单向认证. 但是实际中,我们有可能还会验证客户端是否符合要求,也就 ...

  5. 各种编程语言忽略http的SSL证书认证

    目录 前言 代码 go语言 Python语言 Ruby语言 Java语言 PHP语言 C#语言 前言 我们内部测试的http服务器很多时候证书都是没有经过第三方认证的,我们发送http请求基本上都是忽 ...

  6. java将SSL证书导入系统密钥库

    之前安装JIRA和Confluence,配置了SSL证书之后遇到应用程序链接的问题: SSL证书不被信任,导致JIRA和Confluence无法关联. 尝试过很多办法无果之后打算放弃. 最终还是放弃了 ...

  7. java 中多线程之间的通讯之生产者和消费者 (多个线程之间的通讯)

    在真实开发 中关于多线程的通讯的问题用到下边的例子是比较多的 不同的地方时if 和while 的区别 如果只是两个线程之间的通讯,使用if是没有问题的. 但是在多个线程之间就会有问题 /* * 这个例 ...

  8. Java https ssl证书导入删除

    下载并命名 例如命名github.cer 放进jre的lib\security下 keytool -delete [OPTION]... 选项: -alias <alias> 要处理的条目 ...

  9. java 中多线程之间的通讯之等待唤醒机制

    wait notify () nitifyAll () 都使用在同步中,因为要对持有监视器(锁)的线程操作 所以要使用在同步中,因为只有同步才具有锁 为什么这些操作线程的方法要定义object类中呢 ...

随机推荐

  1. bg-route

    1.目录 homework add.html online.html offline.html res script action homework add.js 2.add.html<div ...

  2. LinuxIP地址、网卡相关、克隆、VM

    改IP地址(#setup) 1.输入vi /etc/sysconfig/network-scripts/ifcfg-eth0 2.里面的内容修改为 DEVICE=eth0HWADDR=FC:4D:D4 ...

  3. asp.net html table to DataTable

    添加引用 http://htmlagilitypack.codeplex.com/downloads/get/437941 protected void Export(string content,s ...

  4. Android ListView 中的checkbox

    Q:ListView + CheckBox 当上下滚动的时候有事会自动选中或取消 A:这个与ListView的缓存机制有关.当你屏幕滚动后,ListView中的item选项视图先检查缓存中是否有视图, ...

  5. beagleboneblack HDMI不能显示

    beagleboneblack  接上HDMI到电视上,没有显示画面 看了资料之后才知道 http://elinux.org/Beagleboard:BeagleBoneBlack_HDMI#Conn ...

  6. webstorm比dreamweaver强大的地方 转

    比dw强大的地方有: . 对js的开发有长足的支持,那些自动提示,代码主题,调试之类的我就不说了,主要是对流行技术的支持,比如Node.js,less,sass,jq,ext,prototype等框架 ...

  7. dfs手写栈模板

    在竞赛中如果系统栈很小的话,过深的递归会让栈溢出,这个时候我们就要自己手写栈,将递归转化成手工栈. 方法其实也很简单. 基本思路上,我们就是用栈不断的pop,push.但是何时push,何时pop呢? ...

  8. Filter 解决web网页跳转乱码

    为什么采用filter实现了字符集的统一编码 问题: 为什么会有字符集编码的问题呢?对于Java Web应用,使用Tomcat容器获取和传递的参数(request.getParameter())默认是 ...

  9. UITextField和一个UILabel绑定 浅析

    转载自:http://fengdeng.github.io/blog/2016/01/22/rxswift-dao-di-%5B%3F%5D-ge-uitextfieldshi-ru-he-he-%5 ...

  10. openwrt+ndp+ndppd+radvd+dhcpv6,ipv6穿透配置指南

    要用ipv6首先你的openwrt路由内核必须已经支持ipv6,且能安装相关软件! 首先说说最简单的ndp手工ipv6穿透,很简单,看代码详解: 环境: wan口 eth1 lan口 br-lan w ...