公鑰加密技術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();
}
}
}