?? ssl_with_signature.java
字號(hào):
}
else
{
replydata_length = buffer[p] & 127 + 128;
}
replydata_length = replydata_length <<8;
p++;
if(buffer[p] >=0 ){
replydata_length = buffer[p];
}
else
{
replydata_length = buffer[p] & 127 + 128;
}
p++;
S_reply.replydata_length = replydata_length;
S_reply.replydata=new byte[S_reply.replydata_length];
for(int i=0;i<S_reply.replydata_length;i++)S_reply.replydata[i]=buffer[p++];
byte signatureAlgorithm=buffer[p++]; //簽名算法
//int s_length=(new Byte(buffer[p++])).intValue(); //簽名值的長(zhǎng)度
int s_length = 0;
if(buffer[p]>=0){
s_length = buffer[p];
}
else
{
s_length = buffer[p] & 127 + 128;
}
p++;
byte[] signatureValue=new byte[s_length];
for(int i=0;i<s_length;i++)signatureValue[i]=buffer[p++];
DSignature reply_signature=new DSignature(signatureAlgorithm,s_length,signatureValue);
S_reply.signature=reply_signature;
Show_Message("對(duì)方返回簽名響應(yīng),內(nèi)容如下:");
Show_Message(S_reply.toString());
//驗(yàn)證對(duì)方的簽名
//獲取對(duì)方的證書和公鑰
String partner_SubjectDN=null; //對(duì)方證書的主題標(biāo)識(shí)名稱(subject distinguished name)
javax.security.cert.Certificate partner_cert =null; //對(duì)方的證書,要使用Jsse定義的,不能使用原Java定義
PublicKey partner_publickey = null;
try{
//直接從SSL中獲取公鑰
SSLSession sslsession=((SSLSocket)s).getSession(); //獲取本次SSL連接使用的SSL會(huì)話
partner_cert=(javax.security.cert.Certificate)(sslsession.getPeerCertificateChain()[0]); //對(duì)方的證書
Show_Debug_Message("對(duì)方證書信息");
Show_Debug_Message(partner_cert.toString());
partner_publickey=partner_cert.getPublicKey();
Show_Debug_Message("對(duì)方的公鑰信息");
Show_Debug_Message(partner_publickey.toString());
partner_SubjectDN=((javax.security.cert.X509Certificate)partner_cert).getSubjectDN().getName();
if(S_reply.signature.Verify(S_reply.replydata,partner_publickey)){
Show_Message("對(duì)方的數(shù)字簽名驗(yàn)證通過!");
}
else
{
Show_Message("對(duì)方的數(shù)字簽名驗(yàn)證無法通過,可能是一個(gè)非法的簽名!");
}
} catch (Exception e) {
System.err.println("試圖驗(yàn)證對(duì)方數(shù)字簽名時(shí)出錯(cuò):" + e.getMessage());
e.printStackTrace();
}
try{
s.close(); //關(guān)閉socket
} catch (IOException e)
{
System.err.println("關(guān)閉socket出錯(cuò):" + e.getMessage());
e.printStackTrace();
}
Show_Message("保存簽名記錄");
Log_Object.SaveSignToLog(partner_SubjectDN+"在"+partner_host+"返回簽名響應(yīng),\n",S_request,S_reply);
return new SSLsignature_record(S_request,S_reply,my_certificate,partner_cert); //這里即使驗(yàn)證數(shù)字簽名通不過也不管
}
else
{
Show_Message("對(duì)方返回的隨機(jī)數(shù)與我方發(fā)出的不同!");
try{
s.close(); //關(guān)閉socket
} catch (IOException e)
{
System.err.println("關(guān)閉socket出錯(cuò):" + e.getMessage());
e.printStackTrace();
}
return null;
}
default:
Show_Message("接收到的消息類型不對(duì)!");
try{
s.close(); //關(guān)閉socket
} catch (IOException e)
{
System.err.println("關(guān)閉socket出錯(cuò):" + e.getMessage());
e.printStackTrace();
}
return null;
}
//return null;
}
/**
* 顯示調(diào)試信息
**/
public static void Show_Debug_Message(String msg){
if(debug_mode){
System.err.println(msg);
System.err.flush();
}
}
/**
* 顯示提示信息
**/
public static void Show_Message(String msg){
System.out.println(msg);
System.out.flush();
}
/**
* Show_Buffer_Hex:以Hex方式顯示緩沖區(qū)的內(nèi)容
**/
public static void Show_Buffer_Hex(String Desc,byte[] buf,int len) {
if(debug_mode){
System.err.println(Desc+":");
for(int i=0;i<len;++i){
System.err.print("["+Conversion.byteToHexString(buf[i])+"]");
}
System.err.println();
}
}
/**
* 提示客戶輸入信息
**/
public static String keyinString(String prompt){
try{
String inputLine;
BufferedReader in=new BufferedReader(
new InputStreamReader(System.in));
//System.err.println();
System.err.print(prompt);
System.err.flush();
inputLine=in.readLine();
return inputLine;
} catch (IOException e) {
System.err.println("輸入信息出錯(cuò):" + e.getMessage());
e.printStackTrace();
return null;
}
}
/**
* 彈出輸入窗口提示用戶輸入字符串
* Desc 為提示
* echoinput 為true時(shí)顯示鍵入的字符 為false顯示*號(hào)
* 返回輸入的字符串
**/
public static String inputString_with_window(String Desc,boolean echoinput)
{
return message_box.inputString(Desc,echoinput);
}
/**
* 等價(jià)于inputString_with_window(String Desc,true);
**/
public static String inputString_with_window(String Desc)
{
return inputString_with_window(Desc,true);
}
/**
* 要求用戶人工確認(rèn)簽名
* S_request:簽名請(qǐng)求消息
* partner_cert:對(duì)方的數(shù)字證書
**/
public static boolean RequestPeopleConfirmSign(Signature_request S_request,javax.security.cert.Certificate partner_cert)
{
Show_Message("以下是您收到的簽名請(qǐng)求:");
Show_Message("簽名請(qǐng)求者證書:"+partner_cert.toString());
String Desc_Message = null;
try{
Show_Message("請(qǐng)求簽名的原因描述:"+(new String(S_request.signdata_desc,SSL_with_signature.BYTE_ENCODING)));
Show_Message("要求您簽名的數(shù)據(jù):"+(new String(S_request.signdata,SSL_with_signature.BYTE_ENCODING)));
Desc_Message = "收到簽名請(qǐng)求\n對(duì)方的數(shù)字證書:\n"+partner_cert.toString()+
"\n請(qǐng)求簽名的原因描述:"+(new String(S_request.signdata_desc,SSL_with_signature.BYTE_ENCODING))+"\n"+
"要求您簽名的數(shù)據(jù):"+(new String(S_request.signdata,SSL_with_signature.BYTE_ENCODING))+"\n"+
"您同意為該支付請(qǐng)求簽名嗎,提醒您注意,您的簽名將具法律效力\n鍵入YES后表示同意,其他取消:";
} catch ( UnsupportedEncodingException e)
{
Show_Message("請(qǐng)求簽名的原因描述(使用本地字符集):"+(new String(S_request.signdata_desc)));
Show_Message("要求您簽名的數(shù)據(jù):"+(new String(S_request.signdata)));
Desc_Message = "收到簽名請(qǐng)求\n對(duì)方的數(shù)字證書:\n"+partner_cert.toString()+
"\n請(qǐng)求簽名的原因描述:"+(new String(S_request.signdata_desc))+"\n"+
"要求您簽名的數(shù)據(jù):"+(new String(S_request.signdata))+"\n"+
"您同意為該支付請(qǐng)求簽名嗎,提醒您注意,您的簽名將具法律效力\n鍵入YES后表示同意,其他取消:";
}
Show_Message("十六進(jìn)制表示:");
Show_Message(Conversion.byteArrayToHexString(S_request.signdata));
String command=SSL_with_signature.inputString_with_window(Desc_Message);
Show_Message("您選擇了"+command);
if(command.toUpperCase().equals("YES"))
{
//SaveSignToLog(partner_name,S_request,S_reply);
return true;
}
else
{
return false;
}
}
/**
* main僅用于調(diào)試和演示SSL簽名協(xié)議
* 程序用法:
* java com.zsusoft.zfl.SSL_with_signature [-debug] <mykeystore:私鑰庫> [-alias:Key Entry的alias] [-password:密碼]
* <-certkeystore:信任證書庫> [-certpassword:密碼] [-logfile:日志文件名]
* 參數(shù)項(xiàng)目不分先后 其中[]表示可選 <>表示必選
* 使用的私鑰庫和證書庫使用SUN JKS(Java Key Store)格式文件
**/
public static void main(String[] args) throws Exception {
boolean debug_mode = false;
String my_keystorefile = null; //我的私鑰庫
String my_alias = "mykey"; //私鑰庫中放私鑰的項(xiàng)目的alias name(參考Java Key Store的說明)
String password =null; //訪問私鑰的密碼,本處假定訪問私鑰的密碼和存取Java Key Store的密碼相同
String trust_keystorefile = null ; //信任證書庫
String trust_password = null ; //信任證書庫的訪問密碼
String logfile =null;
for (int i = 0; i < args.length; ++i){
if(args[i].equals("-debug"))debug_mode=true;
if(args[i].startsWith("-mykeystore:")){
my_keystorefile=args[i].substring(12);
//System.out.println("密鑰庫:"+my_keystorefile);
}
if(args[i].startsWith("-alias:")){
my_alias=args[i].substring(7);
//System.out.println("私鑰的alias name:"+my_alias);
}
if(args[i].startsWith("-password:")){
password=args[i].substring(10);
//System.out.println("密鑰庫密碼:"+password);
}
if(args[i].startsWith("-certkeystore:")){
trust_keystorefile=args[i].substring(14);
//System.out.println("證書庫:"+trust_keystorefile);
}
if(args[i].startsWith("-certpassword:")){
trust_password=args[i].substring(14);
//System.out.println("證書庫密碼:"+trust_password);
}
if(args[i].startsWith("-logfile:"))logfile=args[i].substring(9);
}
Show_Message("********************************************************************");
Show_Message("* 軟件:Java簽名協(xié)議擴(kuò)展 (Java Signature Protocol Extension, JSPE) *");
Show_Message("* 版本:V1.0 *");
Show_Message("* 軟件功能:實(shí)現(xiàn)SSL簽名協(xié)議 *");
Show_Message("*------------------------------------------------------------------*");
Show_Message("* 版權(quán)所有:中山大學(xué)軟件研究所 2002 *");
Show_Message("* Programmed by 佛山張峰嶺 fszfl@21cn.com *");
Show_Message("* 2002.4 - 2002.5 *");
Show_Message("********************************************************************");
if((my_keystorefile == null)||(trust_keystorefile == null)){
System.err.println("程序用法:");
System.err.println("java com.zsusoft.zfl.SSL_with_signature [-debug] <mykeystore:私鑰庫> [-alias:Key Entry的alias] [-password:密碼] \\");
System.err.println(" <-certkeystore:信任證書庫> [-certpassword:密碼] [-logfile:日志文件名]");
System.err.println("參數(shù)項(xiàng)目不分先后 其中[]表示可選 <>表示必選");
System.exit(-1); //退出
}
if(password == null){
password=inputString_with_window("請(qǐng)輸入您的個(gè)人私鑰庫的密碼:",false);
}
KeyStore mykeystore = KeyStore.getInstance("JKS", "SUN");;
try{
mykeystore.load(new FileInputStream(my_keystorefile),password.toCharArray());
} catch (Exception e)
{
System.err.println("裝入私人密鑰庫"+ my_keystorefile + "出錯(cuò):" + e.getMessage());
e.printStackTrace();
System.exit(-1);
}
if(trust_password == null){
trust_password=inputString_with_window("請(qǐng)輸入信任證書庫的密碼:",false);
}
KeyStore trustkeystore = KeyStore.getInstance("JKS", "SUN");
try{
trustkeystore.load(new FileInputStream(trust_keystorefile),trust_password.toCharArray());
} catch (Exception e)
{
System.err.println("裝入信任證書庫"+ trust_keystorefile +"出錯(cuò):" + e.getMessage());
e.printStackTrace();
System.exit(-1);
}
String Command="Wait";
SSL_with_signature ssl_with_signature = null;
try{
ssl_with_signature = new SSL_with_signature(mykeystore,my_alias,password,trustkeystore,logfile);
} catch ( Exception e)
{
System.err.println("創(chuàng)建SSL_with_signature對(duì)象出錯(cuò):" + e.getMessage());
e.printStackTrace();
System.exit(-1);
}
ssl_with_signature.debug_mode=debug_mode;//設(shè)置調(diào)試開關(guān)
System.out.println("見=>請(qǐng)輸入命令 exit退出,help幫助");
//定義回調(diào)函數(shù)
SSLsignature_reply_callback callback=new SSLsignature_reply_callback()
{
/*
* Check_Signature_Request:表示接收到合法的簽名請(qǐng)求后檢查簽名請(qǐng)求中的數(shù)據(jù)
* 可以在這個(gè)地方加入執(zhí)行簽名前的一些前期處理,返回false表示拒絕簽名
* S_request是簽名請(qǐng)求數(shù)據(jù)
* partner_cert是從SSLsession中獲取的對(duì)方的證書
*/
return SSL_with_signature.RequestPeopleConfirmSign(S_request,partner_cert); //用戶人工確認(rèn)
}
/*
* Put_Attach_Data:加上簽名返回時(shí)的附加數(shù)據(jù)
*/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -