首页 > 编程语言 >Java调用python服务接口https遇到证书问题的具体解决

Java调用python服务接口https遇到证书问题的具体解决

时间:2024-03-20 16:24:16浏览次数:27  
标签:info Java log 证书 python getClientHttpRequestFactory https 服务器

是这样的,大概前一段时间做过一个业务,一直没有记录下来

就是我们的算法部,封装好了一系列的算法,然后是python写的。而我们需要用Java去调用他们的方法。

如何处理这个问题呢

就是我在python里面写了一个rest-api,暴露出几个接口,供Java这边调。

但是不知道为什么算法部当时那边弄了个什么,导致暴露出的接口是https的

而Java通过restTemplate调https就会有证书问题,而最开始python工程下有三个证书,我是一头雾水。

位置是在python工程下的config的certificate。

下面有三个证书文件,一个是ca.crt,一个是pkcs8_server.key,还有一个是server.crt。

时间过得有点久,忘记这三个证书的区别了。

1. ca.crt:是证书颁发机构(CA)的根证书,用于验证服务器证书的真实性。客户端会使用它来验证服务器证书是否由受信任的证书颁发机构签发。

2. pkcs8_server.key:是服务器的私钥,用于加密和解密TLS/SSL握手消息中的数据。它应该是安全的,并且只有服务器才能访问它。

3. server.crt:是服务器的公钥证书,用于验证服务器的身份。它包含了服务器的公钥以及一些其他信息,如服务器的域名等。

最开始我以为这三个证书都要用,然后用pk12生成了一个,应该是要去linux环境下通过OpenSSL做,这种方法是行得通的

生成了的一个pk12证书是放在Java工程下,然后去使用这个证书,要配置私钥的。

后来同事说应该是不需要配私钥的,让我找找不用私钥的做法。

我后来找到了另外一种解决方案,其实只需要ca.crt就可以了。

 

简单说一下如何做的吧

使用方法

@Resource
private RestClient restClient;
RestTemplate restTemplate = SpringBeanContextUtil.getBean(RestClient.class).getRestTemplate();

配置

/**
 * RestClient配置python证书,用于调https接口
 */
@Component
@Slf4j
public class RestClient {
    private RestTemplate restTemplate;

    public RestTemplate getRestTemplate() {
        if (restTemplate == null) {
            this.restTemplate = new RestTemplate(getClientHttpRequestFactory());
        }
        return this.restTemplate;
    }

    private ClientHttpRequestFactory getClientHttpRequestFactory() {
        // 加载证书
        try (InputStream inputStream = getClass().getResourceAsStream("/cert/ca.crt")) {
            log.info("getClientHttpRequestFactory, load X.509");
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            X509Certificate caCert = (X509Certificate) cf.generateCertificate(inputStream);
            log.info("getClientHttpRequestFactory, caCert = {}", caCert);
            // 加载证书到 KeyStore
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(null, null);
            keyStore.setCertificateEntry("caCert", caCert);
            log.info("getClientHttpRequestFactory -> setCertificateEntry");

            // 创建 SSLContext
            SSLContext sslContext = SSLContextBuilder.create().loadTrustMaterial(keyStore, null).build();
            log.info("getClientHttpRequestFactory -> sslContext");

            // 创建 RestTemplate
            SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext,
                new String[] {"TLSv1.2"}, null, new NoopHostnameVerifier());
            log.info("getClientHttpRequestFactory -> socketFactory");
            HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build();
            log.info("getClientHttpRequestFactory -> httpClient");
            HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
            log.info("getClientHttpRequestFactory -> factory");
            factory.setConnectTimeout(5000);
            factory.setReadTimeout(5000);
            return factory;
        } catch (IOException | CertificateException | KeyStoreException | NoSuchAlgorithmException | KeyManagementException ex) {
            log.error("getClientHttpRequestFactory", ex);
            throw new BaseException(ErrorCode.SYSTEM_EXCEPTION);
        }
    }
}

  

