如何在Java處理PFX格式證書
公鑰加密技術12號標準(Public Key Cryptography Standards #12,PKCS#12)為存儲和傳輸用户或服務器私鑰、公鑰和證書指定了一個可移植的格式。它是一種二進制格式,這些文件也稱為PFX文件。
開發人員通常需要將PFX文件轉換為某些不同的格式,如PEM或JKS,以便可以為使用SSL通信的獨立Java客户端或WebLogic Server使用
在Security編程中,有幾種典型的密碼交換信息文件格式:
DER-encoded certificate: ,
PEM-encoded message:
PKCS#12 Personal Information Exchange: , .p12
PKCS#10 Certification Request: .p10
PKCS#7 cert request response: .p7r
PKCS#7 binary message: .p7b
是用於存放證書,它是2進制形式存放的,不含私鑰。
跟crt/cer的區別是它以Ascii來表示。
pfx/p12用於存放個人證書/私鑰,他通常包含保護密碼,2進制方式
p10是證書請求
p7r是CA對證書請求的回覆,只用於導入
p7b以樹狀展示證書鏈(certificate chain),同時也支持單個證書,不含私鑰。
其中,我介紹如何從p12/pfx文件中提取密鑰對及其長度:
1,首先,讀取pfx/p12文件(需要提供保護密碼)
2,通過別名(Alias,注意,所有證書中的信息項都是通過Alias來提取的.)提取你想要分析的證書鏈
3,再將其轉換為一個以X509證書結構體
4,提取裏面的項,如果那你的證書項放在第一位(單一證書),直接讀取 x509Certs[0](見下面的代碼)這個X509Certificate對象
5,X509Certificate對象有很多方法,tain198127網友希望讀取RSA密鑰(公私鑰)及其長度(見),那真是太Easy了,
X509Certificate keyPairCert = x509Certs[0];
int iKeySize = ertificateKeyLength(keyPairCert);
tln("證書密鑰算法="+ublicKey()lgorithm());
tln("證書密鑰長度="+iKeySize);
提取了他所需要的信息。
package air;
import ;
import InputStream;
import NotFoundException;
import ception;
import tore;
import toreException;
import chAlgorithmException;
import chProviderException;
import rity;
import ificate;
import ificateException;
import .X509Certificate;
import ool.X509CertUtil;
public class LoadKeyFromPKCS12 {
public static void main(String[] args) {
try {
// Open an input stream on the keystore file
String pfxFileName = " c: " ;
String pfxPassword = " 123456 " ;
File fPkcs12 = null ;
if (pfxFileName != null ) {
// Open the file
fPkcs12 = new File(pfxFileName);
}
FileInputStream fis = new FileInputStream(fPkcs12);
// Create a keystore object
KeyStore keyStore = null ;
try
{
// Need BC provider for PKCS #12, BKS and UBER
if (rovider( " BC " ) == null )
{
throw new Exception( " 不能Load入BouncyCastle! " );
}
keyStore = nstance( " PKCS12 " , " BC " );
}
catch (KeyStoreException ex)
{
throw new Exception( " 不能正確解釋pfx文件! " );
}
catch (NoSuchProviderException ex)
{
throw new Exception( " Security Provider配置有誤! " );
}
try
{
// Load the file into the keystore
(fis, arArray());
}
catch (CertificateException ex)
{
throw new Exception( " 證書格式問題! " );
}
catch (NoSuchAlgorithmException ex)
{
throw new Exception( " 算法不支持! " );
}
catch (FileNotFoundException ex)
{
throw new Exception( " pfx文件沒找到 " );
}
catch (IOException ex)
{
throw new Exception( " 讀取pfx有誤! " );
}
// 獲取我的證書鏈的中keyEntry的別名
Certificate[] certs = ertificateChain( " ng " );
X509Certificate[] x509Certs = ertCertificates(certs);
if (x509Certs == null )
{
return ;
}
x509Certs = rX509CertChain(x509Certs);
X509Certificate keyPairCert = x509Certs[ 0 ];
int iKeySize = ertificateKeyLength(keyPairCert);
tln( " 證書密鑰算法= " + ublicKey()lgorithm());
tln( " 證書密鑰長度= " + iKeySize);
} catch (Exception e) {
tStackTrace();
}
}
}
-
JDK的正則表達
jdk是Java語言的軟件開發工具包,主要用於移動設備、嵌入式設備上的java應用程序。下面小編為大家整理了關於JDK的正則表達,一起來看看吧:一、概述正則表達式是Java處理字符串、文本的重要工具。Java對正則表達式的處理集中在以下兩個兩個類:her模式類:用來表示一個...
-
關於J2ME數組的複製及連接操作方法
publicclassArrays{/***構造函數私有,這樣可以保證只能通過:類名.靜態方法或類名.靜態方法來訪問內部數據,*而不可以通過創建本類的對象來進行訪問*/privateArrays(){}/***複製一個跟源byte數組一樣的byte數組*@paramrSource源byte數組*@return跟源byte[]數組一...
-
JAVA IO操作知識彙總
Java的核心庫提供了全面的IO接口。包括:文件讀寫、標準設備輸出等。Java中IO是以流為基礎進行輸入輸出的,所有數據被串行化寫入輸出流,或者從輸入流讀入。下面YJBYS小編為大家整理了關於JAVAIO操作知識彙總的文章,希望對你有所幫助。一、流的概念流是字節序列的抽...
-
java初級程序員面試題「經典」
JAVA程序員每次考試都包括65道以上的多項選擇題,時間大約為90分鐘。考試合格後由Sun公司頒發的國際通用的Java程序員證書。以下是關於java初級程序員面試題,歡迎大家參考!1、面向對象的特徵有哪些方面?答:面向對象的特徵主要有以下幾個方面:1)抽象:抽象是將一類對象...