`
luckliu521
  • 浏览: 258797 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JKS、BKS、PKCS12证书之间转换

 
阅读更多

常用的证书库:
JKS和JCEKS是Java密钥库(KeyStore)的两种比较常见类型,JKS的Provider是SUN,在每个版本的JDK中都有,JCEKS的Provider是SUNJCE,1.4后我们都能够直接使用它。
JCEKS在安全级别上要比JKS强,使用的Provider是JCEKS(推荐),尤其在保护KeyStore中的私钥上(使用TripleDES)
PKCS#12(PFX)是公钥加密标准,它规定了可包含所有私钥、公钥和证书。其以二进制格式存储,在windows中可以直接导入到密钥区,注意,PKCS#12的密钥库保护密码同时也用于保护Key。
BKS来自BouncyCastleProvider,它使用的也是TripleDES来保护密钥库中的Key,它能够防止证书库被不小心修改(Keystore的keyentry改掉1个bit都会产生错误),BKS能够跟JKS互操作。
UBER比较特别,当密码是通过命令行提供的时候,它只能跟keytool交互。整个keystore是通过PBE/SHA1/Twofish加密,因此keystore能够防止被误改、察看以及校验。SunJDK允许你在不提供密码的情况下直接加载一个Keystore,类似cacerts,UBER不允许这种情况。

/**
     * PFX证书转换为JKS(Java Key Store)
     * 
     * @param pfxPassword
     *            PFX证书密码
     * @param pfxFilePath
     *            PFX证书路径
     * @param jksPassword
     *            JKS证书密码
     * @param jksFilePath
     *            JKS证书路径
     */ 
    public static void covertPFXtoJKS(String pfxPassword, String pfxFilePath, String jksPassword, String jksFilePath) 
    { 
        FileInputStream fis = null; 
        FileOutputStream out = null; 
        try 
        { 
            // 加载PFX证书 
            KeyStore inputKeyStore = KeyStore.getInstance("PKCS12"); 
            fis = new FileInputStream(pfxFilePath); 
            char[] inPassword = pfxPassword == null ? null : pfxPassword.toCharArray(); 
            char[] outPassword = jksPassword == null ? null : jksPassword.toCharArray(); 
            inputKeyStore.load(fis, inPassword); 
 
            KeyStore outputKeyStore = KeyStore.getInstance("JKS"); 
            outputKeyStore.load(null, outPassword); 
            Enumeration<String> enums = inputKeyStore.aliases(); 
            while (enums.hasMoreElements()) 
            { 
                String keyAlias = enums.nextElement(); 
                if (inputKeyStore.isKeyEntry(keyAlias)) 
                { 
                    Key key = inputKeyStore.getKey(keyAlias, inPassword); 
                    Certificate[] certChain = (Certificate[]) inputKeyStore.getCertificateChain(keyAlias); 
                    outputKeyStore.setKeyEntry(keyAlias, key, pfxPassword.toCharArray(), (java.security.cert.Certificate[]) certChain); 
                } 
            } 
            out = new FileOutputStream(jksFilePath); 
            outputKeyStore.store(out, outPassword); 
        } catch (Exception e) 
        { 
            e.printStackTrace(); 
        } finally 
        { 
            try 
            { 
                if (fis != null) 
                { 
                    fis.close(); 
                } 
                if (out != null) 
                { 
                    out.close(); 
                } 
            } catch (Exception e) 
            { 
                e.printStackTrace(); 
            } 
        } 
    } 
   
/**
     * 从JKS格式转换为PKCS12格式
     * 
     * @param jksFilePath
     *            String JKS格式证书库路径
     * @param jksPasswd
     *            String JKS格式证书库密码
     * @param pfxFilePath
     *            String PKCS12格式证书库保存文件夹
     * @param pfxPasswd
     *            String PKCS12格式证书库密码
     */ 
public void covertJSKToPFX(String jksFilePath, String jksPasswd, String pfxFolderPath, String pfxPasswd) throws Throwable 
    { 
        FileInputStream fis = null; 
        try 
        { 
            KeyStore inputKeyStore = KeyStore.getInstance("JKS"); 
            fis = new FileInputStream(jksFilePath); 
            char[] srcPwd = jksPasswd == null ? null : jksPasswd.toCharArray(); 
            char[] destPwd = pfxPasswd == null ? null : pfxPasswd.toCharArray(); 
            inputKeyStore.load(fis, srcPwd); 
 
            KeyStore outputKeyStore = KeyStore.getInstance("PKCS12"); 
            Enumeration<String> enums = inputKeyStore.aliases(); 
            while (enums.hasMoreElements()) 
            { 
                String keyAlias = (String) enums.nextElement(); 
                System.out.println("alias=[" + keyAlias + "]"); 
                outputKeyStore.load(null, destPwd); 
                if (inputKeyStore.isKeyEntry(keyAlias))
                { 
                    Key key = inputKeyStore.getKey(keyAlias, srcPwd); 
                    java.security.cert.Certificate[] certChain = inputKeyStore.getCertificateChain(keyAlias);
                    outputKeyStore.setKeyEntry(keyAlias, key, destPwd, certChain); 
                } 
                String fName = pfxFolderPath + "_" + keyAlias + ".pfx"; 
                FileOutputStream out = new FileOutputStream(fName); 
                outputKeyStore.store(out, destPwd); 
                out.close(); 
                outputKeyStore.deleteEntry(keyAlias); 
            } 
        } finally 
        { 
            try 
            { 
                if (fis != null) 
                { 
                    fis.close(); 
                } 
            } catch (Exception e) 
            { 
                e.printStackTrace(); 
            } 
        } 
    } 

/**
     * 从BKS格式转换为PKCS12格式
     * 
     * @param jksFilePath
     *            String JKS格式证书库路径
     * @param jksPasswd
     *            String JKS格式证书库密码
     * @param pfxFilePath
     *            String PKCS12格式证书库保存文件夹
     * @param pfxPasswd
     *            String PKCS12格式证书库密码
     */ 
public void covertBKSToPFX(String jksFilePath, String jksPasswd, String pfxFolderPath, String pfxPasswd) throws Throwable 
    { 
        FileInputStream fis = null; 
        try 
        { 
            KeyStore inputKeyStore = KeyStore.getInstance("BKS", new org.bouncycastle.jce.provider.BouncyCastleProvider());
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
            fis = new FileInputStream(jksFilePath); 
            char[] srcPwd = jksPasswd == null ? null : jksPasswd.toCharArray(); 
            char[] destPwd = pfxPasswd == null ? null : pfxPasswd.toCharArray(); 
            inputKeyStore.load(fis, srcPwd); 
 
            KeyStore outputKeyStore = KeyStore.getInstance("PKCS12"); 
            Enumeration<String> enums = inputKeyStore.aliases(); 
            while (enums.hasMoreElements()) 
            { 
                String keyAlias = (String) enums.nextElement(); 
                System.out.println("alias=[" + keyAlias + "]"); 
                outputKeyStore.load(null, destPwd); 
                if (inputKeyStore.isKeyEntry(keyAlias))
                { 
                    Key key = inputKeyStore.getKey(keyAlias, srcPwd); 
                    java.security.cert.Certificate[] certChain = inputKeyStore.getCertificateChain(keyAlias);
                    outputKeyStore.setKeyEntry(keyAlias, key, destPwd, certChain); 
                } 
                String fName = pfxFolderPath + "_" + keyAlias + ".pfx"; 
                FileOutputStream out = new FileOutputStream(fName); 
                outputKeyStore.store(out, destPwd); 
                out.close(); 
                outputKeyStore.deleteEntry(keyAlias); 
            } 
        } finally 
        { 
            try 
            { 
                if (fis != null) 
                { 
                    fis.close(); 
                } 
            } catch (Exception e) 
            { 
                e.printStackTrace(); 
            } 
        } 
    } 

/**
     * 列出JKS库内所有X509证书的属性
     * 
     * @param jksFilePath
     *            证书库路径
     * @param jksPasswd
     *            证书库密码
     * @param algName
     *            库类型
     */ 
    public static void listAllCerts(String jksFilePath, String jksPasswd, String algName) 
    { 
        try 
        { 
            char[] srcPwd = jksPasswd == null ? null : jksPasswd.toCharArray(); 
            FileInputStream in = new FileInputStream(jksFilePath); 
            KeyStore ks = KeyStore.getInstance(algName); 
            ks.load(in, srcPwd); 
            Enumeration<String> e = ks.aliases(); 
            while (e.hasMoreElements()) 
            { 
                String alias = e.nextElement(); 
                java.security.cert.Certificate cert = ks.getCertificate(alias); 
                if (cert instanceof X509Certificate) 
                { 
                    X509Certificate X509Cert = (X509Certificate) cert; 
                    System.out.println("**************************************"); 
                    System.out.println("版本号:" + X509Cert.getVersion()); 
                    System.out.println("序列号:" + X509Cert.getSerialNumber().toString(16)); 
                    System.out.println("主体名:" + X509Cert.getSubjectDN()); 
                    System.out.println("签发者:" + X509Cert.getIssuerDN()); 
                    System.out.println("有效期:" + X509Cert.getNotBefore()); 
                    System.out.println("签名算法:" + X509Cert.getSigAlgName()); 
                    System.out.println("输出证书信息:\n" + X509Cert.toString()); 
                    System.out.println("**************************************"); 
                } 
            } 
        } catch (Exception e) 
        { 
            e.printStackTrace(); 
        } 
    } 
   
    /*
    * 列出BKS库内所有X509证书的属性
    * 
    * @param jksFilePath
    *            证书库路径
    * @param jksPasswd
    *            证书库密码
    * @param algName
    *            库类型
    */
    public static void listAllCertsBks(String jksFilePath, String jksPasswd, String algName) 
    { 
        try 
        { 
            char[] srcPwd = jksPasswd == null ? null : jksPasswd.toCharArray(); 
            FileInputStream in = new FileInputStream(jksFilePath); 
            KeyStore ks = KeyStore.getInstance(algName, new org.bouncycastle.jce.provider.BouncyCastleProvider());
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());   
            ks.load(in, srcPwd); 
            Enumeration<String> e = ks.aliases(); 
            while (e.hasMoreElements()) 
            { 
                String alias = e.nextElement(); 
                java.security.cert.Certificate cert = ks.getCertificate(alias); 
                if (cert instanceof X509Certificate) 
                { 
                    X509Certificate X509Cert = (X509Certificate) cert; 
                    System.out.println("**************************************"); 
                    System.out.println("版本号:" + X509Cert.getVersion()); 
                    System.out.println("序列号:" + X509Cert.getSerialNumber().toString(16)); 
                    System.out.println("主体名:" + X509Cert.getSubjectDN()); 
                    System.out.println("签发者:" + X509Cert.getIssuerDN()); 
                    System.out.println("有效期:" + X509Cert.getNotBefore()); 
                    System.out.println("签名算法:" + X509Cert.getSigAlgName()); 
                    System.out.println("输出证书信息:\n" + X509Cert.toString()); 
                    System.out.println("**************************************"); 
                } 
            } 
        } catch (Exception e) 
        { 
            e.printStackTrace(); 
        } 
    } 

 

分享到:
评论

相关推荐

    jks文件转bks文件.zip

    `p12`(也称为PKCS#12)文件是Microsoft的格式,而`pfx`是其别名,通常包含了私钥、公钥和证书。这些文件也可以被转换为`jks`或`bks`,以便在Java或Android环境中使用。 总的来说,理解并熟练掌握不同类型的密钥库...

    SSL中各证书的转换

    本文将详细介绍如何在不同的证书格式之间进行转换,包括从`.cer`到`.jks`、从`.jks`到`.cer`、从`.p12`到`.pem`以及从`.cer`到`.pem`的过程。 ### 1. `.cer`格式转换至`.jks`格式 #### 背景介绍 `.cer`文件通常...

    jks转为bks

    BKS来自BouncyCastleProvider,它使用的也是TripleDES来保护密钥库中的Key,它能够防止证书库被不小心修改(Keystore的keyentry改掉1个bit都会产生错误),BKS能够跟JKS互操作。 JKS和JCEKS是Java密钥库(KeyStore)的...

    证书转换portecle-1.9.zip

    它支持多种类型的密钥库,如JKS(Java KeyStore)、BKS(Bouncy Castle KeyStore)、PKCS12等,同时也能够处理各种证书格式。在描述中提到的证书转换,主要包括P12到BKS以及BKS到P12的过程。 首先,我们来了解下...

    证书转换生成工具protecle

    3. **格式转换**:例如,Protecle可以帮助我们将P12(PKCS#12)格式的证书转换为BKS(Bouncy Castle Keystore)格式,适用于Android设备。BKS是Android系统推荐使用的密钥库格式。 4. **管理KeyStore**:可以查看和...

    javakeytool支持的类型及如何将证书导入jks中.docx

    Java KeyStore 有多种类型,常见的有 JKS、JCEKS、PKCS12、BKS 和 UBER 等。JKS 和 JCEKS 是 Java 密钥库(KeyStore)的两种比较常见类型。JKS 的 Provider 是 SUN,在每个版本的 JDK 中都有,JCEKS 的 Provider 是 ...

    portecle-1.11.zip

    在描述中提到,它可以将PKCS12(p12)格式的证书转换为BKS(Bouncy Castle KeyStore)格式。PKCS12是一种通用的证书存储格式,常用于跨平台的个人身份验证,而BKS是Android系统中广泛支持的KeyStore格式,特别适合...

    android bks

    BKS是基于开源加密库Bouncy Castle开发的KeyStore实现,它支持PKCS12和Java keystore格式,且兼容Android系统。相比默认的JKS(Java KeyStore)格式,BKS提供了更广泛的支持,特别是对非对称加密算法如RSA和DSA的...

    数字证书格式详细说明

    Java KeyStore 的类型有 JKS、JCEKS、PKCS12、BKS、UBER 等。 JKS 是 Java 密钥库的类型之一,由 SUN 提供,位于每个版本的 JDK 中。JCEKS 是 Java 密钥库的类型之一,由 SUNJCE 提供,在安全级别上比 JKS 强。 ...

    android测试SSL笔记

    Android系统默认使用的是BKS类型的KeyStore,而服务器可能使用其他类型的证书,例如JKS或PKCS12。因此,当尝试连接自签名或者非受信任的服务器时,Android系统会抛出“Not trusted server certificate”的错误。为了...

    数字证书格式 相关知识 和 方法

    - **PKCS#12**:包含公钥证书、私钥及整个证书链,适用于跨平台的证书存储。 4. Java密钥管理 - **keytool**:Java自带的工具,用于管理和保护用户的公钥/私钥对及证书,存储于密钥仓库(keystore)中,如JKS和...

    portecle-1.9.rar

    在这个场景下,Portecle的主要作用是将P12格式的证书转换为BKS格式,使得这些证书能够在Android设备上被正确地导入和使用。通过Portecle,用户可以方便地导入P12文件,设置或更改密钥库密码,然后导出为BKS格式。这...

    JavaKeyStore的类型.doc

    3. **生成客户端证书**:同样使用`keytool -genkey`,但指定`storetype PKCS12`,生成PKCS12格式的KeyStore,适用于浏览器或应用程序客户端。 4. **导出客户端证书**:与服务器端证书相同,导出客户端证书为PEM格式...

    keystore-explorer:KeyStore Explorer是Java命令行实用程序keytool和jarsigner的免费GUI替代品

    在各种KeyStore类型之间创建,加载,保存和转换:JKS,JCEKS,PKCS#12,BKS(V1和V2)和UBER 更改密钥库和密钥库条目密码 删除或重命名KeyStore条目 剪切/复制/粘贴KeyStore条目 将证书附加到密钥对证书链 生成...

    portecle-1.11

    8. **支持多种keystore类型**:除了默认的JKS(Java KeyStore)外,Portecle还支持PKCS#12、BKS(Bouncy Castle Keystore)、UBER等keystore格式。 Portecle提供的这些功能简化了对数字证书和密钥的操作,使得非...

Global site tag (gtag.js) - Google Analytics