当前位置:天才代写 > tutorial > JAVA 教程 > Java安详通信、数字证书及应用实践

Java安详通信、数字证书及应用实践

2017-11-11 08:00 星期六 所属: JAVA 教程 浏览:479

副标题#e#

摘要:

在本文中,我用具体的语言和大量的图片及完整的措施源码向你展示了在 JAVA中如何实现通过动静摘要、动静验证码到达安详通信、以及用Java的东西生成数字证书,和用措施给数字证书签名、以及用签名后的数学证书签名applet打破applet的会见权限的进程,给出了全部例子的具体代码。

通过本文中你可以学到以下常识:

● 措施间如何安详通信

● 什么是 及 如何生成动静摘要

● 什么是 及 如何生成动静验证码

● 如何利用 Java东西生成和维护数字证书库

● 如何用措施给数字证书验证签名

● 如何操作数字证书给 applet签名打破applet的会见权限

要害字:

动静摘要、动静验证码、指纹、加密、安详、 Java、数字签名、applet、数字证书

一、基本常识

计较机安详通信进程中,常利用动静摘要和动静验证码来担保传输的数据不曾被第三方修改。

动静摘要是对原始数据凭据必然算法举办计较获得的功效,它主要检测原始数据是否被修悔改。动静摘要与加密差异,加密是对原始数据举办调动,可以从调动后的数据中得到原始数据,而动静摘要是从原始数据中得到一部门信息,它比原始数据少得多,因此动静摘要可以看作是原始数据的指纹。

例:下面一段措施计较一段字符串的动静摘要

package com.messagedigest;
import java.security.*;
public class DigestPass {
 public static void main(String[] args) throws Exception{
  String str="Hello,I sent to you 80 yuan.";
  MessageDigest md = MessageDigest.getInstance("MD5");//常用的有MD5,SHA算法等
  md.update(str.getBytes("UTF-8"));//传入原始字串
  byte[] re = md.digest();//计较动静摘要放入byte数组中
  //下面把动静摘要转换为字符串
  String result = "";
  for(int i=0;i<re.length;i++){
   result += Integer.toHexString((0x000000ff&re[i])|0xffffff00).substring(6);
  }
  System.out.println(result);
 }
}


#p#副标题#e#

当我们有时需要对一个文件加密时,以上方法不再合用。

又例:下面一段措施计较从输入(出)流中计较动静摘要。

package com.messagedigest;
import java.io.*;
import java.security.*;
public class DigestInput {
 public static void main(String[] args) throws Exception{
  String fileName = "test.txt";
  MessageDigest md = MessageDigest.getInstance("MD5");
  FileInputStream fin = new FileInputStream(fileName);
  DigestInputStream din = new DigestInputStream(fin,md);//结构输入流
  //DigestOutputStream dout = new DigestOutputStream(fout,md);
  //利用输入(出)流可以本身节制何时开始和封锁计较摘要
  //也可以不节制,将全进程计较
  //初始时是从开始即开始计较,如我们可以开始时封锁,然后从某一部门开始,如下:
  //din.on(false);
  int b;
  while((b=din.read())!=-1){
   //做一些对文件的处理惩罚
   //if(b=='$') din.on(true); //当碰着文件中的标记$时才开始计较
  }
  byte[] re = md.digest();//得到动静摘要
  //下面把动静摘要转换为字符串
  String result = "";
  for(int i=0;i<re.length;i++){
   result += Integer.toHexString((0x000000ff&re[i])|0xffffff00).substring(6);
  }
  System.out.println(result);
 }
}

当A和B通信时,A将数据传给B时,同时也将数据的动静摘要传给B,B收到后可以用该动静摘要验证A传的动静是否正确。这时会发生问题,即若通报进程中别人修改了数据时,同时也修改了动静摘要。B就无法确认数据是否正确。动静验证码可以办理这一问题。

