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为安全应用提供了丰富的API,J2SDK1.4 的JSSE (JavaTM Secure Socket Extension) 包括ificate包,并且提供对证书的操作方法。而对证书的读操作,只用 CertificateFactory和X509Certificate就可以了。下面是读取证书内容的部分代码:
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); } } |
定义证书信息的读取函数如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论