當前位置:才華齋>IT認證>SUN認證>

如何在Java處理PFX格式證書

SUN認證 閱讀(1.66W)

公鑰加密技術12號標準(Public Key Cryptography Standards #12,PKCS#12)為儲存和傳輸使用者或服務器私鑰、公鑰和證書指定了一個可移植的格式。它是一種二進位制格式,這些檔案也稱為PFX檔案。

如何在Java處理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();

}

}

}