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类中呢 ...
随机推荐
- flex、As 3.0 小知识
<s:CheckBox id="checkBox" x="10" y="5" label="{new ObjectProx ...
- linux CTRL+Z
关于 linux 系统中使用ctrl+Z 的使用 (1) CTRL+Z停止进程并放入后台 (2) jobs 显示当前暂停的进程 (3) bg %N 使第N个任务在后台运行(%前有空格) ,N 为任务号 ...
- 运维命令rsync
如果你是一位运维工程师,你很可能会面对几十台.几百台甚至上千台服务器,除了批量操作外,环境同步.数据同步也是必不可少的技能. 说到“同步”,不得不提的利器就是rsync,今天就来说说我从这个工具中看到 ...
- jquery新窗口打开链接
第一种:下面的代码是针对m35ui这个样式下的a都是在新窗口打开 <script type="text/javascript"> jQuery(document ...
- PHP数组函数试题
使用Ctrl+A查看答案 1.将数组的键名全部转换成小写和大写的函数是什么?答:array_change_key_case($array [,CASE_LOWER|CASE_UPPER]) 2.创建一 ...
- think in uml 1
对象,在过程的基础上,是一个抽象级别的提升,可以构建更大更复杂的系统 数据流图(Data Flow Diagram):简称DFD,它从数据传递和加工角度,以图形方式来表达系统的逻辑功能.数据在系统内部 ...
- SQLServer在多个表中都增加一个字段的方法
1.使用游标 declare @sql varchar(), @name varchar() declare my_cursor scroll cursor for select name from ...
- java中的类修饰符、成员变量修饰符、方法修饰符
类修饰符: public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类. abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. fi ...
- JPA 系列教程7-双向多对多
双向多对多的ddl语句 同单向多对多表的ddl语句一致 Student package com.jege.jpa.many2many; import java.util.HashSet; import ...
- runtime关联属性示例
前言 在开发中经常需要给已有的类添加方法和属性,但是Objective-C是不允许给已有类通过分类添加属性的,因为类分类是不会自动生成成员变量的.但是,我们可以通过运行时机制就可以做到了. 本篇文章适 ...