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. 我的 Github 个人博客是怎样炼成的

    Joey's Blog 长大后才发现政府建造 GFW 真是太 TM 机智了,由于本人自制力较差,且不说 91porn, youporn 等两性知识网站的超强战斗力,单单一个Youtube就可以让我瞬间 ...

  2. 轻松创建nodejs服务器(1):一个简单nodejs服务器例子

    这篇文章主要介绍了一个简单nodejs服务器例子,本文实现了一个简单的hello world例子,并展示如何运行这个服务器,需要的朋友可以参考下   我们先来实现一个简单的例子,hello world ...

  3. Redis和Memcached的区别【转】

    如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:1 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储.2 Redis支持数据 ...

  4. weblogic11g 配置数据源

    配置连接数据源步骤详解: 服务器:Weblogic11g,使用JNDI配置 步骤一: 输入http://localhost:7001/console/,登录控制台: 步骤二:按下图要求配置后,进入“下 ...

  5. TortoiseGit保存用户名密码的方法

    方法一: 设置 -> git 编辑本地 .git/config 增加 1 [credential]    2     helper = store 保存,输入一次密码后第二次就会记住密码了 方法 ...

  6. Shell script fails: Syntax error: “(” unexpected

    Shell script fails: Syntax error: “(” unexpected google 一下. http://unix.stackexchange.com/questions/ ...

  7. include和 merge

    include和merge标记的作用主要是为了解决layout的重用问题. 比如我们有三四个Activity但是他们都要用到同一个样式的标题栏,虽然我们把一样的代码copy个三四遍也没关系,但实在是太 ...

  8. SQL添加表字段以及SQL查询表,表的所有字段名

    通用式: alter table [表名] add [字段名] 字段属性 default 缺省值 default 是可选参数 增加字段: alter table [表名] add 字段名 smalli ...

  9. 关于Winform中的用户代理

    问题描述: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 解释: 1. 应用程序版本“Mozilla ...

  10. 推荐 iOS 网站:

    0. https://developer.apple.com/videos/1. http://www.raywenderlich.com2. http://nshipster.com3. http: ...