[SPRING] Pem 인증서가있는 RestTemplate
SPRINGPem 인증서가있는 RestTemplate
개인 키와 서버 인증서가있는 pem 인증서가 있습니다. 곱슬 곱슬을 사용하여 실행할 수 있으며 모든 작업이 정상입니다.
curl -O -k --cert-type pem --cert mypem.pem url
하지만 난 자바와 함께, 가장 바람직하게 RestTemplate 봄에서 그것을 사용하고 싶습니다.
해결법
-
==============================
1.따라서 Pem 인증서를 RestTemplate과 함께 사용하는 것에 대한 지식은 혼란 스럽습니다.
따라서 Pem 인증서를 RestTemplate과 함께 사용하는 것에 대한 지식은 혼란 스럽습니다.
수행해야 할 단계 :
과
public class ConnectionFactoryCreator { private final String pemName; private final SSLContext context; public ConnectionFactoryCreator(String pemName, SSLContext context) { this.pemName = pemName; this.context = context; } public SSLSocketFactory getSocketFactory() throws Exception { InputStream resourceAsStream = getClass().getResourceAsStream(pemName); byte[] certAndKey = ByteStreams.toByteArray(resourceAsStream); byte[] certBytes = parseDERFromPEM(certAndKey, "-----BEGIN CERTIFICATE-----", "-----END CERTIFICATE-----"); byte[] keyBytes = parseDERFromPEM(certAndKey, "-----BEGIN PRIVATE KEY-----", "-----END PRIVATE KEY-----"); X509Certificate cert = generateCertificateFromDER(certBytes); PrivateKey key = generatePrivateKeyFromDER(keyBytes); KeyStore keystore = KeyStore.getInstance("JKS"); keystore.load(null); keystore.setCertificateEntry("cert-alias", cert); keystore.setKeyEntry("key-alias", key, "changeit".toCharArray(), new Certificate[] { cert }); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); kmf.init(keystore, "changeit".toCharArray()); KeyManager[] km = kmf.getKeyManagers(); context.init(km, null, null); return context.getSocketFactory(); } private byte[] parseDERFromPEM(byte[] pem, String beginDelimiter, String endDelimiter) { String data = new String(pem); String[] tokens = data.split(beginDelimiter); tokens = tokens[1].split(endDelimiter); return DatatypeConverter.parseBase64Binary(tokens[0]); } private PrivateKey generatePrivateKeyFromDER(byte[] keyBytes) throws InvalidKeySpecException, NoSuchAlgorithmException { PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory factory = KeyFactory.getInstance("RSA"); return factory.generatePrivate(spec); } private X509Certificate generateCertificateFromDER(byte[] certBytes) throws CertificateException { CertificateFactory factory = CertificateFactory.getInstance("X.509"); return (X509Certificate) factory.generateCertificate(new ByteArrayInputStream(certBytes)); }
마지막으로 inject에 restTemplate을 사용하여 URL에 연결할 수 있습니다.
-
==============================
2.자바 트러스트 스토어에서 인증서를 가져와야한다.
자바 트러스트 스토어에서 인증서를 가져와야한다.
BTW pem 및 cer (t) 파일은 동일하며 확장자의 다른 이름입니다.
추가 링크
from https://stackoverflow.com/questions/33497874/resttemplate-with-pem-certificate by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Android Spring 파일 업로드 OutofMemory (0) | 2019.04.02 |
---|---|
[SPRING] [org.thymeleaf.templateresolver.ServletContextTemplateResolver]를 인스턴스화하지 못했습니다 : 기본 생성자가 없습니다 (0) | 2019.04.02 |
[SPRING] 최대 절전 모드를 사용하여 중첩 된 JSON 데이터를 MySQL 데이터베이스에 저장 (0) | 2019.04.01 |
[SPRING] IntelliJ IDEA가 잘못된 XSD를 확인합니다. (0) | 2019.04.01 |
[SPRING] 스프링 컨텍스트를로드하지 못한 경우 서버를 중지하는 방법은 무엇입니까? (0) | 2019.04.01 |