當前位置:首頁 » 編程語言 » jksjava

jksjava

發布時間: 2024-06-13 17:40:43

❶ 用java編寫一個程序,生成公鑰和私鑰對

一:需要包含的包
import java.security.*;
import java.io.*;
import java.util.*;
import java.security.*;
import java.security.cert.*;
import sun.security.x509.*
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

二:從文件中讀取證書
用keytool將.keystore中的證書寫入文件中,然後從該文件中讀取證書信息
CertificateFactory cf=CertificateFactory.getInstance("X.509");
FileInputStream in=new FileInputStream("out.csr");
Certificate c=cf.generateCertificate(in);

String s=c.toString();
三:從密鑰庫中直接讀取證書
String pass="123456";
FileInputStream in=new FileInputStream(".keystore");
KeyStore ks=KeyStore.getInstance("JKS");
ks.load(in,pass.toCharArray());
java.security.cert.Certificate c=ks.getCertificate(alias);//alias為條目的別名

四:JAVA程序中顯示證書指定信息
System.out.println("輸出證書信息:\n"+c.toString());
System.out.println("版本號:"+t.getVersion());
System.out.println("序列號:"+t.getSerialNumber().toString(16));
System.out.println("主體名:"+t.getSubjectDN());
System.out.println("簽發者:"+t.getIssuerDN());
System.out.println("有效期:"+t.getNotBefore());
System.out.println("簽名演算法:"+t.getSigAlgName());
byte [] sig=t.getSignature();//簽名值
PublicKey pk=t.getPublicKey();
byte [] pkenc=pk.getEncoded();
System.out.println("公鑰");
for(int i=0;i<pkenc.length;i++)System.out.print(pkenc[i]+",");

五:JAVA程序列出密鑰庫所有條目
String pass="123456";
FileInputStream in=new FileInputStream(".keystore");
KeyStore ks=KeyStore.getInstance("JKS");
ks.load(in,pass.toCharArray());
Enumeration e=ks.aliases();
while(e.hasMoreElements())
java.security.cert.Certificate c=ks.getCertificate((String)e.nextElement());

六:JAVA程序修改密鑰庫口令
String oldpass="123456";
String newpass="654321";
FileInputStream in=new FileInputStream(".keystore");
KeyStore ks=KeyStore.getInstance("JKS");
ks.load(in,oldpass.toCharArray());
in.close();
FileOutputStream output=new FileOutputStream(".keystore");
ks.store(output,newpass.toCharArray());
output.close();

七:JAVA程序修改密鑰庫條目的口令及添加條目
FileInputStream in=new FileInputStream(".keystore");
KeyStore ks=KeyStore.getInstance("JKS");
ks.load(in,storepass.toCharArray());
Certificate [] cchain=ks.getCertificate(alias);獲取別名對應條目的證書鏈
PrivateKey pk=(PrivateKey)ks.getKey(alias,oldkeypass.toCharArray());獲取別名對應條目的私鑰
ks.setKeyEntry(alias,pk,newkeypass.toCharArray(),cchain);向密鑰庫中添加條目
第一個參數指定所添加條目的別名,假如使用已存在別名將覆蓋已存在條目,使用新別名將增加一個新條目,第二個參數為條目的私鑰,第三個為設置的新口令,第四個為該私鑰的公鑰的證書鏈
FileOutputStream output=new FileOutputStream("another");
ks.store(output,storepass.toCharArray())將keystore對象內容寫入新文件

八:JAVA程序檢驗別名和刪除條目
FileInputStream in=new FileInputStream(".keystore");
KeyStore ks=KeyStore.getInstance("JKS");
ks.load(in,storepass.toCharArray());
ks.containsAlias("sage");檢驗條目是否在密鑰庫中,存在返回true
ks.deleteEntry("sage");刪除別名對應的條目
FileOutputStream output=new FileOutputStream(".keystore");
ks.store(output,storepass.toCharArray())將keystore對象內容寫入文件,條目刪除成功