利用动静验证码的前提是 A和B两边有一个配合的密钥,这样A可以将数据计较出来的动静摘要加密后发给B,以防备动静摘要被改。由于利用了配合的密钥,所以称为“验证码”。

例、下面的措施即可操作配合的密钥来计较动静摘要的验证码

package com.mac;
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
public class MyMac {
 public static void main(String[] args) throws Exception{
  //这是一个动静摘要串
  String str="TestString";
  //配合的密钥编码,这个可以通过其它算法计较出来
  byte[] kb={11,105,-119,50,4,-105,16,38,-14,-111,21,-95,70,-15,76,-74,
    67,-88,59,-71,55,-125,104,42};
  //获取配合的密钥
  SecretKeySpec k = new SecretKeySpec(kb,"HMACSHA1");
  //获取Mac工具
  Mac m = Mac.getInstance("HmacMD5");
  m.init(k);
  m.update(str.getBytes("UTF-8"));
  byte[] re = m.doFinal();//生成动静码
  //下面把动静码转换为字符串
  String result = "";
  for(int i=0;i<re.length;i++){
   result += Integer.toHexString((0x000000ff&re[i])|0xffffff00).substring(6);
  }
  System.out.println(result);
 }
}

#p#副标题#e#

#p#分页标题#e#

利用以上两种技能可以担保数据没有颠末改变,但吸收者还无法确定命据是否确实是某小我私家发来的。尽量动静码可以确定命据是某个有同样密钥的人发来的,但这要求两边具有共享的密钥,若有一组用户共享,我们就无法确定命据的来历了。

数字签名可以办理这一问题。数字签名操作非对称加密技能,发送者利用私钥加密数据发生的动静摘要(签名),吸收者利用发送者的公钥解密动静摘要以验证签名是否是某小我私家的。由于私钥只有加密者才有,因此假如吸收者用某个公钥解密了某个动静摘要,就可以确定这段动静摘要一定是对应的私钥持有者发来的。

利用数字签名的前提是吸收数据者可以或许确信验证签名时(用发送者的私钥加密动静摘要)所用的公钥确实是某小我私家的 (因为有大概有人假告公钥)。数字证书可以办理这个问题。

数字证书含有两部门数据:一部门是对应主体(单元或小我私家)的信息,另一部门是这个主体所对应的公钥。即数字证墨客存了主体和它的公钥的一一对应干系。同样,数字证书也有大概被捏造,如何鉴定命字证书的内容的真实性呢?所以,有效的数字证书必需颠末权威 CA的签名,即权威CA验证数字证书的内容的真实性,然后再在数字证书上利用本身的私钥签名(相当于在证书加章确认)。

这样,当用户收到这样的数字证书后,会用相应的权威 CA的公钥验证该证书的签名(因为权威的CA的公钥在操纵系统中己经安装)。按照非对称加密的道理,假如该证书不是权威CA签名的,将不能通过验证,即该证书是不行靠的。

若通过验证,即可证明此证书含的信息(发信人的公钥和信息)是无误的。于是可以信任该证书,便可以通过该证书内含的公钥来确认数据确实是发送者发来的。

于是,两边通信时, A把数据的动静摘要用本身的私钥加密(即签名),然后把本身的数字证书和数据及签名后的动静摘要一起发送给B,B处查察A的数字证书,假如A的数字证书是颠末权威CA验证靠得住的,便信任A,便可利用A的数字证书中附带的A的公钥解密动静摘要(这一进程同时确认了发送数据的人又可以解密动静摘要),然后通过解密后的动静摘要验证数据是否正确无误没被修改。

操作这一道理,我们可以打破 java的applet小措施在欣赏器中的权限,由于默认的applet权限节制不答允它会见操纵系统级的一切。于是我们可以用我们数字证书来给applet签名,然后客户端收到该applet时,系统会自动查察给该applet签名的数字证书并提供应终端用户鉴定是否信认该数字证书,假如用户信认,则该applet便有了会见系统的权限。

