waysun一路阳光

不轻易服输,不轻言放弃.--心是梦的舞台,心有多大,舞台有多大。踏踏实实做事,认认真真做人。

  BlogJava :: 首页 :: 新随笔 :: 联系 ::  :: 管理 ::
  167 随笔 :: 1 文章 :: 64 评论 :: 0 Trackbacks

cfca采用加密组件Bouncy Castle。 
cfca证书工具包包含如下文件(服务器端,以jdk1.4为例): 
1、bcprov-jdk14-125.jar:security provider lib 
2、bcmail-jdk14-125.jar:貌似邮件用的 
3、cfcaDigitalKitTest.jar:cfca自己开发的工具包,就一个类 
4、entbase.jar、entuser.jar:cfcaDigitalKitTest.jar要应用的2个jar包 
5、cacerts:cfca的根证书链文件,是一个keystore文件,可以用keytool -list查看 
6、castle.ini:cfca工具包的配置文件,内容如下 

[CRL校验部分]==========貌似可以不配 
/*ldap服务器端口号*/ 
ldapServerPort=389 
/*ldap服务器地址*/ 
ldapServerName=210.74.41.60 
/*CFCA CRL cache存放目录*/ 
cachedCRLDirPath=G:\\testCerts 

[用户证书部分] 
/*用户证书路径*/==========这里可以配置keystore(扩展名必须是keysotre,写死在cfca工具包中)或者pfx文件 
userCertFilePath=D:\\java\\stf\\cfca\\cfcakeystore_server.keystore 
/*访问用户证书口令*/ 
userCertPassword=Passw0rds 
/*用户证书别名,可选*/===========如果前面配的是keystore必须指定alias 
userCertAlias=cfca_server 

[可信CA库口令]=============根证书链文件cacerts的默认文件 
trustedCAStorePass=changeit 





两种方式使用cfca的证书工具包: 
参考:http://danielzzu.blog.163.com/blog/static/11851530420101194345324/ 

一、配置方式(以jdk1.4为例) 
1. 添加安全库 
前置条件:获得/usr/java14目录的写权限 
动作: 
要添加两个安全jar文件:bcmail-jdk14-125.jar和bcprov-jdk14-125.jar 
把这两个jar放到/usr/java14/jre/lib/ext目录下 
修改这两个jar包的权限: 
chmod 755 bcmail-jdk14-125.jar 
chmod 755 bcprov-jdk14-125.jar 

2. 配置安全文件java.security 
该文件在/usr/java14/jre/lib/security/ 目录下 
在其中添加一行: 
security.provider.N=org.bouncycastle.jce.provider.BouncyCastleProvider 
其中N用具体的数字替换,如果文件中原有的security provider编号最大是4,则这里的N就用5,注意千万不要与原有的security provider编号重复! 

3. 更新cacerts文件 
该文件在/usr/java14/jre/lib/security/ 目录下 
首先对该目录下原cacerts进行备份:mv cacerts cacerts.old 
然后把提供的cacerts复制到这个目录下 
修改文件权限:chmod 755 cacerts 

4. 将cfcaDigitalKitTest.jar、entbase.jar、entuser.jar、castle.ini放到classpath中,就可以调用cfca工具包: 
Java代码  收藏代码
  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.security.KeyStore;  
  4. import java.security.PrivateKey;  
  5. import java.security.Security;  
  6. import java.security.cert.X509Certificate;  
  7. import java.util.Enumeration;  
  8. import com.cfca.toolkit.*;  
  9.   
  10. public class TestSign {  
  11.   
  12.     /** 
  13.      * @param args 
  14.      */  
  15.     public static void main(String[] args) {  
  16.         // TODO Auto-generated method stub  
  17.         try{  
  18.             TestSign ts=new TestSign();;  
  19.             String msg="test string !!!!!!";  
  20.             System.out.println("签名前数据:"+msg);  
  21.             String signedMsg=ts.signData(msg);  
  22.             System.out.println("签名后数据:"+signedMsg);           
  23.             String checkedMsg=ts.checkSign(signedMsg);  
  24.             System.out.println("验证签名后数据:"+checkedMsg);  
  25.         }catch(Exception e){  
  26.             e.printStackTrace();  
  27.         }  
  28.   
  29.     }  
  30.           
  31.     public String signData(String msg) throws Exception{  
  32.         Castle.iniFilePath = "D:\\java\\stf\\castle_client.ini";  
  33.         Castle castle=new Castle();  
  34.         castle.initCertAppContext();  
  35.         return castle.signData(msg);  
  36.     }  
  37.       
  38.     public String checkSign(String msg) throws Exception{  
  39.         Castle.iniFilePath = "D:\\java\\stf\\castle.ini";  
  40.         Castle castle=new Castle();  
  41. //      castle.initCertAppContext();  
  42.         System.out.println("签名者DN:"+castle.getDN(castle.getCertificate(msg)));  
  43.         return castle.verifySignedData(msg);  
  44.     }  
  45.       
  46. }  



