熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java處理PFX格式證書

2013-11-23 19:29:55  來源: Java核心技術 

  在Security編程中有幾種典型的密碼交換信息文件格式:
    DERencoded certificate: cer crt
    PEMencoded message: pem
    PKCS# Personal Information Exchange: pfx p
    PKCS# Certification Request: p
    PKCS# cert request response: pr
    PKCS# binary message: pb

  cer/crt是用於存放證書它是進制形式存放的不含私鑰
    pem跟crt/cer的區別是它以Ascii來表示
    pfx/p用於存放個人證書/私鑰他通常包含保護密碼進制方式
    p是證書請求
    pr是CA對證書請求的回復只用於導入
    pb以樹狀展示證書鏈(certificate chain)同時也支持單個證書不含私鑰

  其中我介紹如何從p/pfx文件中提取密鑰對及其長度:
    首先讀取pfx/p文件(需要提供保護密碼)
    通過別名(Alias注意所有證書中的信息項都是通過Alias來提取的)提取你想要分析的證書鏈
    再將其轉換為一個以X證書結構體
    提取裡面的項如果那你的證書項放在第一位(單一證書)直接讀取 xCerts[](見下面的代碼)這個XCertificate對象
    XCertificate對象有很多方法tain網友希望讀取RSA密鑰(公私鑰)及其長度(見?topicId=&forumId=&)那真是太Easy了
                XCertificate keyPairCert = xCerts[];
                int iKeySize = XCertUtilgetCertificateKeyLength(keyPairCert);
                Systemoutprintln(證書密鑰算法=+keyPairCertgetPublicKey()getAlgorithm());
                Systemoutprintln(證書密鑰長度=+iKeySize);
    提取了他所需要的信息

  package  orgdevdevclientkeypair;

  import  javaioFile;
     import  javaioFileInputStream;
     import  javaioFileNotFoundException;
     import  javaioIOException;
     import  javasecurityKeyStore;
     import  javasecurityKeyStoreException;
     import  javasecurityNoSuchAlgorithmException;
     import  javasecurityNoSuchProviderException;
     import  javasecuritySecurity;
     import  javasecuritycertCertificate;
     import  javasecuritycertCertificateException;
     import  javasecuritycertXCertificate;
     import  orgdevdevsecuritykeytoolXCertUtil;

  public   class  LoadKeyFromPKCS   {

  public   static   void  main(String[] args)   {
             try    {
                 //  Open an input stream on the keystore file
                 String pfxFileName = c:\\davidturingpfx ;
                String pfxPassword = ;

  File fPkcs  =   null ;
                 if  (pfxFileName  !=   null )   {
                     //  Open the file
                     fPkcs  =   new  File(pfxFileName);
                }

  FileInputStream fis  =   new  FileInputStream(fPkcs);

  //  Create a keystore object
                 KeyStore keyStore  =   null ;
                 try
                   {
                         //  Need BC provider for PKCS # BKS and UBER
                          if  (SecuritygetProvider( BC )  ==   null )
                          {
                             throw   new  Exception( 不能Load入BouncyCastle! );
                        }

  keyStore  =  KeyStoregetInstance( PKCS   BC );
                }
                 catch  (KeyStoreException ex)
                  {
                      throw   new  Exception( 不能正確解釋pfx文件! );
                }
                 catch  (NoSuchProviderException ex)
                  {
                     throw   new  Exception( Security Provider配置有誤! );
                }

  try
                   {
                     //  Load the file into the keystore
                     keyStoreload(fis pfxPasswordtoCharArray());
                }
                 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  =  keyStoregetCertificateChain( davidturing );
                XCertificate[] xCerts  =  nvertCertificates(certs);

  if  (xCerts  ==   null )
                  {
                     return ;
                }

  xCerts  =  XCertUtilorderXCertChain(xCerts);

  XCertificate keyPairCert  =  xCerts[ ];

  int  iKeySize  =  XCertUtilgetCertificateKeyLength(keyPairCert);
                Systemoutprintln( 證書密鑰算法= + keyPairCertgetPublicKey()getAlgorithm());
                Systemoutprintln( 證書密鑰長度= + iKeySize);

  }   catch  (Exception e)   {
                eprintStackTrace();
            }
        }

  }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26970.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.