二、 Java中的数字证书的生成及维护要领

Java中的keytool.exe可以用来建设数字证书,所有的数字证书是以一条一条(回收别名区别)的形式存入证书库的中,证书库中的一条证书包括该条证书的私钥,公钥和对应的数字证书的信息。证书库中的一条证书可以导出数字证书文件,数字证书文件只包罗主体信息和对应的公钥。

每一个证书库是一个文件构成,它有会见暗码,在首次建设时,它会自动生成证书库,并要求指定会见证书库的暗码。

在建设证书的的时候,需要填写证书的一些信息和证书对应的私钥暗码。这些信息包罗 CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx,它们的意思是:

CN(Common Name名字与姓氏)

OU(Organization Unit组织单元名称)

O(Organization组织名称)

L(Locality都市或区域名称)

ST(State州或省份名称)

C(Country国度名称)

可以回收交互式让东西提示输入以上信息,也可以回收参数

-dname "CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx"来自动建设。

1、示例

如下所示一句回收交互式建设一个证书,指定证书库为 abnerCALib,建设别名为abnerCA的一条证书,它指定用RSA算法生成,

且指定密钥长度为 1024,证书有效期为3650天:

C:\j2sdk1.4.1_01\mykeystore>keytool -genkey -alias abnerCA -keyalg RSA -keysize 1024 -keystore abnerCALib -validity 3650

如下图所示:

Java和平通信、数字证书及应用实践

上图中最后一步,我们输入的是 CN,代表中国的缩写,也可以直接输入“中国”两个字。

#p#副标题#e#

2、证书的操纵要领

● 证书的显示

如:

keytool –list –keystore abnerCALib

将显示 abnerCALib证书库的的所有证书列表:如下图示:

Java和平通信、数字证书及应用实践

又如: keytool -list -alias abnerCA -keystore abnerCALib

将显示 abnerCALib证书库中别名为abnerCA的证书的信息。如下图所示:

Java和平通信、数字证书及应用实践

又如: keytool -list -v -alias abnerCA -keystore abnerCALib

将显示证书的具体信息( -v参数)如下图所示:

Java和平通信、数字证书及应用实践

#p#副标题#e#

● 将证书导出到证书文件

如: keytool -export -alias abnerCA -file abnerCA.cer -keystore abnerCALib

将把证书库 abnerCALib中的别名为abnerCA的证书导出到abnerCA.cer证书文件中,

它包括证书主体的信息及证书的公钥,不包罗私钥,可以果真,如下图所示 :

Java和平通信、数字证书及应用实践

上面导出的证书文件是以二进制编码文件,无法用文本编辑器正确显示,因此倒霉用发布证书,可以加上 -rfc参数以一种可打印的编者编码输出。

如:

keytool -export -alias abnerCA -file abnerCA.cer -keystore abnerCALib -storepass 100200 –rfc

这个呼吁在呼吁行中指定了证书库的会见暗码,同时指定以可查察编码的方法输出。

3、通过证书文件查察证书的信息

通过呼吁 :keytool –printcert –file abnerCA.cer可以查察证书文件的信息。

也可以在 windows中双击发生的证书文件直接查察。

● 证书条目标删除

keytool的呼吁行参数-delete可以删除密钥库中的条目,如:

keytool -delete -alias abnerCA -keystore abnerCALib

 

这条呼吁将 abnerCALib库中的abnerCA这一条证书删除了。

● 证书条目口令的修改

如:

keytool –keypasswd –alias abnerCA –keystore abnerCALib

可以以交互的方法修改 abnerCALib证书库中的条目为abnerCA的证书。

Keytool –keypasswd –alias abnerCA –keypass 123456 –new 200100 –storepass 1002 00 –keystore abnerCALib

这一行呼吁以非交互式的方法修改库中别名为 abnerCA的证书的暗码为新暗码123456,行中的200100是指该条证书的原暗码, 1002 00是指证书库的暗码。

