JAVA中SSL证书认证通讯
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证书认证通讯的更多相关文章
- java中 SSL认证和keystore使用
java中 SSL认证和keystore使用 2013-10-12 11:08 10488人阅读 评论(0) 收藏 举报 目录(?)[+] 好久没用过SSL认证了,东西久不用,就有点生疏. ...
- QT https post请求(QNetworkRequest要设置SSL证书,而SSL证书认证有三种,实测成功)
以VS开发为例.因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com ...
- QT https post请求(QNetworkRequest要设置SSL证书,而SSL证书认证有三种)
因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com/product ...
- Java实现 SSL双向认证
我们常见的SSL验证较多的只是验证我们的服务器是否是真实正确的,当然如果你访问的URL压根就错了,那谁也没有办法.这个就是所谓的SSL单向认证. 但是实际中,我们有可能还会验证客户端是否符合要求,也就 ...
- 各种编程语言忽略http的SSL证书认证
目录 前言 代码 go语言 Python语言 Ruby语言 Java语言 PHP语言 C#语言 前言 我们内部测试的http服务器很多时候证书都是没有经过第三方认证的,我们发送http请求基本上都是忽 ...
- java将SSL证书导入系统密钥库
之前安装JIRA和Confluence,配置了SSL证书之后遇到应用程序链接的问题: SSL证书不被信任,导致JIRA和Confluence无法关联. 尝试过很多办法无果之后打算放弃. 最终还是放弃了 ...
- java 中多线程之间的通讯之生产者和消费者 (多个线程之间的通讯)
在真实开发 中关于多线程的通讯的问题用到下边的例子是比较多的 不同的地方时if 和while 的区别 如果只是两个线程之间的通讯,使用if是没有问题的. 但是在多个线程之间就会有问题 /* * 这个例 ...
- Java https ssl证书导入删除
下载并命名 例如命名github.cer 放进jre的lib\security下 keytool -delete [OPTION]... 选项: -alias <alias> 要处理的条目 ...
- java 中多线程之间的通讯之等待唤醒机制
wait notify () nitifyAll () 都使用在同步中,因为要对持有监视器(锁)的线程操作 所以要使用在同步中,因为只有同步才具有锁 为什么这些操作线程的方法要定义object类中呢 ...
随机推荐
- Ubuntu 14.04 Nvidia显卡驱动手动安装及设置
更换主板修复grub 引导后,无法从Nvidia进入系统(光标闪烁), 可能是显卡驱动出了问题. 1. 进入BIOS设置, 从集成显卡进入系统 将显示器连接到集显的VGI口, 并在BIOS中设置用 ...
- 命名空间“Microsoft”中不存在类型或命名空间名称“Office”(是缺少程序集引用吗?)
通过引用这个解决,不同的的office版本,中间的版本号可能不同,如图所示:
- IOS中Label根据上个label的内容设置下个label的frame
#import "ViewController.h" @interface ViewController () @property(nonatomic,strong)UILabel ...
- PCI源码学习笔记
这个是PCI的关键结构体. static const struct file_operations proc_bus_pci_operations = { .owner = THIS_MODULE, ...
- Puppent 基本使用方法
简单的文件配置 master端 vim /etc/puppet/manifests/site.pp ###########################内容如下 node default{ file ...
- sinaBlog中小知识总结
1.上拉刷新的时候记得移除老的数据(同样应用于其他地方) if (vc.currentPage == 1) { //上拉加载 记得移除新的 [vc.totalArr removeAllObjects] ...
- redis - java 基本操作
import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; im ...
- java基础概念经典题目汇集
1.下面是People和Child类的定义和构造方法,每个构造方法都输出编号.在执行new Child("mike")的时候都有哪些构造方法被顺序调用?请选择输出结果 ( ) cl ...
- NSTimer内存方面的探究
今天研究一个框架,看到它对NSTimer的处理,感觉很有意思.于是自己在各种情况下都研究了一下,现总结如下. 我们用到NSTimer时,似乎习惯于会在dealloc方法中把它invalidate掉,但 ...
- KVC 实战浅析
KVC 就是 key value coding,废话! 今天我们研究的是如何使用它! key value coding : 间接通过字符串类型的key取出对应的属性值 KVC的价值 1.可以访问私有成 ...