복붙노트

[SPRING] Pem 인증서가있는 RestTemplate

SPRING

Pem 인증서가있는 RestTemplate

개인 키와 서버 인증서가있는 pem 인증서가 있습니다. 곱슬 곱슬을 사용하여 실행할 수 있으며 모든 작업이 정상입니다.

curl -O -k --cert-type pem --cert mypem.pem url

하지만 난 자바와 함께, 가장 바람직하게 RestTemplate 봄에서 그것을 사용하고 싶습니다.

해결법

  1. ==============================

    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. ==============================

    2.자바 트러스트 스토어에서 인증서를 가져와야한다.

    자바 트러스트 스토어에서 인증서를 가져와야한다.

    BTW pem 및 cer (t) 파일은 동일하며 확장자의 다른 이름입니다.

    추가 링크

  3. from https://stackoverflow.com/questions/33497874/resttemplate-with-pem-certificate by cc-by-sa and MIT license