#p#副标题#e#

三、数字证书的签发(签名)

#p#分页标题#e#

我们在上面建设好了数字证书,但这些数字证书还没有颠末权威 CA的证实(即签名)。一般环境下,我们需要将这些证书发送给权威的CA,并申请其签名以确认数字证书让客户信任。

下面我们将仿照本身是一个权威的数字证书认证机构 CA,这个机构将回收本身的私钥来签发其它的证书。这个签发进程是这样的:我们本身是CA,我们本身有一个自签的数字证书存入数字证书库中。在数字证书库中的这个我们的CA数字证书,它含有私钥,公钥和我们这个CA的主体信息。下面这一个指令可以建设一个CA的自签的数字证书:

keytool –genkey –dname “CN=美森系统软件有限公司,OU=美森系统软件有限公司,O=美森系统软件有限公司,L=成都会,ST=四川省,C=中国” –alias MissionCA –keyalg RSA –keysize 1024 –keystore abnerCALib –keypass 200100 –storepass 100200 –validity 3650

上面,我们在 abnerCALib这个数字证书库中建设了一个体名为:missionCA、有效期为3650天、算法为RSA且密钥长度为1024的数字证书,这条证书的私钥暗码为:200100,证书库的会见暗码为:100200。这条别名为missionCA的证书代表我们本身的权威CA即:美森系统软件有限公司这个权威CA。今后我们将用这个证书来签名其它的数字证书。

此刻我要给本身申请一个数字证书,我可以这么做:先在数字证书库中建设一条证书:

keytool –genkey –dname “CN=柴政,OU=美森系统软件有限公司,O=美森系统软件有限公司,L=成都会,ST=四川省,C=中国” –alias abnerCA –keyalg RSA –keysize 1024 –keystore abnerCALib –keypass 200100 –storepass 100200 –validity 3650

这样建设了一个体名为 abnerCA的数字证书,我们可以将它导出为cer文件(见前)。

接着,我们可以用上一步生成的 CA的自签证书来签名我这个数字证书了。

CA签名数字证书的进程需用以下措施来举办,这个措施是自表明的:

#p#分页标题#e#

