手机站
网通分站
电信主站
密 码:
用户名:
热门关键字:  虚拟主机  cn域名  asd  ddd  域名注册
当前位置 : 主页>程序设计>Java技术>列表

Windows下Java如何使用数字证书

来源:互联网 作者:west263.com 时间:2008-02-23 点击:
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

为了用Java来使用数字证书,在网上google了一番,最后找到一个程序包jp0207bb.zip,下载的连接已经忘了。
里面有mscrypto.jar,mscryptofunctions.dll文件以及原代码,我跟着readme文件运行它自带的测试程序,结果总是出错,说我的证书的CDP域有错,我用的是cnca.net的试用型证书,可能有什么地方不兼容吧。实在没办法自己写了个测试的程序,不去验证证书的CDP域,照用就是,结果很正常。测试程序主要部分如下:

列出所有证书:
MSCryptoFunctions MSF = new MSCryptoFunctions();
String[] aliases = MSF.MSgetAliases("My");
for(int i=0;i<aliases.length;i )
{
//String alias = "{6014510D-21EF-4F49-8D93-0F19B821C0A0}";
String alias =aliases[i];
// get the cert for this alias
byte[] certblob = MSF.MSgetCert("My", alias);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
ByteArrayInputStream input = new ByteArrayInputStream(certblob);
X509Certificate cert = (X509Certificate) cf.generateCertificate(input);
input.close();
System.out.println(cert.getSubjectDN().getName());
}
CertificateFactory和X509Certificate所在的包是java.security.cert

加密测试:
首先安装provider,代码如下:
import com.boyter.mscrypto.MSKeyMgrProvider;
import com.boyter.mscrypto.MSTrustMgrProvider;
import com.boyter.mscrypto.MSRSASignProvider;
import com.boyter.mscrypto.MSRSACiphERProvider;

MSTrustMgrProvider.install();
MSKeyMgrProvider.install();
MSRSACipherProvider.install();
MSRSASignProvider.install();
取得加密用的证书,代码同列出证书的代码一样,到最后得到一个X509Certificate对象cert
初始化为ENCRYPT_MODE:
Cipher rc = Cipher.getInstance("RSA/ECB/PKCS1Padding","MSRSACipher");
rc.init( Cipher.ENCRYPT_MODE, cert.getPublicKey());
把要加密的文件(c:盘a.txt)读入到inputData数组:
byte[] inputData=new byte[(new Long((new File("c:\\a.txt")).length())).intValue()];
FileInputStream fis=new java.io.FileInputStream("c:\\a.txt");
fis.read(inputData);
对inputData加密,加密结果写入outputData:
byte[] outputData=null;
outputData = rc.doFinal(inputData);
把加密后的字节流写入另一个文件(c:盘a_enc.txt):
FileOutputStream fos=new FileOutputStream("c:\\a_enc.txt");
fos.write(outputData);
fos.close();
运行后可以打开c:\a_enc.txt,看到内容变成了乱码,这些就是加密的结果。

解密测试:
首先安装provider,然后取得证书,过程同加密测试。
初始化为DECRYPT_MODE:
Cipher rc = Cipher.getInstance("RSA/ECB/PKCS1Padding","MSRSACipher");
rc.init( Cipher.DECRYPT_MODE, cert.getPublicKey());
然后的做法根加密一样,把加密过的文件读入到inputData,然后运行rs.doFinal(inputData)得到解密后的字节流,再保存为另一个文件c:\\a_dec.txt;
运行后打开c:\a_dec.txt,内容应该和a.txt一样。


签名测试:
import java.security.Signature;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.X509KeyManager;
import java.security.PrivateKey;
安装provider,过程同加密测试。
获得私钥,注意获得私钥的方法和获得公钥方法不同,X509Certificate只有getPublicKey()方法,而没有getPrivateKey()方法,
要得到私钥必须通过X509KeyManager.getPrivateKey(alias)得到:
String[] aliases = MSF.MSgetAliases("My");
String alias =aliases[0];
//init
KeyManagerFactory kmf = KeyManagerFactory.getInstance("MSKMF");
kmf.init(null, null);
X509KeyManager xkm = (X509KeyManager)kmf.getKeyManagers()[0];
PrivateKey privkey = xkm.getPrivateKey(alias);
初始化:
Signature rsa = Signature.getInstance("MD5withRSA");
rsa.initSign(privkey);
把要签名的文件读到inputData,然后按如下过程签名:
rsa.update(inputData);
outputData = rsa.sign();
把outputData保存为文件c:\a_sign.txt,这个文件的内容就是签名。

验证签名测试:
首先安装provider,然后取得证书X509Certificate对象cert,过程同加密测试。
初始化:
Signature rsa = Signature.getInstance("MD5withRSA");
rsa.initVerify(cert.getPublicKey());
把要验证签名的文件读到byte[]对象inputData,把签名读到另一个byte[]对象sign,然后按如下过程验证签名:
rsa.update(inputData);
rsa.verify(sign);
rsa.verify(sign)返回一个boolean对象,true表示验证通过,false表示验证不通过。
随便修改一下原文或者签名,再运行这段程序应该会返回false。

完整的源代码如下:
import com.boyter.mscrypto.MSCryptoFunctions;
import java.io.ByteArrayInputStream;
import java.security.cert.X509Certificate;
import java.security.cert.CertificateFactory;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.File;
import javax.crypto.Cipher;
import java.security.Signature;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.X509KeyManager;
import java.security.PrivateKey;
import com.boyter.mscrypto.MSKeyMgrProvider;
import com.boyter.mscrypto.MSTrustMgrProvider;
import com.boyter.mscrypto.MSRSASignProvider;

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

共3页: 上一页 1 [2] [3] 下一页
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名
注册