RestTemplete调用HttpsAPI报错和解决

556 阅读2分钟

最近项目做一个策略联动,说白了就是调用某系统的API接口,根据基线分析的结果,调用响应的API改变响应策略.

接口测试

首先拿到API文档后,使用postman进行了接口的简单测试,调用没问题

技术选型

查了下SpringBoot中调用RestAPI的技术选型,有

  1. Apache HttpClient
  2. Feign
  3. RestTemplate

这里因为RestTemplate集成在spring-boot-starter-web中,我们要做的就两件事,第一件是添加@Configration配置类,第二件事是@Autowired注入到我们使用的Bean中(这里详细注册类和RestTemplate再写一篇//TODO,这里重点是报错)

报错记录

发现我们在使用restTemplate.getForObject()方法时,报错unable to find valid certification path to requested target,即找不到证书,而在postman中是接受了证书所以可以调用,于是我们参考这篇文章 彻底解决unable to find valid certification path to requested target,采用chrome中下载证书,在使用keytool导入的方式,这里面唯一注意点就是Mac中使用sudo,Win中用管理员权限去修改,否则会报错Permission Deny

导入证书之后

导入证书之后,果然~又换了个错,哈哈,有效果就好,第二次报错为No subject alternative names present,经查询本错是因为HTTPS限制应使用域名方式调用,而开发测试环境中用的是IP,于是换个思路,不在这里纠结,那么既然是测试环境,生产环境会使用域名.

那么我们只要绕过SSL验证即可,使用KEYTOOL将导入的证书删除(不用它了,以免捣乱),参考 No subject alternative names present一文,核心点是使我们的RestTemplate在测试环境下绕过SSL验证,实现API调用.

 @Override
            public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                return true;
            }

总是返回TRUE,来绕过SSL握手这一步.

最终解决问题,可以成功调用.

待完善的知识点,HTTPS,RestTemplate各API使用