二、编码方式 
配置方式稍显麻烦,编码方式无非在程序中指定provider 

悲剧:cfca证书工具包中指定trustkeystore只能是上述配置的位于jdk目录的cacerts,不能放在其他地方 


Java代码  收藏代码
  1.     //指定truststore(但经过测试,仅用客户端证书签名,用服务器端证书验证签名不需要配置truststore)  
  2.  //验证签名不需要配置trustCA,但调用cfca工具包的验证证书命令:verifyCertificate,就需要配置信任CA  
  3. //      System.setProperty("javax.net.ssl.trustStore","D:\\java\\stf\\cacerts");     
  4. //      System.setProperty("javax.net.ssl.trustStorePassword","changeit");    
  5.     //指定provider  
  6.         Security.addProvider(new BouncyCastleProvider());  


Java代码  收藏代码
  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.security.KeyStore;  
  4. import java.security.PrivateKey;  
  5. import java.security.Security;  
  6. import java.security.cert.X509Certificate;  
  7. import java.util.Enumeration;  
  8. import com.cfca.toolkit.*;  
  9.   
  10. import org.bouncycastle.jce.provider.BouncyCastleProvider;  
  11.   
  12. public class TestSign {  
  13.   
  14.     /** 
  15.      * @param args 
  16.      */  
  17.     public static void main(String[] args) {  
  18.         // TODO Auto-generated method stub  
  19.         try{  
  20.             TestSign ts=new TestSign();  
  21.             String msg="test string!!!!!!!!!";  
  22.             System.out.println("签名前数据:"+msg);  
  23.             String signedMsg=ts.signData(msg);  
  24.             System.out.println("签名后数据:"+signedMsg);           
  25.             String checkedMsg=ts.checkSign(signedMsg);  
  26.             System.out.println("验证签名后数据:"+checkedMsg);  
  27.         }catch(Exception e){  
  28.             e.printStackTrace();  
  29.         }  
  30.   
  31.     }  
  32.       
  33.     public TestSign(){  
  34.     //指定truststore(但经过测试,仅用客户端证书签名,用服务器端证书验证签名不需要配置truststore)  
  35.  //验证签名不需要配置trustCA,但调用cfca工具包的验证证书命令:verifyCertificate,就需要配置信任CA  
  36. //      System.setProperty("javax.net.ssl.trustStore","D:\\java\\stf\\cacerts");     
  37. //      System.setProperty("javax.net.ssl.trustStorePassword","changeit");    
  38.     //指定provider  
  39.         Security.addProvider(new BouncyCastleProvider());  
  40.           
  41.     }  
  42.       
  43.     public String signData(String msg) throws Exception{  
  44.         Castle.iniFilePath = "D:\\java\\stf\\castle.ini";  
  45.         Castle castle=new Castle();  
  46.         castle.initCertAppContext();  
  47.         return castle.signData(msg);  
  48.     }  
  49.       
  50.     public String checkSign(String msg) throws Exception{  
  51.         Castle.iniFilePath = "D:\\java\\stf\\castle_client.ini";  
  52.         Castle castle=new Castle();  
  53. //      castle.initCertAppContext();  
  54.         System.out.println("签名者DN:"+castle.getDN(castle.getCertificate(msg)));  
  55.         return castle.verifySignedData(msg);  
  56.     }  
  57.   
  58. }  


posted on 2011-11-08 18:31 weesun一米阳光 阅读(3699) 评论(1)  编辑  收藏

评论

# re: cfca证书工具包使用指南【转】 2016-05-06 02:15
阿斯顿撒旦  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: