核心代碼
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