📄 sslsignature_record.java
字号:
/****************************************************************
* 软件:Java签名协议扩展 (Java Signature Protocol Extension, JSPE)
* 版本:V1.0
* 软件功能:实现SSL签名协议
* 模块:公共类SSLsignature_record
*-----------------------------------------------------------------
* 版权所有:中山大学软件研究所 2002
* Programmed by 佛山张峰岭 fszfl@21cn.com
* 2002.4 - 2002.5
*****************************************************************/
package com.zsusoft.zfl;
import java.io.*;
import java.util.*;
/********************************************
* 类SSLsignature_record的对象实例保存一次完整SSL签名过程的所有记录信息
* 包括签名请求消息,签名响应消息,签名请求者的证书,签名响应者的证书。
* 类中有把自身对象保存到文件和从文件中恢复的方法;把成员内容输出成可视字符串的方法。
* 这个类的对象产生的文件可以作为支持不可否认性的证据,
* 类中的main方法就支持在命令行解释SSLsignature_record对象格式的文件。.
********************************************/
public class SSLsignature_record implements Serializable
{
private boolean IamRequester;
/**
* 随机数,可以用于索引
**/
public SSLRandom random;
/**
* 签名请求信息
**/
public Signature_request signature_request;
/**
* 签名回应
**/
public Signature_reply signature_reply;
/**
* 本方的X509证书
**/
public java.security.cert.Certificate my_certificate;
/**
* 对方的X509证书
**/
public javax.security.cert.Certificate partner_certificate;
/**
* 本构造函数为请求者调用
* (注:做成两个生成函数因为partner的证书从SSL Session(会话)中取得
* 从SSL session中取得的证书类型与从Java Key Store加载的不兼容,这个问题等候Sun解决)
* 理论上签名涉及的双方都要保存签名记录作为不可否认的证据
**/
public SSLsignature_record(Signature_request S_request,Signature_reply S_reply,java.security.cert.Certificate requester,
javax.security.cert.Certificate replier){
random=S_request.random;
signature_request = S_request;
signature_reply = S_reply;
my_certificate = requester;
partner_certificate = replier;
IamRequester = true;
}
/**
* 本构造函数为响应者调用
**/
public SSLsignature_record(Signature_request S_request,Signature_reply S_reply,javax.security.cert.Certificate requester,
java.security.cert.Certificate replier){
random=S_request.random;
signature_request = S_request;
signature_reply = S_reply;
partner_certificate = requester;
my_certificate = replier;
IamRequester = false; //我是响应者
}
/**
* 从文件中恢复SSLsignature_record对象实例
* filename是保存SSLsignature_record对象的文件名
*
**/
public static SSLsignature_record restore_from_file(String filename)
{
SSLsignature_record S_record = null;
try {
ObjectInputStream Objectfile = new ObjectInputStream(
new FileInputStream(filename));
S_record = (SSLsignature_record) Objectfile.readObject();
Objectfile.close();
} catch(Exception e){
System.err.println("无法从文件"+filename+"中恢复SSLsignature_record对象。原因:"+ e.getMessage());
e.printStackTrace();
}
return S_record;
}
/**
* 把本SSLsignature_record对象保存到文件中
* filename是文件名
* 成功返回true
**/
public boolean save_to_file(String filename)
{
try {
ObjectOutputStream Objectfile = new ObjectOutputStream(
new FileOutputStream(filename));
Objectfile.writeObject(this);
Objectfile.close();
return true;
} catch(Exception e){
System.err.println("保存SSLsignature_record对象到文件"+filename+"出错。原因:"+ e.getMessage());
e.printStackTrace();
return false;
}
}
/**
* 保存到缺省文件中
* 缺省文件取名方式 日期_时间.请求者Subject Distinguished Name中的CN_响应者Subject Distinguished Name中的CN
* 文件名格式:YYYY_MM_DD_HH_MM_SS.AAABBB_CCCDDD
* AAABBB表示请求者Subject Distinguished Name中的CN
* CCCDDD表示响应者Subject Distinguished Name中的CN
**/
public boolean save_to_file()
{
String my_SubjectDN = null;
String partner_SubjectDN = null;
String my_SubjectDN_CN = null;
String partner_SubjectDN_CN = null;
my_SubjectDN = ((java.security.cert.X509Certificate)my_certificate).
getSubjectDN().getName();
{
int begin=my_SubjectDN.indexOf("CN="); //定位CN域头
int end=my_SubjectDN.indexOf(",",begin); //定位CN域尾
if(end<0){
my_SubjectDN_CN=my_SubjectDN.substring(begin+3);
}
else{
my_SubjectDN_CN=my_SubjectDN.substring(begin+3,end);
}
}
partner_SubjectDN = ((javax.security.cert.X509Certificate)partner_certificate).
getSubjectDN().getName();
{
int begin=partner_SubjectDN.indexOf("CN="); //定位CN域头
int end=partner_SubjectDN.indexOf(",",begin); //定位CN域尾
if(end<0){
partner_SubjectDN_CN=partner_SubjectDN.substring(begin+3);
}
else{
partner_SubjectDN_CN=partner_SubjectDN.substring(begin+3,end);
}
}
Date date = new Date(random.gmt_unix_time);
String filename = null;
if ( IamRequester ) filename = Integer.toString(date.getYear()+1900) + "_" +
Integer.toString(date.getMonth()+1) + "_" + Integer.toString(date.getDate()) + "_" +
Integer.toString(date.getHours()) + "_" + Integer.toString(date.getMinutes()) + "_" +
Integer.toString(date.getSeconds()) +
"."+my_SubjectDN_CN+"_"+partner_SubjectDN_CN;
else
filename = Integer.toString(date.getYear()+1900) + "_" +
Integer.toString(date.getMonth()+1) + "_" + Integer.toString(date.getDate()) + "_" +
Integer.toString(date.getHours()) + "_" + Integer.toString(date.getMinutes()) + "_" +
Integer.toString(date.getSeconds()) +
"."+partner_SubjectDN_CN+"_"+my_SubjectDN_CN;
return save_to_file(filename);
}
/**
* 本SSLsignature_record对象的内容转换成可视的字符串
**/
public String toString()
{
String return_str = "交易时间:"+(new Date(random.gmt_unix_time)).toString()+"\r\n";
if (IamRequester) //我是请求者
{
return_str +="请求者证书:\r\n";
return_str += my_certificate.toString()+"\r\n";
return_str += "签名请求的内容:\r\n";
return_str += signature_request.toString()+"\r\n";
return_str += "响应者证书:\r\n";
return_str += partner_certificate.toString()+"\r\n";
return_str += "签名响应的内容:\r\n";
return_str += my_certificate.toString()+"\r\n";
}
else
{
return_str +="请求者证书:\r\n";
return_str += partner_certificate.toString()+"\r\n";
return_str += "签名请求的内容:\r\n";
return_str += signature_request.toString()+"\r\n";
return_str += "响应者证书:\r\n";
return_str += my_certificate.toString()+"\r\n";
return_str += "签名响应的内容:\r\n";
return_str += signature_reply.toString()+"\r\n";
}
return return_str;
}
/**
* main:解释一个签名记录文件
* 用法:java com.zsusoft.zfl.SSLsignature_record 文件名
**/
public static void main(String args[])
{
if ( args.length != 1){
System.err.println("用法:java com.zsusoft.zfl.SSLsignature_record 文件名");
System.exit(-1);
}
SSLsignature_record record = SSLsignature_record.restore_from_file(args[0]);
if ( record != null ){
System.out.println(record.toString());
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -