关于java与SSL证书的一些资料

来源:互联网 发布:java redis分布式教程 编辑:程序博客网 时间:2024/05/20 10:22

http://hi.baidu.com/liuchyx2007/blog/item/1f1014998af92e0c6f068c56.html
http://hi.baidu.com/rover828/blog/item/4cde5db52e3430c837d3caae.html
http://www.javaeye.com/topic/363156    (java+ssl例子)
http://java.chinaitlab.com/p2pJxta/24676.html   例子
http://www.svn8.com/java/Socket/20080926/1020.html  Java网络编程-用SSL构建安全的Socket

http://download.csdn.net/sort/tag/KeyTool  相关资源下载


javax.net.ssl
javax.rmi.ssl


http://blog.csdn.net/CYHJRX/archive/2009/02/17/3899577.aspx  //证书的使用方法 很好
http://tech.it168.com/j/2007-10-19/200710192223750_3.shtml
http://blog.csdn.net/fallraining/archive/2009/01/06/3718932.aspx
http://www.google.cn/search?hl=zh-CN&newwindow=1&q=java%E5%AE%89%E5%85%A8%E9%80%9A%E4%BF%A1%E3%80%81%E6%95%B0%E5%AD%97%E8%AF%81%E4%B9%A6%E5%8F%8A%E5%BA%94%E7%94%A8%E5%AE%9E%E8%B7%B5&aq=3&oq=java%E5%AE%89%E5%85%A8

应该这样,第一次从主站下载证书,和软件,把证书置入jvm中,等第二次登录的时候就读本地jvm中的证书和主站的匹配,正确则登录成功

/********************************************************************
 * 项目名称    :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.");
    }
}