2017-08-29 7 views
0

bouncycastleライブラリを使用して、指定されたPEM形式のファイルからX.509証明書を抽出する方法があります。JavaでPEM形式のファイルから複数のX.509証明書を抽出する

輸入:

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.security.cert.CertificateException; 
import java.security.cert.X509Certificate; 

import org.bouncycastle.cert.X509CertificateHolder; 
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; 
import org.bouncycastle.openssl.PEMParser; 

方法:

/** 
* Reads an X509 certificate from a PEM file. 
* 
* @param certificateFile The PEM file. 
* @return the X509 certificate, or null. 
* @throws IOException if reading the file fails 
* @throws CertificateException if parsing the certificate fails 
*/ 
public static X509Certificate readCertificatePEMFile(File certificateFile) throws IOException, CertificateException { 
    if (certificateFile.exists() && certificateFile.canRead()) { 
     try (InputStream inStream = new FileInputStream(certificateFile)) { 
      try (PEMParser pemParser = new PEMParser(new InputStreamReader(inStream))) { 
       Object object = pemParser.readObject(); 
       if (object != null && object instanceof X509CertificateHolder) { 
        return new JcaX509CertificateConverter().getCertificate((X509CertificateHolder)object); 
       } 
      } 
     } 
    } 
    return null; 
} 

これは "通常の" 証明書ファイルに適しています、例えばサーバー証明書 複数の証明書を含むCAチェーン証明書ファイルがある場合、このファイルからすべての証明書を抽出するにはどうすればよいですか(ここに示す方法では、ファイルの最初の証明書のみが抽出されます)。

+1

あなたは) 'pemParser.readObject(呼び出そうとしました;'複数回 'object'がnullになるまで? – pedrofb

答えて

0

このコードを試してみてください、それは複数の証明書と秘密鍵のエントリーイムPEMファイルを扱う

Security.addProvider(new BouncyCastleProvider()); 
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC"); 
while((object = pemParser.readObject())!=null) 
{ 
    if(object instanceof X509CertificateHolder) 
    { 
     X509Certificate x509Cert = (X509Certificate) new JcaX509CertificateConverter().getCertificate((X509CertificateHolder) object); 
    } 
    else if(object instanceof PEMEncryptedKeyPair) 
    { 
     if(password==null) throw new IllegalArgumentException("Password required for parsing RSA Private key"); 

     PEMDecryptorProvider decProv = new JcePEMDecryptorProviderBuilder().build(password.toCharArray()); 
     converter.getKeyPair(((PEMEncryptedKeyPair) object).decryptKeyPair(decProv)); 
    } 
    else if(object instanceof PEMKeyPair) 
    { 
     converter.getKeyPair((PEMKeyPair) object); 
    }  
} 
関連する問題