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. Ubuntu 14.04 Nvidia显卡驱动手动安装及设置

      更换主板修复grub 引导后,无法从Nvidia进入系统(光标闪烁), 可能是显卡驱动出了问题. 1. 进入BIOS设置, 从集成显卡进入系统 将显示器连接到集显的VGI口, 并在BIOS中设置用 ...

  2. 命名空间“Microsoft”中不存在类型或命名空间名称“Office”(是缺少程序集引用吗?)

    通过引用这个解决,不同的的office版本,中间的版本号可能不同,如图所示:

  3. IOS中Label根据上个label的内容设置下个label的frame

    #import "ViewController.h" @interface ViewController () @property(nonatomic,strong)UILabel ...

  4. PCI源码学习笔记

    这个是PCI的关键结构体. static const struct file_operations proc_bus_pci_operations = { .owner = THIS_MODULE, ...

  5. Puppent 基本使用方法

    简单的文件配置 master端 vim /etc/puppet/manifests/site.pp ###########################内容如下 node default{ file ...

  6. sinaBlog中小知识总结

    1.上拉刷新的时候记得移除老的数据(同样应用于其他地方) if (vc.currentPage == 1) { //上拉加载 记得移除新的 [vc.totalArr removeAllObjects] ...

  7. redis - java 基本操作

    import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; im ...

  8. java基础概念经典题目汇集

    1.下面是People和Child类的定义和构造方法,每个构造方法都输出编号.在执行new Child("mike")的时候都有哪些构造方法被顺序调用?请选择输出结果 ( ) cl ...

  9. NSTimer内存方面的探究

    今天研究一个框架,看到它对NSTimer的处理,感觉很有意思.于是自己在各种情况下都研究了一下,现总结如下. 我们用到NSTimer时,似乎习惯于会在dealloc方法中把它invalidate掉,但 ...

  10. KVC 实战浅析

    KVC 就是 key value coding,废话! 今天我们研究的是如何使用它! key value coding : 间接通过字符串类型的key取出对应的属性值 KVC的价值 1.可以访问私有成 ...