cfca采用加密組件Bouncy Castle。
cfca證書工具包包含如下文件(服務(wù)器端,以jdk1.4為例):
1、bcprov-jdk14-125.jar:security provider lib
2、bcmail-jdk14-125.jar:貌似郵件用的
3、cfcaDigitalKitTest.jar:cfca自己開發(fā)的工具包,就一個(gè)類
4、entbase.jar、entuser.jar:cfcaDigitalKitTest.jar要應(yīng)用的2個(gè)jar包
5、cacerts:cfca的根證書鏈文件,是一個(gè)keystore文件,可以用keytool -list查看
6、castle.ini:cfca工具包的配置文件,內(nèi)容如下
[CRL校驗(yàn)部分]==========貌似可以不配
/*ldap服務(wù)器端口號(hào)*/
ldapServerPort=389
/*ldap服務(wù)器地址*/
ldapServerName=210.74.41.60
/*CFCA CRL cache存放目錄*/
cachedCRLDirPath=G:\\testCerts
[用戶證書部分]
/*用戶證書路徑*/==========這里可以配置keystore(擴(kuò)展名必須是keysotre,寫死在cfca工具包中)或者pfx文件
userCertFilePath=D:\\java\\stf\\cfca\\cfcakeystore_server.keystore
/*訪問用戶證書口令*/
userCertPassword=Passw0rds
/*用戶證書別名,可選*/===========如果前面配的是keystore必須指定alias
userCertAlias=cfca_server
[可信CA庫口令]=============根證書鏈文件cacerts的默認(rèn)文件
trustedCAStorePass=changeit
兩種方式使用cfca的證書工具包:
參考:http://danielzzu.blog.163.com/blog/static/11851530420101194345324/
一、配置方式(以jdk1.4為例)
1. 添加安全庫
前置條件:獲得/usr/java14目錄的寫權(quán)限
動(dòng)作:
要添加兩個(gè)安全jar文件:bcmail-jdk14-125.jar和bcprov-jdk14-125.jar
把這兩個(gè)jar放到/usr/java14/jre/lib/ext目錄下
修改這兩個(gè)jar包的權(quán)限:
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用具體的數(shù)字替換,如果文件中原有的security provider編號(hào)最大是4,則這里的N就用5,注意千萬不要與原有的security provider編號(hào)重復(fù)!
3. 更新cacerts文件
該文件在/usr/java14/jre/lib/security/ 目錄下
首先對該目錄下原cacerts進(jìn)行備份:mv cacerts cacerts.old
然后把提供的cacerts復(fù)制到這個(gè)目錄下
修改文件權(quán)限:chmod 755 cacerts
4. 將cfcaDigitalKitTest.jar、entbase.jar、entuser.jar、castle.ini放到classpath中,就可以調(diào)用cfca工具包:
- import java.io.File;
- import java.io.FileInputStream;
- import java.security.KeyStore;
- import java.security.PrivateKey;
- import java.security.Security;
- import java.security.cert.X509Certificate;
- import java.util.Enumeration;
- import com.cfca.toolkit.*;
- public class TestSign {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- try{
- TestSign ts=new TestSign();;
- String msg="test string !!!!!!";
- System.out.println("簽名前數(shù)據(jù):"+msg);
- String signedMsg=ts.signData(msg);
- System.out.println("簽名后數(shù)據(jù):"+signedMsg);
- String checkedMsg=ts.checkSign(signedMsg);
- System.out.println("驗(yàn)證簽名后數(shù)據(jù):"+checkedMsg);
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- public String signData(String msg) throws Exception{
- Castle.iniFilePath = "D:\\java\\stf\\castle_client.ini";
- Castle castle=new Castle();
- castle.initCertAppContext();
- return castle.signData(msg);
- }
- public String checkSign(String msg) throws Exception{
- Castle.iniFilePath = "D:\\java\\stf\\castle.ini";
- Castle castle=new Castle();
- // castle.initCertAppContext();
- System.out.println("簽名者DN:"+castle.getDN(castle.getCertificate(msg)));
- return castle.verifySignedData(msg);
- }
- }
二、編碼方式
配置方式稍顯麻煩,編碼方式無非在程序中指定provider
悲劇:cfca證書工具包中指定trustkeystore只能是上述配置的位于jdk目錄的cacerts,不能放在其他地方
- //指定truststore(但經(jīng)過測試,僅用客戶端證書簽名,用服務(wù)器端證書驗(yàn)證簽名不需要配置truststore)
- //驗(yàn)證簽名不需要配置trustCA,但調(diào)用cfca工具包的驗(yàn)證證書命令:verifyCertificate,就需要配置信任CA
- // System.setProperty("javax.net.ssl.trustStore","D:\\java\\stf\\cacerts");
- // System.setProperty("javax.net.ssl.trustStorePassword","changeit");
- //指定provider
- Security.addProvider(new BouncyCastleProvider());
- import java.io.File;
- import java.io.FileInputStream;
- import java.security.KeyStore;
- import java.security.PrivateKey;
- import java.security.Security;
- import java.security.cert.X509Certificate;
- import java.util.Enumeration;
- import com.cfca.toolkit.*;
- import org.bouncycastle.jce.provider.BouncyCastleProvider;
- public class TestSign {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- try{
- TestSign ts=new TestSign();
- String msg="test string!!!!!!!!!";
- System.out.println("簽名前數(shù)據(jù):"+msg);
- String signedMsg=ts.signData(msg);
- System.out.println("簽名后數(shù)據(jù):"+signedMsg);
- String checkedMsg=ts.checkSign(signedMsg);
- System.out.println("驗(yàn)證簽名后數(shù)據(jù):"+checkedMsg);
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- public TestSign(){
- //指定truststore(但經(jīng)過測試,僅用客戶端證書簽名,用服務(wù)器端證書驗(yàn)證簽名不需要配置truststore)
- //驗(yàn)證簽名不需要配置trustCA,但調(diào)用cfca工具包的驗(yàn)證證書命令:verifyCertificate,就需要配置信任CA
- // System.setProperty("javax.net.ssl.trustStore","D:\\java\\stf\\cacerts");
- // System.setProperty("javax.net.ssl.trustStorePassword","changeit");
- //指定provider
- Security.addProvider(new BouncyCastleProvider());
- }
- public String signData(String msg) throws Exception{
- Castle.iniFilePath = "D:\\java\\stf\\castle.ini";
- Castle castle=new Castle();
- castle.initCertAppContext();
- return castle.signData(msg);
- }
- public String checkSign(String msg) throws Exception{
- Castle.iniFilePath = "D:\\java\\stf\\castle_client.ini";
- Castle castle=new Castle();
- // castle.initCertAppContext();
- System.out.println("簽名者DN:"+castle.getDN(castle.getCertificate(msg)));
- return castle.verifySignedData(msg);
- }
- }