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类中呢 ...
随机推荐
- shell编程之服务脚本编写,文件锁以及信号捕获
shell脚本编程是linux运维工程师必备的技能,也是非常重要的一个技能,所以把shell编程学好,只有好处.基础语法我也就不讲了,学过C语言这些语言的,稍微看一下就能明白shell编程的基础,所以 ...
- eclipse添加桌面快捷方式
linuxmint系统 输入sudogedit /usr/share/applications/eclipse.desktop,在打开的文件中输入以下参数: [Desktop Entry] Encod ...
- Spring AOP面向切面编程的实现
1.涉及到的几个概念 切面类.被切对象.切入点.切入时间.切入内容:(自己命的名,好理解点) 2.看配置文件 <?xml version="1.0" encoding=&qu ...
- Tinyxml封装类COperatorXml
OperatorXml.h头文件 #ifndef _OPERATOR_XML_H_ #define _OPERATOR_XML_H_ #include <string> class TiX ...
- UVALive 7299 Boggle(深搜的姿势)
一开始确实是我的锅,我把题意理解错了,以为是一个q周围没有q的时候才可以当时qu,其实是只要碰到q,他就是qu,所以我们也可以通过预处理的方式,把字典中的不满足qu连在一起的直接去掉. 后来的各种TI ...
- android性能优化优秀文章
郭霖最近整理的文章: 合理管理内存 分析编码过程中如何避免过多内存占用,以及如何实现高性能的内存使用. 尽可能使用intentService; 当界面不可见时释放内存; 当内存紧张时释放内存; 避免b ...
- Json解析异常处理方式(JSONException: Value of type java.lang.String cannot be converted to JSONObject)
有一次从服务器解析获取到的Json字符串突然报了这个异常,由于这个json是从 php页面上推送过来的,当时就查是不是由于编码问题引起的,所以就上网搜了,网上大部分都是说由于utf-8的bom头引起的 ...
- HDU 3966 Aragorn's Story 动态树 树链剖分
Aragorn's Story Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 表单提交中记得form表单放到table外面
帝国后台按栏目搜索文章时怎么都不生效 控制台查看原来是 栏目的select的值没有提交过去,原来由于form标签在table标签里面,导致js生成的<select>标签提交失败. 解决办 ...
- 【项目笔记】【bug】数组空指针异常
package com.example.googleplay.ui.holder; import java.util.ArrayList; import android.view.View; impo ...