基于ssl双向认证的详细例子

产生服务端证书库
keytool -genkey -alias serverkey -keystore kserver.ks
产生服务端私有密匙
keytool -export -alias serverkey -keystore kserver.ks -file server.crt
产生服务端公有密匙
keytool -import -alias serverkey -file server.crt -keystore tclient.ks
产生客户端证书库
keytool -genkey -alias clientkey -keystore kclient.ks
产生客户端私有密匙
keytool -export -alias clientkey -keystore kclient.ks -file client.crt
产生客户端公有密匙
keytool -import -alias clientkey -file client.crt -keystore tserver.ks
删除服务端证书库
keytool -delete -alias serverkey -keystore kserver.ks -storepass 123456
删除客户端证书库
keytool -delete -alias clientkey -keystore kclient.ks -storepass 456789
删除后,必须手动删除这些文件,以便重复操作

具体过程如下:
D:\>keytool -genkey -alias serverkey -keystore kserver.ks
输入keystore密码: 123456
您的名字与姓氏是什么?
[Unknown]: xuguo
您的组织单位名称是什么?
[Unknown]: fruitking
您的组织名称是什么?
[Unknown]: fruitking
您所在的城市或区域名称是什么?
[Unknown]: hangzhou
您所在的州或省份名称是什么?
[Unknown]: zhejiang
该单位的两字母国家代码是什么
[Unknown]: cn
CN=xuguo, OU=fruitking, O=fruitking, L=hangzhou, ST=zhejiang, C=cn 正确吗?
[否]: y

输入<clientkey>的主密码
(如果和 keystore 密码相同,按回车): 123456

D:\>keytool -export -alias serverkey -keystore kserver.ks -file server.crt
输入keystore密码: 123456
保存在文件中的认证 <server.crt>

D:\>keytool -import -alias serverkey -file server.crt -keystore tclient.ks
输入keystore密码: 123456
Owner: CN=xuguo, OU=fruitking, O=fruitking, L=hangzhou, ST=zhejiang, C=cn
发照者: CN=xuguo, OU=fruitking, O=fruitking, L=hangzhou, ST=zhejiang, C=cn
序号: 4a9641c2
有效期间: Thu Aug 27 16:20:18 CST 2009 至: Wed Nov 25 16:20:18 CST 2009
认证指纹:
MD5: 50:6D:45:A3:37:BF:51:45:94:F0:8B:4D:42:9F:72:8A
SHA1: A9:C6:26:7E:A2:3E:B9:68:B8:E4:FE:E0:C2:3C:C9:E0:A3:67:76:B5
信任这个认证? [否]: y
认证已添加至keystore中

D:\>F:

F:\>cd F:\testc

F:\testc>keytool -genkey -alias clientkey -keystore kclient.ks
输入keystore密码: 456789
您的名字与姓氏是什么?
[Unknown]: xuguo
您的组织单位名称是什么?
[Unknown]: pubone
您的组织名称是什么?
[Unknown]: pubone
您所在的城市或区域名称是什么?
[Unknown]: hangzhou
您所在的州或省份名称是什么?
[Unknown]: zhejiang
该单位的两字母国家代码是什么
[Unknown]: cn
CN=xuguo, OU=pubone, O=pubone, L=hangzhou, ST=zhejiang, C=cn 正确吗?
[否]: y

输入<cclientkey>的主密码
(如果和 keystore 密码相同,按回车): 456789

F:\testc>keytool -export -alias clientkey -keystore kclient.ks -file client.crt

输入keystore密码: 456789
保存在文件中的认证 <client.crt>

F:\testc>keytool -import -alias clientkey -file client.crt -keystore tserver.ks

输入keystore密码: 456789
Owner: CN=xuguo, OU=pubone, O=pubone, L=hangzhou, ST=zhejiang, C=cn
发照者: CN=xuguo, OU=pubone, O=pubone, L=hangzhou, ST=zhejiang, C=cn
序号: 4a9643c3
有效期间: Thu Aug 27 16:28:51 CST 2009 至: Wed Nov 25 16:28:51 CST 2009
认证指纹:
MD5: FB:CC:9D:5C:E0:7E:A6:70:CB:31:78:BC:06:1F:53:BC
SHA1: 97:10:7C:B2:70:78:07:5A:2B:2D:51:8E:73:B3:71:FB:4C:51:87:05
信任这个认证? [否]: y
认证已添加至keystore中

F:\testc>

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.security.KeyStore;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.TrustManagerFactory;
public class Server {

/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
SSLContext ctx = SSLContext.getInstance("SSL");

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");

KeyStore ks = KeyStore.getInstance("JKS");
KeyStore tks = KeyStore.getInstance("JKS");

ks.load(new FileInputStream("D:/kserver.ks"), "123456".toCharArray());//服务端私匙
tks.load(new FileInputStream("F:/testc/tserver.ks"), "456789".toCharArray());//客户端公匙

kmf.init(ks, "123456".toCharArray());
tmf.init(tks);

ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

SSLServerSocket serverSocket = (SSLServerSocket) ctx.getServerSocketFactory().createServerSocket(8443);
serverSocket.setNeedClientAuth(true);

while (true) {
try {
Socket s = serverSocket.accept();
InputStream input = s.getInputStream();
OutputStream output = s.getOutputStream();

BufferedInputStream bis = new BufferedInputStream(input);
BufferedOutputStream bos = new BufferedOutputStream(output);

byte[] buffer = new byte[20];
int length = bis.read(buffer);
System.out.println("Receive: " + new String(buffer, 0, length).toString());

bos.write("Hello,Xuguo,welcome to here!".getBytes());
bos.flush();

s.close();
} catch (Exception e) {
System.out.println(e);
}
}
}

}

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.KeyStore;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManagerFactory;


public class Client {

/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
SSLContext ctx = SSLContext.getInstance("SSL");

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");

KeyStore ks = KeyStore.getInstance("JKS");
KeyStore tks = KeyStore.getInstance("JKS");

ks.load(new FileInputStream("F:/testc/kclient.ks"), "456789".toCharArray());//客户端私匙
tks.load(new FileInputStream("D:/tclient.ks"), "123456".toCharArray());//服务端公匙

kmf.init(ks, "456789".toCharArray());
tmf.init(tks);

ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SSLSocket sslSocket = (SSLSocket) ctx.getSocketFactory().createSocket("localhost", 8443);
InputStream input = sslSocket.getInputStream();
OutputStream output = sslSocket.getOutputStream();

BufferedInputStream bis = new BufferedInputStream(input);
BufferedOutputStream bos = new BufferedOutputStream(output);

//bos.write("Hello".getBytes());
bos.write("Xuguo is a super man.".getBytes());
bos.flush();

byte[] buffer = new byte[20];
int length = bis.read(buffer);
System.out.println(new String(buffer, 0, length));

sslSocket.close();
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值