九:JAVA程序簽發數字證書
(1)從密鑰庫中讀取CA的證書
FileInputStream in=new FileInputStream(".keystore");
KeyStore ks=KeyStore.getInstance("JKS");
ks.load(in,storepass.toCharArray());
java.security.cert.Certificate c1=ks.getCertificate("caroot");
(2)從密鑰庫中讀取CA的私鑰
PrivateKey caprk=(PrivateKey)ks.getKey(alias,cakeypass.toCharArray());
(3)從CA的證書中提取簽發者的信息
byte[] encod1=c1.getEncoded(); 提取CA證書的編碼
X509CertImpl cimp1=new X509CertImpl(encod1); 用該編碼創建X509CertImpl類型對象
X509CertInfo cinfo1=(X509CertInfo)cimp1.get(X509CertImpl.NAME+"."+X509CertImpl.INFO); 獲取X509CertInfo對象
X500Name issuer=(X500Name)cinfo1.get(X509CertInfo.SUBJECT+"."+CertificateIssuerName.DN_NAME); 獲取X509Name類型的簽發者信息
(4)獲取待簽發的證書
CertificateFactory cf=CertificateFactory.getInstance("X.509");
FileInputStream in2=new FileInputStream("user.csr");
java.security.cert.Certificate c2=cf.generateCertificate(in);
(5)從待簽發的證書中提取證書信息
byte [] encod2=c2.getEncoded();
X509CertImpl cimp2=new X509CertImpl(encod2); 用該編碼創建X509CertImpl類型對象
X509CertInfo cinfo2=(X509CertInfo)cimp2.get(X509CertImpl.NAME+"."+X509CertImpl.INFO); 獲取X509CertInfo對象
(6)設置新證書有效期
Date begindate=new Date(); 獲取當前時間
Date enddate=new Date(begindate.getTime()+3000*24*60*60*1000L); 有效期為3000天
CertificateValidity cv=new CertificateValidity(begindate,enddate); 創建對象
cinfo2.set(X509CertInfo.VALIDITY,cv); 設置有效期
(7)設置新證書序列號
int sn=(int)(begindate.getTime()/1000); 以當前時間為序列號
CertificateSerialNumber csn=new CertificateSerialNumber(sn);
cinfo2.set(X509CertInfo.SERIAL_NUMBER,csn);
(8)設置新證書簽發者
cinfo2.set(X509CertInfo.ISSUER+"."+CertificateIssuerName.DN_NAME,issuer);應用第三步的結果
(9)設置新證書簽名演算法信息
AlgorithmId algorithm=new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);
cinfo2.set(CertificateAlgorithmId.NAME+"."+CertificateAlgorithmId.ALGORITHM,algorithm);
(10)創建證書並使用CA的私鑰對其簽名
X509CertImpl newcert=new X509CertImpl(cinfo2);
newcert.sign(caprk,"MD5WithRSA"); 使用CA私鑰對其簽名
(11)將新證書寫入密鑰庫
ks.setCertificateEntry("lf_signed",newcert);
FileOutputStream out=new FileOutputStream("newstore");
ks.store(out,"newpass".toCharArray()); 這里是寫入了新的密鑰庫,也可以使用第七條來增加條目