package com.security;
import java.io.*;
import java.security.*;
import java.security.cert.*;
import java.util.*;
import java.math.*;
import sun.security.x509.*;
/**
* <p>Description: 该措施按照签发者(CA)的证书信息(即CA的私钥)来对被签发者
* 的证书举办签名,进程等于利用CA的证书和被签证书来重构形成一个新的证书</p>
* @author abnerchai
* @version 1.0
*/
 public class SignCert {
  public static void main(String[] args) throws Exception{
   char[] storepass = "100200".toCharArray();
   //存放CA证书和被签证书的证书库的会见暗码
   char[] cakeypass = "200100".toCharArray();//CA数字证书条目标会见暗码
   String alias = "missionCA";
   //CA证书在证书库中的别名,这个CA的证书用来签名其它的证书
   String name = "abnerCALib";//存放CA证书和被签证书的证书库的名字
   String newLib = "SignedLib";
   //新证书库的名字,假如需要将签名后的证书放入新库,这是新库的名字
   char[] newLibPass = "100200".toCharArray();//配置新库的会见暗码
   String cerFileName = "abnerCA.cer";//被签证书的证书文件名
   String aliasName = "abnerCA";//被签证书在证书库中的alias别名
   char[] namePass = "200100".toCharArray();
   //被签证书的条目在证书库的私钥暗码
   int n =3; //被签证书的有效期,以年为单元,以当前时间开始计较
   int sn = 200406001;
   //序列号可本身界说,这里界说的意义为2004年6月签发,是今年度CA签发的第几多个以001计较,要求独一
   String afteraliasName = "abnerCA_Signed";
   //签名后新发生的被签过名的证书在库中的别名
   char[] afterNewPass = "200100".toCharArray();
   //签名后新发生的被签过名的证书在库的条目标私钥的暗码
   //装载证书库
   FileInputStream in = new FileInputStream(name);
   KeyStore ks = KeyStore.getInstance("JKS");//JKS为证书库的范例
   ks.load(in,storepass);
   //从证书库中读出签发者(CA)的证书
   java.security.cert.Certificate cl = ks.getCertificate(alias);
   //读出一个CA证书,这里的l是字母l不是数据字1
   PrivateKey privateKey = (PrivateKey)ks.getKey(alias,cakeypass);
   //按照别名和证书暗码读出CA证书的私钥
   in.close();
   //从证书库中读出的签发者(CA)的证书中提取签发者的信息
   byte[] encodl = cl.getEncoded();//提取证书的编码,这里是字母l不是数据字1
   X509CertImpl cimpl = new X509CertImpl(encodl);
   //这里是字母l不是数据字1,按照证书的编码建设X509CertImpl范例的工具
   //按照上面的工具得到X509CertInfo范例的工具,该工具封装了证书的全部内容。
   X509CertInfo cinfo_first =
    (X509CertInfo)cimpl.get(X509CertImpl.NAME+"."+X509CertImpl.INFO);
   //然后得到X500Name范例的签发者信息
   X500Name issuer = (X500Name)
   cinfo_first.get(X509CertInfo.SUBJECT+"."+CertificateIssuerName.DN_NAME);
   //获取待签发的证书,即获取被签发者的证书
   //可从密钥库中获取,也可从导出的证书文件中获取,这里给出两种方法   ////////////////////////////////////////////////////////////////////////
//方法一、回收从导出的cer文件中获取 start
///////////////////////////////////////////////////////////////////////////////
/*
  CertificateFactory cf = CertificateFactory.getInstance("X.509");
  //X.509是利用最多的一种数字证书尺度
  FileInputStream in2 = new FileInputStream(cerFileName);//被签证书文件
  java.security.cert.Certificate c2 = cf.generateCertificate(in2);
  //生成需要被签的证书
  in2.close();
  byte[] encod2 = c2.getEncoded();
  X509CertImpl cimp2 = new X509CertImpl(encod2);
  //得到被签证书的具体内容,然后按照这个证墨客成新证书
  X509CertInfo cinfo_second =
   (X509CertInfo)cimp2.get(X509CertImpl.NAME+"."+X509CertImpl.INFO);
*/
///////////////////////////////////////////////////////////////////////////////
//end 方法一
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//方法二、从证书库中读出被签的证书 start
///////////////////////////////////////////////////////////////////////////////
  java.security.cert.Certificate c3 = ks.getCertificate(aliasName);
  //从证书库中读出被签证书,然后生成新的证书
  byte[] encod3 = c3.getEncoded();
  X509CertImpl cimp3 = new X509CertImpl(encod3);
  X509CertInfo cinfo_second =
   (X509CertInfo)cimp3.get(X509CertImpl.NAME+"."+X509CertImpl.INFO); ///////////////////////////////////////////////////////////////////////////
//end方法二
/////////////////////////////////////////////////////////////////////////// //配置新证书的有效期,使之为当前向后n年有效,新证书的
  //截至日期不能高出CA证书的有效日期
  Date beginDate = new Date();
  Calendar cal = Calendar.getInstance();
  cal.setTime(beginDate);
  cal.add(cal.YEAR,n);
  Date endDate = cal.getTime();
  CertificateValidity cv = new CertificateValidity(beginDate,endDate);
  cinfo_second.set(X509CertInfo.VALIDITY,cv);
  //配置新证书的序列号
  CertificateSerialNumber csn = new CertificateSerialNumber(sn);
  cinfo_second.set(X509CertInfo.SERIAL_NUMBER,csn);
  //配置新证书的签发者
  cinfo_second.set(X509CertInfo.ISSUER+"."+CertificateIssuerName.DN_NAME,issuer);
  //新的签发者是CA的证书中读出来的
  //配置新证书的算法,指定CA签名该证书所利用的算法为md5WithRSA
  AlgorithmId algorithm = new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);
  cinfo_second.set(CertificateAlgorithmId.NAME+"."+
  CertificateAlgorithmId.ALGORITHM,algorithm);
  //建设新的签名后的证书
  X509CertImpl newcert = new X509CertImpl(cinfo_second);
  //签名,利用CA证书的私钥举办签名,签名利用的算法为MD5WithRSA
  newcert.sign(privateKey,"MD5WithRSA");//这样便获得了颠末CA签名后的证书
  //把新证书存入证书库
  //把新生成的证书存入一个新的证书库,也可以存入原证书库,
  //存入新证书库,则新证书库中不只包括原证书库中的所有条目,
  //并且新增加了一个这次发生的条目。留意,这时,新发生的签名后的证书只
  //包罗公钥和主体信息及签名信息,不包罗私钥信息。这里给出两种方法。
///////////////////////////////////////////////////////////////////////////
//方法一:存入新密钥库
///////////////////////////////////////////////////////////////////////////
/*
ks.setCertificateEntry(afteraliasName,newcert);
FileOutputStream out = new FileOutputStream(newLib);
//存入新库signedLib,并配置新库的库会见暗码
ks.store(out,newLibPass);
out.close();
*/
///////////////////////////////////////////////////////////////////////////
//end 方法一
///////////////////////////////////////////////////////////////////////////
//也可以回收别的一种方法,存入原证书库中
//存入原库中,即在原证书库中增加一条证书,这个证书是原证书颠末签名后的证书
//这个新证书含有私钥和私钥暗码
///////////////////////////////////////////////////////////////////////////
//方法二,存入原密钥库
///////////////////////////////////////////////////////////////////////////
//先在原库中读出被签证书的私钥
PrivateKey prk = (PrivateKey)ks.getKey(aliasName,namePass);
java.security.cert.Certificate[] cchain = {newcert};
//存入本来的库,第二个参数为原证书的私钥,第三个参数为新证书的私钥暗码,第三个参数为新证书
ks.setKeyEntry(afteraliasName,prk,afterNewPass,cchain); //用新密钥替代本来的没有签名的证书的暗码
FileOutputStream out2 = new FileOutputStream(name);
ks.store(out2,storepass);//存入本来的库中,第二个参数为该库的会见暗码
///////////////////////////////////////////////////////////////////////////
//end 方法二
///////////////////////////////////////////////////////////////////////////
}
}