标签:info,Java,log,证书,python,getClientHttpRequestFactory,https,服务器
From: https://www.cnblogs.com/immersed-in-the-deep-sea/p/18085418

相关文章

  • 分享自写的一个通用java应用启停脚本
    ##原创转载请标注来源#!/bin/sh#定义程序名及jar包的名(写上你自己的jar包)PROJECT_NAME=/home/xtgl/a/release-1.0.jarFILEPATH=/home/xtgldate=`date+%Y-%m-%d-%H-%M-`##编写判断程序是否正在运行的方法isExist(){......
  • 02 JAVA流程控制
    02JAVA流程控制1.用户交互Scannernextline()用的多,next()用的少。nextline()以回车为结束符。也就是说:nextline方法返回的是回车之前的所有字符。可以获得空白。packagecom.mysoft.scanner;importjava.util.Scanner;publicclassDemo02{publicstaticvoidmain......
  • 【python】Python实现梯度下降算法
    (文末包含完整代码)导入需要的包importnumpyasnpimportmatplotlib.pyplotasplt定义函数defget_y(x):y=x**2+x*2+1returny计算梯度defget_gradient(x):getgradient=2*x+2returngetgradient采用梯度下降计算函数最小值时自......
  • Python就该这样学,纯小白速通Python!学习大纲整理,建议保存
    一、学习建议1、找到自己感兴趣的方向,并且结合市场需求进行选择Python的应用范围测试运维web人工智能大数据爬虫及数据分析办公自动化2、学习过程中一定要勤加练习,并且尝试去使用学习过的内容实现一些简答的功能遇到技术问题不要慌,解决问题的过程也是加速自己成长的途......
  • 一个入门级python爬虫教程详解
    前言当你需要每天对Excel做大量重复的操作,如果只靠人工来做既浪费时间,又十分枯燥,好在Python为我们提供了许多操作Excel的模块,能够让我们从繁琐的工作中腾出双手。今天就和大家分享一个快速处理Excel的模块openpyxl,它的功能相对与其他模块更为齐全,足够应对日常出......
  • 人人都想自学Python,为什么坚持下来的没几个?
    随着云计算/自动化/人工智能的时代来临,Python语言也成为了当下最热门的语言之一。有的人开始自学,有的人通过面对面授课学习,也有一些人浅尝辄止。那么,为什么有一大批人最终停止在学Python的道路上呢?最后,如果大家如果在自学遇到困难,想找一个Python学习环境,可以加入我们的Py......
  • javaday3
    javaday3变量publicclassDemo06{publicstaticvoidmain(String[]args){inta=1;Stringname="xiangqian";charx='X';doublepi=3.14;}}publicclassDemo07{//类变量staticsta......
  • Linux环境运行python项目提示No module named '_ssl'
    版本python3.11.4控制台错误提醒File"/usr/local/python3/lib/python3.11/ssl.py",line100,in<module> import_ssl#ifwecan'timportit,lettheerrorpropagate ^^^^^^^^^^^ModuleNotFoundError:Nomodulenamed'_ssl'错误原因:ce......
  • java社区人员疫情信息管理系统(ssm框架毕业设计)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着全球化进程的加速,人类活动频繁,疫情的传播速度和范围也日益扩大。社区作为疫情防控的第一线,其信息管理的重要性不言而喻。然而,传统的社区疫情信息管理......
  • Python修炼秘籍--Python数值类型(Day3)
    数值类型(Day3)一、数字类型1、整数:int2、布尔值:bool3、浮点数:float4、复数:complex5、数值运算符二、数字类型转换1、整数转换函数2、浮点数转换函数3、eval(‘x’)函数三、常用数学函数1、pow(x,y)1、pow(x,y,z)2、max(arg1,arg2,…)3、min(arg1,arg2,…)4、divmod(x,......