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.");
}
}