#p#副标题#e#

#p#分页标题#e#

运行以上措施,即可运用 MissionCA证书来签发abnerCA证书,运行后在abnerCALib中增加一条别名为abnerCA_Signed的数字证书,我们将它导出为cer文件(导出要领见前)。

#p#分页标题#e#

至此,我们己经用 CA的证书以我们的数字证书签名了。在windows中,双击导出的abnerCA_Signend.cer文件,呈现如下图所示:

Java和平通信、数字证书及应用实践

上图中证书信息一栏显示“不能验证该证书”,原因是因为,我们的这个数字证书的签发者 missionCA证书没有安装到系统中。我们可以将证书库中别名为missionCA的自签数字证书导出为cer文件,然后安装到系统中。再次查双击看此证书,如下图所示:

Java和平通信、数字证书及应用实践

到此,我们己经得到了一个由我们本身的 CA签名揭晓的小我私家数字证书。而且将我们本身的CA证书安装到系统中成为系统信任的根证书。于是,今后只要是由我们的这个CA证书签名揭晓的数字证书城市受到系统的信任。

#p#副标题#e#

四、操作数字证书给 applet签名

此刻假设我们公司给 xx公司做一个项目,这个项目中需要用到applet,且这些applet需要特权以实现一些非凡的成果(如读出客户端用户系统中C:\winNT\system.ini文件中的内容并显示)。那么我们可以揭晓一个数字证书,并给这个数字证书签名,然后用签名后的这个数字证书来签名我们的applet,使客户信任。详细进程如下:

