当前位置: 首页 > 面试题库 >

具有pem证书的RestTemplate

席兴平
2023-03-14
问题内容

我有带私钥和服务器证书的pem证书。我可以使用curl执行它,一切正常。

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

但是我想将其与Java一起使用,最可取的是从Spring开始的RestTemplate。


问题答案:

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

必须完成的步骤:

  1. 使用keytool或portecle将服务器证书添加到trustStore。当您要使用自定义信任关系时,请使用此脚本

  2. 接下来,将ssl配置为RestTemplate。可以像下面这样完成:

        @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));
     }

最后,您可以使用注入restTemplate连接到url。



 类似资料:
  • 我有带有私钥和服务器证书的pem证书。我可以使用curl执行它,所有的工作都可以。 但是我想把它和java一起使用,最好是来自Spring的RestTemplate。

  • 我想为我的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看起来像这样: } 该应用程序具有