当前位置: 首页 > 知识库问答 >
问题:

具有pem证书的RestTemplate

纪辰沛
2023-03-14

我有带有私钥和服务器证书的pem证书。我可以使用curl执行它,所有的工作都可以。

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

但是我想把它和java一起使用,最好是来自Spring的RestTemplate。

共有1个答案

岳志义
2023-03-14

因此,有关将pem证书与RestTemplate一起使用的知识被分散了。

必须采取的步骤:

>

  • 使用keytool或portecle将服务器证书添加到trustStore。当您想要使用自定义信任时,请使用以下脚本

    @Configuration
    public class SSLConfiguration {
    
    @Value("${certificate.name}")
    private String name;
    
    @Bean(name = "sslContext")
    public SSLContext sslContext() throws Exception {
      Security.addProvider(new BouncyCastleProvider());
      return SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).useTLS().build();
    }
    
    @Bean(name = "sslSocketFactory")
    public SSLSocketFactory sslSocketFactory() throws Exception {
    
      return new ConnectionFactoryCreator(name, sslContext()).getSocketFactory();
    
    }
    
    @Bean(name = "httpClient")
    public HttpClient httpClient() throws Exception {
      return HttpClientBuilder.create().setSslcontext(sslContext())
            .setSSLSocketFactory(new SSLConnectionSocketFactory(sslSocketFactory(), new AllowAllHostnameVerifier()))
            .build();
    }
    
    @Bean
    public ClientHttpRequestFactory httpClientRequestFactory() throws Exception {
      return new HttpComponentsClientHttpRequestFactory(httpClient());
    }
    
    @Bean
    public RestTemplate restTemplate() throws Exception {
      return new RestTemplate(httpClientRequestFactory());
     }
    
    }
    
    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));
     }
    

  •  类似资料:
    • 问题内容: 我有带私钥和服务器证书的pem证书。我可以使用curl执行它,一切正常。 但是我想将其与Java一起使用,最可取的是从Spring开始的RestTemplate。 问题答案: 因此,将有关与RestTemplate一起使用pem证书的知识分散了。 必须完成的步骤: 使用keytool或portecle将服务器证书添加到trustStore。当您要使用自定义信任关系时,请使用此脚本 接下

    • 我想为我的REST API使用TLS,我计划为它创建自签名证书,并为我的restapi的客户端提供公钥。 我的restapi部署在tomcat catalina容器(tomcat版本8.0.42)上。 我的测试步骤如下, 服务器端 1) 我使用openssl创建了一个自签名证书 2) 已创建bundle 3) 然后将tomcat配置为启用TLS(keystoreType为“PKCS12”),并启动

    • 感谢你的帮助...

    • 问题内容: 如何使用多个域的ListenAndServeTLS?我看到该函数接受证书和密钥文件,但是我相信密钥文件可能只包含一个私钥。我有一些私钥,用于不同的证书链。 问题答案: 旨在提供一种基本的最小配置。如果您想添加其他选项,则可以使用custom 创建一个。然后,您可以在中手动映射名称,也可以调用以编程方式构建地图。 但是,您仍然可以使用,因为它将加载配置文件中的证书以及通过args方法传入

    • 我有一个带有这些命令的自签名证书链,并在Apache服务器上配置了它们 但是当我尝试 我从openssl中得到一个错误 用于生成证书的命令或配置文件有问题吗? [req] distinguished_name=req_distinguished_name x509_extensions=v3_ca dirstring_type=nobmp [req_distinguished_name] comm

    • 问题内容: 我正在慢慢地疯狂尝试配置Spring Security 3.0.0以保护应用程序。 我已将服务器(码头)配置为要求客户端身份验证(使用智能卡)。但是,我似乎无法正确获得applicationContext- security.xml和UserDetailsS​​ervice实现。 首先,从应用程序上下文文件中: UserDetailsS​​ervice看起来像这样: } 该应用程序具有