1、生成一个用于此项目签名 applet 的数字证书,别名定为: mission_water

生成一个用于此项目签名的数字证书如下:

keytool –genkey –dname “CN=美森软件-水公司项目,OU=美森系统软件有限公司,O=美森系统软件有限公司,L=成都会,ST=四川省,C=中国” –alias Mission_Water –keyalg RSA –keysize 1024 –keystore abnerCALib –keypass 200100 –storepass 100200 –validity 3650

2、用我们的 CA(missinCA) 来签发这个数字证书

然后,运行我们在前面第三节中给定的措施,留意:运行此措施前,请修改以下参数:

String cerFileName = "Mission_Water.cer";
String aliasName = "Mission_Water";
String afteraliasName = "Mission_Water_Signed";

然后运行,措施会在 abnerCALib证书库中发生一个体名为:Mission_Water_Signed的数字证书,这个证书是颠末我们的CA(MissionCA)签发的。

下面,我们用以下指令导出这个证书:

keytool -export -alias Mission_Water_Signed -file Mission_Water_Signed.cer -keystore abnerCALib -rfc

会生成一个 Mission_Water_Signed.cer 文件。

3、用签发后的数字证书来签名我们的 applet

我们此刻来做一个简朴的 applet,它的代码如下:

package com.applet;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
import java.io.*;
public class ShowFileApplet extends JApplet {
private boolean isStandalone = false;
private String content = "文件的内容是:"; //自界说的提示信息
private String fileName = "C:\\WINNT\\system.ini";//读出这个文件的内容
private TextArea ta = new TextArea(10,80);//自界说的输出框
public String getParameter(String key, String def) {
return isStandalone ? System.getProperty(key, def) :
(getParameter(key) != null ? getParameter(key) : def);
}
public ShowFileApplet() {
}
public void init() {
try {
jbInit();
myInit();//本身界说的要领
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
this.setSize(new Dimension(400,300));
}
/**
* 自界说的初始化要领,读入系统中的一个文件的内容并生存起来,然后,增加一个
* 可视化的输出框
*/
private void myInit(){
String s;
BufferedReader in;
try {
in = new BufferedReader(new FileReader(fileName));
while ( (s = in.readLine()) != null) {
content +=s + "\n";
}
}catch (IOException ex) {
ex.printStackTrace();
}
System.out.println(content);
ta.setText(content);
getContentPane().add(ta);
}
/*
*重载的要领,输出内容
**/
public void paint(Graphics g){
ta.setText(content);
}
public String getAppletInfo() {
return "Applet Information";
}
public String[][] getParameterInfo() {
return null;
}
//static initializer for setting look & feel
static {
try {
}
catch(Exception e) {
}
}
}

#p#副标题#e#

好了,这个 applet写好了,下面我们来把这个applet编译打包成jar文件。

#p#分页标题#e#

编译此 applet文件,会在当前目次(当前目次为classes目次)下生成一个com\applet的目次布局,在applet目次下有一个ShowFileApplet.class,进入当前目次,执行:

jar cvf myapplet.jar com/applet/*.*

于是在当前目次下发生一个 myapplet.jar文件。

然后再在当前目次(当前目次为 classes目次)下新建一个applet目次,专门存放applet的jar文件,把前面生成的数字证书库abnerCALib这个文件也copy到applet目次下面来,同时把适才生成的myapplet.jar文件也移到applet目次下面来。然后进入该目次执行:

jarsigner -keystore abnerCALib myapplet.jar Mission_Water_Signed
Enter Passphrase for keystore: 100200
Enter key password for Mission_Water_Signed: 200100

即用 Mission_Water_Signed这个我们的CA签发的数字证书给这个applet签名了。

4、运行我们的 applet

我们来写一个 html文件来运行这个签名后的applet,内容如下:

<!-- ShowFileApplet.html -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
<title>HTMLTestPage</title>
</head><body>
applet将会显示,假如你的欣赏器支持Java<br>
<applet
archive = "./applet/myapplet.jar"
code = "com.applet.ShowFileApplet.class"
name = "TestApplet"
width = "400"
height = "300"
hspace = "0"
vspace = "0"
align = "middle"

</applet>
</body>
</html>

这个 HTML文件可以运行applet,但假如欣赏器不支持Java,即没有安装JRE,它不会提示用户去下载安装。我们可以用Java自带的htmlconverter东西转换一下这个HTML文件,转换后的文件可以在支持JAVA2的欣赏器中(不管该欣赏器是否配置了利用java2运行applet,它城市在Java2情况中运行applet,假如欣赏器不支持Java2,则会自动下载所需的文件。

在 DOS方法下运行htmlconverter,弹出如下图所示画框,按图中所示选择适才的谁人HTML文件,如下图所示:

Java和平通信、数字证书及应用实践

点“转换”,将会在当前目次下生成一个 HTML文件,并把本来的HTML文件备份了。

#p#副标题#e#

生成后的 HTML文件内容如下所示:

<!-- ShowFileApplet.html -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
<title>HTMLTestPage</title>
</head>
<body>
applet将会显示,假如你的欣赏器支持Java<br>
<OBJECT
classid = "clsid:CAFEEFAC-0014-0001-0001-ABCDEFFEDCBA"
codebase = "http://java.sun.com/products/plugin/autodl/jinstall-1_4_1_01-windows-i586.cab#Version=1,4,1,1"
WIDTH = "400" HEIGHT = "300" NAME = "TestApplet" ALIGN = "middle" VSPACE = "0" HSPACE = "0" >
<PARAM NAME = CODE VALUE = "com.applet.ShowFileApplet.class" >
<PARAM NAME = ARCHIVE VALUE = "./applet/myapplet.jar" >
<PARAM NAME = NAME VALUE = "TestApplet" >
<PARAM NAME = "type" VALUE = "application/x-java-applet;jpi-version=1.4.1_01">
<PARAM NAME = "scriptable" VALUE = "false">
<COMMENT>
<EMBED
type = "application/x-java-applet;jpi-version=1.4.1_01"
CODE = "com.applet.ShowFileApplet.class"
ARCHIVE = "./applet/myapplet.jar"
NAME = "TestApplet"
WIDTH = "400"
HEIGHT = "300"
ALIGN = "middle"
VSPACE = "0"
HSPACE = "0"
scriptable = false
pluginspage = "http://java.sun.com/products/plugin/index.html#download">
<NOEMBED>
</NOEMBED>
</EMBED>
</COMMENT>
</OBJECT>
</body>
</html>

#p#副标题#e#

双击打开运行这个文件或把这个文件及 applet目次宣布到WEB Server中去,可以会见运行这个applet。运行时,弹出如下图所示对话框:

Java和平通信、数字证书及应用实践

假如此时你点“是”,则在这次会话进程中,此 applet具有会见当地文件系统的权限,但下次运行时还要提示此信息。假如你点“老是有效”则今后每次会见此类含有由Mission_Water_Signed数字证书签发的applet页面,都不会再弹出此选择框。因为:你选择了老是有效,这样,Java会在Java Plug-in中记录这个信任的数字证书,除非你把Java Plug-in中记录的这个信任证书删除。在win2k中,可以在“节制面版”->Java Plug-in中看到。如下图所示:

Java和平通信、数字证书及应用实践

点选择“老是有效”后,该措施运行的功效如下图所示:

Java和平通信、数字证书及应用实践

 

    关键字:

天才代写-代写联系方式