JVM證書導入: 通過java代碼導入證書

核心代碼

import java.io.*;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

import lombok.extern.slf4j.Slf4j;

/**
 * @author wangqimeng
 * @date 2019/10/15 13:36
 */
@Slf4j
public class KeyStoreUtil {

    private KeyStoreUtil() {

    }

    public static void saveCertificate(String cerNameAlias,
                                       InputStream certIn,
                                       String passphrase) throws Exception {
        log.debug("程序進行證書導入工作");
        final char sep = File.separatorChar;
        File dir = new File(System.getProperty("java.home") + sep + "lib" + sep + "security");
        log.debug("導入證書路徑:{}", dir);
        char[] passphraseArray = passphrase.toCharArray();
        OutputStream out = null;
        File targetKeyStore = new File(dir, "cacerts");
        //輸入流和輸出流不可同時在同一文件,否則文件會被置空
        try (InputStream localCertIn = new FileInputStream(targetKeyStore)) {

            KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
            keystore.load(localCertIn, passphraseArray);
            //判斷是否已經存在在該證書
            if (keystore.containsAlias(cerNameAlias)) {
                log.debug("已經存在該證書:{}", cerNameAlias);
                return;
            }
            BufferedInputStream bis = new BufferedInputStream(certIn);
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            while (bis.available() > 0) {
                Certificate cert = cf.generateCertificate(bis);
                keystore.setCertificateEntry(cerNameAlias, cert);
            }
            out = new FileOutputStream(targetKeyStore);
            keystore.store(out, passphraseArray);
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    log.error("輸出流關閉失敗");
                }
            }
        }
    }
}

證書實體


import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;

/**
 * @author wangqimeng
 * @date 2019/10/15 11:06
 */
@Data
@Validated
@ConfigurationProperties(prefix = "sso")
public class CertificateProperties {

    private String certificatePath;

    private String certificateNameAlias;

    private String passphrase = "changeit";

    private boolean autoImportCertificate;

}

example

sso:
  auto-import-certificate: true
  certificate-name-alias: sso.ga.cer
  certificate-path: public/ssl/sso.ga.cer
  passphrase: changeit
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章