zoukankan      html  css  js  c++  java
  • Java将pfx证书转换为jks

    目的:将已有的pfx证书转换为jks,供tomcat认证用

    过程:

        我们可以通过如下java代码将pfx证书转换为jks,代码如下:

    package com.yangangus.util;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.security.Key;
    import java.security.KeyStore;
    import java.security.cert.Certificate;
    import java.util.Enumeration;
    
    public class ConventPFXToJKS {
    
        public static final String PKCS12 = "PKCS12";
        public static final String JKS = "JKS";
        public static final String PFX_KEYSTORE_FILE = "D:\temp\certs\wildcard_test_com.pfx";// pfx文件位置
        public static final String PFX_PASSWORD = "pfx_password";// 导出为pfx文件的设的密码
        public static final String JKS_KEYSTORE_FILE = "D:\temp\certs\keystore.jks"; // jks文件位置
        public static final String JKS_PASSWORD = "jks_password";// JKS的密码
    
        public static void coverTokeyStore() {
            FileInputStream fis = null;
            FileOutputStream out = null;
            try {
                KeyStore inputKeyStore = KeyStore.getInstance("PKCS12");
                fis = new FileInputStream(PFX_KEYSTORE_FILE);
                char[] pfxPassword = null;
                if ((PFX_PASSWORD == null) || PFX_PASSWORD.trim().equals("")) {
                    pfxPassword = null;
                } else {
                    pfxPassword = PFX_PASSWORD.toCharArray();
                }
                char[] jksPassword = null;
                if ((JKS_PASSWORD == null) || JKS_PASSWORD.trim().equals("")) {
                    jksPassword = null;
                } else {
                    jksPassword = JKS_PASSWORD.toCharArray();
                }
    
                inputKeyStore.load(fis, pfxPassword);
                fis.close();
                KeyStore outputKeyStore = KeyStore.getInstance("JKS");
                outputKeyStore.load(null, jksPassword);
                Enumeration enums = inputKeyStore.aliases();
                while (enums.hasMoreElements()) { // we are readin just one
                    // certificate.
                    String keyAlias = (String) enums.nextElement();
                    System.out.println("alias=[" + keyAlias + "]");
                    if (inputKeyStore.isKeyEntry(keyAlias)) {
                        Key key = inputKeyStore.getKey(keyAlias, pfxPassword);
                        Certificate[] certChain = inputKeyStore.getCertificateChain(keyAlias);
                        outputKeyStore.setKeyEntry(keyAlias, key, jksPassword, certChain);
                    }
                }
    
                out = new FileOutputStream(JKS_KEYSTORE_FILE);
                outputKeyStore.store(out, jksPassword);
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (out != null) {
                    try {
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            coverTokeyStore(); // pfx to jks
        }
    
    }

    这样我们就获取到jks了,接下来我们可以用keytool来导出公钥(alias的值在上面java代码运行时会打印出来,替代certificatekey即可):

    keytool -export -alias certificatekey -keystore keystore.jks -rfc -file keycert.cer

    我们获得证书后,再将证书添加到truststore中,可以运行如下命令(alias的值在上面java代码运行时会打印出来,替代certificatekey即可,file后面的cer是我们上一步导出的公钥):

    keytool -import -alias certificatekey -file keycert.cer  -keystore trustkeystore.jks

    在运行这个命令过程中会提示输入密码,即你truststore的密码。生成完成后,我们接下来就是配置tomcat。

    修改配置tomcat的server.xml,类似如下,配置单向验证,另外ciphers如果不加入,可能类似firefox访问会有问题:

     <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
                   maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
                   clientAuth="false" sslProtocol="TLS"
                   ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA"
                   keystorePass="jks_password" keystoreFile="/webapp/keystore.jks"
                   truststoreFile="/webapp/trustkeystore.jks" truststorePass="trust_password"/>

    配置完成后启动tomcat,用https访问就可以了!

  • 相关阅读:
    VisualVM工具的使用
    jstack的使用
    JVM内存溢出的定位与分析
    初识JVM
    JVM运行参数
    VIM 常用命令
    python3 简单抓取图片2
    python3 抓取图片
    node.js GET 请求简单案例
    node.js 爬虫
  • 原文地址:https://www.cnblogs.com/angusyang/p/6830331.html
Copyright © 2011-2022 走看看