【问题标题】:Using .p12 file to execute request to rest server使用 .p12 文件执行对休息服务器的请求
【发布时间】:2019-09-24 13:15:02
【问题描述】:

我正在尝试向为我提供 .p12 文件的服务器执行请求,以便与其他服务建立安全连接,我正在执行以下操作以使用密钥设置 HttpClient:

SSLContext sslContext =SSLContextBuilder
                .create().loadKeyMaterial(ResourceUtils.getFile("classpath:keystore/file.p12"), "secret".toCharArray(), "secret".toCharArray())
                .build();

    return HttpClientBuilder
            .create()
            .setConnectionManager(connManager())
            .setSSLContext(sslContext)
            .setDefaultRequestConfig(requestConfig())
            .build();

当我使用 OAuth2RestOperations 执行请求时,我得到:

401 , Non existing certificate or invalid 

【问题讨论】:

    标签: java spring-boot oauth2resttemplate


    【解决方案1】:

    我认为这实际上是一个重复的问题。

    有关此问题Java HTTPS client certificate authentication,请参阅此answer

    【讨论】:

      【解决方案2】:

      在所有examples 中,您需要使用KeyStore 调用loadKeyMaterial 方法

       public SSLContextBuilder loadKeyMaterial(KeyStore keystore,
      

      使用文件路径加载keyStore,例如:

      keyStore = KeyStore.getInstance("PKCS12");
      FileInputStream inputStream = new FileInputStream(new File(certPath));
      keyStore.load(inputStream, certPassword.toCharArray());
      

      【讨论】:

        【解决方案3】:

        我最近也有类似的要求。这是我使用的代码:

            KeyStore clientStore = KeyStore.getInstance("PKCS12");
            try {
                clientStore.load(ResourceUtils.getFile("classpath:keystore/file.p12"), "secret".toCharArray());
            } catch (IOException e) {
                //handle exception
            }
        
            KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            kmf.init(clientStore, "secret".toCharArray());
            KeyManager[] kms = kmf.getKeyManagers();
        
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(kms, null, new SecureRandom());
        
            SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext);
        
            HttpClientBuilder builder = HttpClientBuilder.create();
            return builder.setSSLSocketFactory(socketFactory).build();
        

        【讨论】:

        • 您是否在计算机中配置了某些内容?我测试了相同的代码,它不起作用,我正在检查请求中包含的 CN 信息,我看不到密钥的信息。好像没有在本地获取密钥
        猜你喜欢
        • 2012-08-28
        • 1970-01-01
        • 2013-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-02
        • 1970-01-01
        相关资源
        最近更新 更多