SSL和数字证书资料
SSL(安全套接层)是Netscape公司在1994年开发的,最初用于WEB浏览器,为浏览器与服务器间的数据传递提供安全保障,提供了加密、来源认证和数据完整性的功能。现在SSL3.0得到了普遍的使用,它的改进版TLS(传输层安全)已经成为互联网标准。SSL本身和TCP套接字连接是很相似的,在协议栈中,SSL可以被简单的看作是安全的TCP连接,但是某些TCP连接的特性它是不支持的,比如带外数据(out-of-bound)。
在构建基于Socket的C/S程序时,通过添加对SSL的支持来保障数据安全和完整是不错的方法。完善的Java为我们提供了简单的实现方法:
JSSE(Java 安全套接字扩展)。JSSE是一个纯Java实现的SSL和TLS协议框架,抽象了SSL和TLS复杂的算法,使安全问题变得简单。JSSE已经成为J2SE1.4版本中的标准组件,支持SSL 3.0和TLS 1.0。我们将通过一个具体的例子演示JSSE的一些基本应用。例子中的服务器端将打开一个SSL Socket,只有持有指定证书的客户端可以与它连接,所有的数据传递都是加密的。
1  构造一个SSLSocket
SSLServerSocketFactory factory=(SSLServerSocketFactory)Default();
SSLServerSocket server = (SSLServerSocket) ateServerSocket (portNumber);
SSLSocket socket = (SSLSocket);
但是执行这样的程序会产生一个异常,报告不到可信任的证书。SSLSocket和普通的Socket是不一样的,它需要一个证书来进行安全认证。
2 生成CA证书
最简单的命令是生成一个自签名的证书,并把它放到指定的keystore文件中:在命令行中输入:keytool -genkey -alias tomcat -keyalg RSA -keystore c:/mykey 如果c:/mykey文件不存在,keytool会生成这个文件。按照命令的提示,回答一系列问题,就生成了数字证书。注意,公共名称(cn)应该是服务器的域名。这样keystore中就存在一个别名为tomcat的实体,它包括公钥、私钥和证书。这个证书是自签名的。
系统生成的文件命将会和证书名相同。证书可以提交给权威CA认证组织审核,如果通过审核,组织会提供信任担保,向客户担保你的连接是安全的。当然这不是必须的。在我们的例子中会把证书直接打包到客户端程序中,保证客户端是授权用户,避免伪造客户,所以不需要提交审核。
3 服务器端
现在可以编写服务器端的代码,与普通的Socket代码不同,我们需要在程序中导入证书,并使用该证书
构造SSLSocket。需要的说明的是:
●KeyStore Instance("JKS");
访问Java密钥库,JKS是keytool创建的Java密钥库,保存密钥。
● KeyManagerFactory Instance("SunX509");
创建用于管理JKS密钥库的X.509密钥管理器。
● SSLContext Instance("SSLv3");
构造SSL环境,指定SSL版本为3.0,也可以使用TLSv1,但是SSLv3更加常用。
●sslContext.KeyManagers(),null,null);
初始化SSL环境。第二个参数是告诉JSSE使用的可信任证书的来源,设置为null是从ustStore中获得证书。第三个参数是JSSE生成的随机数,这个参数将影响系统的安全性,设置为null是个好选择,可以保证JSSE的安全性。
完整代码如下:
107.ssl;
import java.*;
import javax.ssl.*;
import java.io.*;
import java.security.*;
public class SSLServer
{
static int port=8266;  //系统将要监听的端口号
static SSLServerSocket server;
/*
*构造函数
*/
public SSLServer()
{
}
/*
*@param port 监听的端口号
*@return 返回一个SSLServerSocket对象
*/
private static SSLServerSocket getServerSocket(int thePort)
{
SSLServerSocket s=null;
try
{
String key="SSLKey";  //要使用的证书名
char keyStorePass[]="12345678".toCharArray();  //证书密码
char keyPassword[]="12345678".toCharArray();  //证书别称所使用的主要密码
KeyStore Instance("JKS");  //创建JKS密钥库
ks.load(new FileInputStream(key),keyStorePass);
//创建管理JKS密钥库的X.509密钥管理器
KeyManagerFactory Instance("SunX509");
kmf.init(ks,keyPassword);
SSLContext Instance("SSLv3");
免费ssl证书永久生成
sslContext.KeyManagers(),null,null);
//根据上面配置的SSL上下文来产生SSLServerSocketFactory,与通常的产生方法不同
SSLServerSocketFactory ServerSocketFactory();
s=(ateServerSocket(thePort);
}catch(Exception e)
{
System.out.println(e);
}
return(s);
}
public static void main(String args[])
{
try
{
server=getServerSocket(port);
System.out.println("在”+port+”端口等待连接...");
while(true)
{
SSLSocket socket=(SSLSocket)server.accept();
//将得到的socket交给CreateThread对象处理,主线程继续监听    new CreateThread(socket);
}
}catch(Exception e)
{
System.out.println("main方法错误80:"+e);
}
}
}