JAVA 证书认证
证书(Certificate,也称public-key certificate)是用某种签名算法对某些内容(比如公钥)进行数字签名后得到的、可以用来当成信任关系中介的数字凭证。证书发行机构通过发行证书告知证书使用者或实体其公钥(public-key)以及其它一些辅助信息。证书在电子商务安全交易中有着广泛的应用,证书发行机构也称 CA(Certificate Authority)
生成自签证书
第一步,用-genkey命令选项,产生公私密钥对。在控制台界面输入:keytool -genkey -alias testkeypair -keyalg RSA -keysize 1024 -sigalg MD5withRSA。这里的-alias表示使用这对公私密钥产生新的keystore入口的别名(keystore是用来存放管理密钥对和证书链的,缺省位置是在使用者主目录下,以.keystore为名的隐藏文件,当然也可指定某个路径存放.keystore文件)-keyalg是产生公私钥对所用的算法,这里是RSApane-keysize定义密钥的长度;-sigalg是签名算法,选择MD5withRSA,即用RSA签名,然后用MD5哈希算法摘要。接下来,系统会提示进行一些输入:
输入keystore密码:  abc123
您的名字与姓氏是什么?
  [Unknown]  Li
您的组织单位名称是什么?
  [Unknown]  InfosecLab
您的组织名称是什么?
  [Unknown]  InfosecLab Group
您所在的城市或区域名称是什么?
  [Unknown]  Beijing
您所在的州或省份名称是什么?
  [Unknown]  Beijing
该单位的两字母国家代码是什么
  [Unknown]  CN
CN=Li, OU=InfosecLab, O=InfosecLab Group, L=Beijing, ST=Beijing, C=CN 正确吗?
[]  y
输入<testkeypair>的主密码 (如果和 keystore 密码相同,按回车):


第二步,产生自签证书,输入以下命令:
keytool -selfcert -alias testkeypair -dname "CN=Li, OU=InfosecLab, O=InfosecLab
Group, L=Beijing, ST=Beijing, C=CN"
输入keystore密码:  abc123


第三步,导出自签证书,由上面两步产生的证书,已经存放在以“testkeypair”为别名的keystore入口了,如果使用其文件,必须导出证书。输入:
keytool -export -rfc -alias testkeypair - 
输入keystore密码:  abc123
保存在文件中的认证 &>


这样,就得到了一个自签的证书。注意,选项rfc是把证书输出为RFC1421定义的、用Base64最终编码的格式。
 
读取证书


Java为安全应用提供了丰富的APIJ2SDK1.4 JSSE (JavaTM Secure Socket Extension) 包括ificate包,并且提供对证书的操作方法。而对证书的读操作,只用 CertificateFactoryX509Certificate就可以了。下面是读取证书内容的部分代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.table.*;
import CertificateFactory;
import X509Certificate;
import java.io.*;
public class CARead extends JPanel {
private String CA_Name;
private String CA_ItemData[][] = new String[9][2];
private String[] columnNames = {"证书字段标记","内容" };
public CARead(String CertName) {
  CA_Name=CertName;
 
  JTabbedPane tabbedPane = new JTabbedPane();
  JPanel panelNormal = new JPanel();
  tabbedPane.addTab("普通信息", panelNormal);   
  JPanel panelAll=new JPanel();
  panelAll.setLayout(new BorderLayout());
  tabbedPane.addTab("所有信息",panelAll);
  JPanel panelBase64=new JPanel();
  panelBase64.setLayout(new BorderLayout());
  tabbedPane.addTab("Base64编码信息",panelBase64);
 
  Read_Normal(panelNormal);
 
  Read_Bin(panelAll);
 
  Read_Raw(panelBase64);
  tabbedPane.setSelectedIndex(0);
  setLayout(new GridLayout(1, 1));
  add(tabbedPane);
}
     
}


定义证书信息的读取函数如下: