.jks或者.keystore转换为.pem

注意:此处主要借助于sh脚本进行转换

新建shell脚本:

前提: 需要配置好keytool、openssl命令

证书转换路径:

1、jks -> pkcs12 -> pem

2、keystore -> pkcs12 -> pem

注意:jks和keystore转换方式一致

#!/usr/bin/env bash

function keystore_2_pem() {
  srckeystore=$1
  srckeystorename=${srckeystore##*/}
  srcstorepass=$2
  tmpdir=$(mktemp -d)
  cp "$srckeystore" "$tmpdir"
  cd "$tmpdir" || exit
  keytool -importkeystore \
          -srckeystore "$srckeystore" \
          -destkeystore "$srckeystorename".pkcs12 \
          -deststoretype pkcs12 \
          -srcstorepass "${srcstorepass}" \
          -deststorepass "${srcstorepass}"

  openssl pkcs12 \
          -in "$srckeystorename".pkcs12 \
          -out "$srckeystorename".pem \
          -passin pass:"${srcstorepass}" \
          -passout pass:"${srcstorepass}"

  cert_info=`cat "${srckeystorename}".pem`
  echo "${cert_info}"
  echo "###cert_info_end###"
  dates=`openssl x509 -in "${srckeystorename}".pem -noout -dates`
  echo "${dates}"
}

srckeystore=$1
srcstorepass=$2

keystore_2_pem "$srckeystore" "$srcstorepass"

注:

shell获取父目录:${srckeystore%/*}

shell获取文件名称:${srckeystore##*/}

转自:linux shell获取文件名和文件目录_shell 获取文件名_happy08god的博客-CSDN博客

创建Java工程:

后续会用到打包,所以此处引入 maven-assembly-plugin 打包工具,将依赖信息打包到一个jar中,方便后续java -jar 执行测试

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <archive>
                                <manifest>
                                    <mainClass>
                                       com.wd.ShellOpr  // main方法类
                                    </mainClass>
                                </manifest>
                            </archive>
                            <descriptorRefs>
                                <descriptorRef>jar-with-dependencies</descriptorRef>
                            </descriptorRefs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

创建java类,执行脚本:

package com.wd;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;

public class ShellOpr {

    private static final String CERT_INFO_END = "###cert_info_end###";

    /**
     * 证书中的日期格式
     */
    private static final SimpleDateFormat CERT_DATE_FORMAT;

    /**
     * 目标日期格式
     */
    private static final SimpleDateFormat TARGET_DATE_FORMAT;

    static {
        CERT_DATE_FORMAT = new SimpleDateFormat("MMM dd HH:mm:ss yyyy z", Locale.ENGLISH);
        CERT_DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT"));

        TARGET_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z", Locale.ENGLISH);
        TARGET_DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT"));
    }

    public static void main(String[] args) throws Exception {
        /*
          sh 执行shell
          cert_opr.sh 执行证书转换的脚本
          /root/server.jks 待转换的证书路径
          123456 证书密码
         */
        String[] cmd = new String[]{"sh", "cert_opr.sh", "/root/server.jks", "123456"};
        Process process = Runtime.getRuntime().exec(cmd);
        StringBuilder certInfoStr = new StringBuilder();
        List<String> certTimeList = new ArrayList<>();
        try (InputStream inputStream = process.getInputStream();
             InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader)){
            String line;
            boolean certEnd = false;
            while ((line = bufferedReader.readLine()) != null) {
                if (CERT_INFO_END.equals(line)) {
                    certEnd = true;
                    continue;
                }
                if (certEnd) {
                    certTimeList.add(line);
                    continue;
                }
                certInfoStr.append(line).append(System.lineSeparator());
            }
        }
        System.out.println(certInfoStr);
        System.out.println("<<=====================>>");
        List<String> certTimeFormat = new ArrayList<>();
        for (String certTime : certTimeList) {
            String[] certTimeArr = certTime.split("=");
            if (certTimeArr.length < 2) {
                continue;
            }
            certTimeFormat.add(TARGET_DATE_FORMAT.format(CERT_DATE_FORMAT.parse(certTimeArr[1])));
        }
        System.out.println(certTimeFormat);
    }

}

输出结果

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