十:數字證書的檢驗
(1)驗證證書的有效期
(a)獲取X509Certificate類型對象
CertificateFactory cf=CertificateFactory.getInstance("X.509");
FileInputStream in1=new FileInputStream("aa.crt");
java.security.cert.Certificate c1=cf.generateCertificate(in1);
X509Certificate t=(X509Certificate)c1;
in2.close();
(b)獲取日期
Date TimeNow=new Date();
(c)檢驗有效性
try{
t.checkValidity(TimeNow);
System.out.println("OK");
}catch(CertificateExpiredException e){ //過期
System.out.println("Expired");
System.out.println(e.getMessage());
}catch(( e){ //尚未生效
System.out.println("Too early");
System.out.println(e.getMessage());}
(2)驗證證書簽名的有效性
(a)獲取CA證書
CertificateFactory cf=CertificateFactory.getInstance("X.509");
FileInputStream in2=new FileInputStream("caroot.crt");
java.security.cert.Certificate cac=cf.generateCertificate(in2);
in2.close();
(c)獲取CA的公鑰
PublicKey pbk=cac.getPublicKey();
(b)獲取待檢驗的證書(上步已經獲取了,就是C1)
(c)檢驗證書
boolean pass=false;
try{
c1.verify(pbk);
pass=true;
}catch(Exception e){
pass=false;
System.out.println(e);
}

❷ 證書中的jks、pfx和cer後綴都是什麼文件

jks是JAVA的keytools證書工具支持的證書私鑰格式。
pfx是微軟支持的私鑰格式。

cer是證書的公鑰。

如果是你私人要備份證書的話記得一定要備份成者態陵jks或者pfx格式,否則恢復不了。

簡單來說,cer就是你們家郵箱的地址,你可以把這個地址給很多人讓他們往裡面發信。
pfx或jks就是你家郵箱的鑰匙閉答,別人有了這個就可以冒充你去你家郵箱看信,你丟了這首戚個也沒法開郵箱了。

❸ 鎻愬彇JKS鏂囦歡鐨勮瘉涔﹀拰縐侀掗鐨勬柟娉

JKS鏂囦歡鐢卞叕閽ュ拰瀵嗛掗鏋勬垚鍒╃敤Java Keytool 宸ュ叿鐢熸垚鐨勬枃浠訛紝瀹冩槸鐢卞叕閽ュ拰瀵嗛掗鏋勬垚鐨勶紝鍏閽ュ氨鏄鎴戜滑騫蟲椂璇寸殑璇佷功錛.cer鍚庣紑鐨勬枃浠訛級錛岀侀掗灝辨槸瀵嗛掗錛.key鍚庣紑鐨勬枃浠訛級錛屼笅闈㈢粰澶у惰茶叉彁鍙朖KS鏂囦歡鐨勮瘉涔﹀拰縐侀掗鐨勬柟娉

涓銆佸噯澶囧伐浣
1. 濡傚浘鎵紺虹殑server.jks鏂囦歡灝辨槸鐢╦ava keytools鐢熸垚鐨勫瘑閽ュ簱鏂囦歡銆

浜屻佹彁鍙栧叕閽ワ紙璇佷功錛
1. 鍒囨崲鍒拌瘉涔︾殑瀛樺偍璺寰勶紝鐒跺悗鍦ㄧ獥鍙d腑杈撳叆鈥渒eytool -list -rfc -keystore server.jks -storepass 87654321鈥濆懡浠ゆ潵灝嗚瘉涔︿俊鎮鎵撳嵃鍒板睆騫曚笂錛屽傚浘鎵紺恆

2.鍦ㄧ數鑴戜腑鏂板緩涓涓鍚嶄負server.txt鐨勬枃浠訛紝鐒跺悗涓婅堪姝ラや腑鐨勮瘉涔︿俊鎮鐨勫瓧絎︿覆澶嶅埗鍒拌ユ枃浠朵腑銆

3. 灝嗕笂榪版枃浠朵繚瀛樺埌鐢佃剳涓錛岀劧鍚庡皢璇ユ枃浠剁殑鍚庣紑鏀規垚濡傚浘鎵紺虹殑.cer錛屾垜浠鍙屽嚮鏀逛簡鍚庣紑鍚庣殑鏂囦歡灝卞彲浠ョ湅鍒拌瘉涔︿俊鎮銆

涓夈佹彁鍙栫侀掗
1.鍦ㄥ傚浘鎵紺虹殑鐣岄潰涓杈撳叆鈥渒eytool -v -importkeystore -srckeystore server.jks -srcstoretype jks -srcstorepass 87654321 -destkeystore server.pfx -deststoretype pkcs12 -deststorepass 876543210 -destkeypass 12345678鈥濆懡浠ゆ潵灝唖erver.jks鏂囦歡杞鎹㈡垚server.pfx鏂囦歡銆傚洜涓轟笉鑳界洿鎺ュ緱鍒 jks鏂囦歡涓鐨勭侀掗錛屾墍浠ラ渶瑕侀氳繃openssl灝唈ks鏂囦歡杞鎹㈡垚pfx鏍煎紡錛岀劧鍚庡啀榪涜屾彁鍙栥

2.濡傚浘鎵紺猴紝杈撳叆鈥渙penssl pkcs12 -in server.pfx -nocerts -nodes -out server.key鈥濇敼鍛戒護錛屽氨鍙浠ュ皢servers.pfx鐨勭侀掗瀵煎嚭銆

3. 濡傚浘鎵紺猴紝杈撳叆鈥渧im server.key鈥濆懡浠わ紝灝卞彲浠ョ湅鍒皃fx鐨勭侀掗淇℃伅銆

❹ java中怎麼獲取jks證書文件中的內容

JavaKeyStore的類型JKS和JCEKS是Java密鑰庫(KeyStore)的兩種比較常見類型(我所知道的共有5種,JKS,JCEKS,PKCS12,BKS,UBER)。JKS的Provider是SUN,在每個版本的JDK中都有,JCEKS的Provider是SUNJCE,1.4後我們都能夠直接使用它。JCEKS在安全級別上要比JKS強,使用的Provider是JCEKS(推薦),尤其在保護KeyStore中的私鑰上(使用TripleDes)。PKCS#12是公鑰加密標准,它規定了可包含所有私鑰、公鑰和證書。其以二進制格式存儲,也稱為PFX文件,在windows中可以直接導入到密鑰區,注意,PKCS#12的密鑰庫保護密碼同時也用於保護Key。BKS來自BouncyCastleProvider,它使用的也是TripleDES來保護密鑰庫中的Key,它能夠防止證書庫被不小心修改(Keystore的keyentry改掉1個bit都會產生錯誤),BKS能夠跟JKS互操作,讀者可以用Keytool去TryTry。UBER比較特別,當密碼是通過命令行提供的時候,它只能跟keytool交互。整個keystore是通過PBE/SHA1/Twofish加密,因此keystore能夠防止被誤改、察看以及校驗。以前,SunJDK(提供者為SUN)允許你在不提供密碼的情況下直接載入一個Keystore,類似cacerts,UBER不允許這種情況。證書導入Der/Cer證書導入:要從某個文件中導入某個證書,使用keytool工具的-import命令:1keytool-import-filemycert.der-keystoremykeystore.jks如果在-keystore選項中指定了一個並不存在的密鑰倉庫,則該密鑰倉庫將被創建。如果不指定-keystore選項,則預設密鑰倉庫將是宿主目錄中名為.keystore的文件。如果該文件並不存在,則它將被創建。創建密鑰倉庫時會要求輸入訪問口令,以後需要使用此口令來訪問。可使用-list命令來查看密鑰倉庫里的內容:1keytool-list-rfc-keystoremykeystore.jksP12格式證書導入:keytool無法直接導入PKCS12文件。第一種方法是使用IE將pfx證書導入,再導出為cert格式文件。使用上面介紹的方法將其導入到密鑰倉庫中。這樣的話倉庫裡面只包含了證書信息,沒有私鑰內容。第二種方法是將pfx文件導入到IE瀏覽器中,再導出為pfx文件。新生成的pfx不能被導入到keystore中,報錯:keytool錯誤:java.lang.Exception:所輸入的不是一個X.509認證。新生成的pfx文件可以被當作keystore使用。但會報個錯誤asunknownattr1.3.6.1.4.1.311.17.1,查了下資料,說IE導出的就會這樣,使用Netscape就不會有這個錯誤.第三種方法是將pfx文件當作一個keystore使用。但是通過微軟的證書管理控制台生成的pfx文件不能直接使用。keytool不認此格式,報keytool錯誤:java.io.IOException:。需要通過OpenSSL轉換一下:1opensslpkcs12-inmycerts.pfx-outmycerts.pem2opensslpkcs12-export-inmycerts.pem-outmykeystore.p12通過keytool的-list命令可檢查下密鑰倉庫中的內容:1keytool-rfc-list-keystoremykeystore.p12-storetypepkcs12這里需要指明倉庫類型為pkcs12,因為預設的類型為jks。這樣此密鑰倉庫就即包含證書信息也包含私鑰信息。P7B格式證書導入:keytool無法直接導入p7b文件。需要將證書鏈RootServer.p7b(包含根證書)導出為根rootca.cer和子rootcaserver.cer。將這兩個證書導入到可信任的密鑰倉庫中。1keytool-import-aliasrootca-trustcacerts-filerootca.cer-keystoretestkeytrust.jks遇到是否信任該證書提示時,輸入y1keytool-import-aliasrootcaserver-trustcacerts-filerootcaserver.cer-keystoretestkeytrust.jks總結P12格式的證書是不能使用keytool工具導入到keystore中的TheSun'sPKCS12Keystore對從IE和其他的windows程序生成的pfx格式的證書支持不太好.P7B證書鏈不能直接導入到keystore,需要將裡面的證書導出成cer格式,再分別導入到keystore。

熱點內容
華為手機方舟編譯器emui91 發布:2024-11-27 00:10:46 瀏覽:948
高考時老媽解壓 發布:2024-11-27 00:09:34 瀏覽:358
全振動演算法 發布:2024-11-27 00:00:24 瀏覽:843
編譯程序用銳龍好還是酷睿好 發布:2024-11-26 23:47:09 瀏覽:897
蘋果緩存清理後會加速嗎 發布:2024-11-26 23:28:11 瀏覽:139
我的世界伺服器修改開放埠 發布:2024-11-26 23:22:51 瀏覽:52
qt5編譯器 發布:2024-11-26 23:22:04 瀏覽:517
白糖期貨存儲多長時間 發布:2024-11-26 23:15:53 瀏覽:806
phpgettext 發布:2024-11-26 23:13:19 瀏覽:645
安卓微信的卡包在哪裡 發布:2024-11-26 23:13:18 瀏覽:204