?? 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 + -