- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章RestTemplate添加HTTPS证书全过程解析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
先通过浏览器将未签名验证的证书保存到本地, 点击 不安全–> 证书–> 详细信息 --> 复制到文件 然后默认选择 起一个文件名 , 保存即可, 比如我将证书保存在了桌面 , 命名为 xx.cer 。
若是想要在项目中用到证书 , 需要先将证书导入到JDK的证书管理里面, 导入命令如下:
keytool -import -noprompt -trustcacerts -alias xx -keystore /home/oracle/jdk1.8.0_181/jre/lib/security/cacerts -file xx.cer 。
对上面的命令做一个解释 此命令是在linux服务器内执行的 , 在执行这个命令的时候就在证书所在的文件夹下打开终端, 然后命名一下别名 , 别名最好和证书名称一致 , 如上, 都叫xx , 另外将上面命令中的JDK路径换成你的实际路径即可 。
上面命令输入完毕后回车 , 会让你写密码啥的 , 就写 changeit 若是changeit不行就写 changeme 一般的 chageit 就可以了 。
只将证书导入JDK就可以了吗? 我这里验证的是不可以的, 必须还要生成对应的 keystore文件 。
keystore文件生成命令: keytool -import -file xx.cer -keystore xx.keystore 。
对上面的命令做一个解释 , 该命令也是在linux下执行的 ,当然windows下也可以的 , 执行的时候也是在证书所在文件夹进行的 , 若是提示权限不够 那就再加sudo , windows就以管理员的身份执行 。
回车后又会让你输入密码 , 那么就还对应着输入 chageit 即可 。
执行完毕后会在当前路径下再产生一个xx.keystore文件 。
将上面上传的xx.keystore 文件文件复制到你的项目的类路径下 。
将下面的这个restTemplate的配置复制到你的项目中去,其中里面用到了一个httpConverter 这个是做json格式转换的, 和HTTPS没太大关系 , 若是不需要就将它以及相关代码删掉即可 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
package
com.abc.air.config;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.InputStream;
import
java.security.KeyManagementException;
import
java.security.KeyStore;
import
java.security.KeyStoreException;
import
java.security.NoSuchAlgorithmException;
import
java.security.cert.X509Certificate;
import
java.util.ArrayList;
import
java.util.List;
import
org.apache.http.config.Registry;
import
org.apache.http.config.RegistryBuilder;
import
org.apache.http.conn.socket.ConnectionSocketFactory;
import
org.apache.http.conn.socket.PlainConnectionSocketFactory;
import
org.apache.http.conn.ssl.NoopHostnameVerifier;
import
org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import
org.apache.http.impl.client.CloseableHttpClient;
import
org.apache.http.impl.client.HttpClients;
import
org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import
org.apache.http.ssl.SSLContextBuilder;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.context.annotation.Bean;
import
org.springframework.context.annotation.Configuration;
import
org.springframework.core.io.ClassPathResource;
import
org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import
org.springframework.http.converter.HttpMessageConverter;
import
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import
org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;
import
org.springframework.web.client.RestTemplate;
import
com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
/**
* Created by ZhaoTengchao on 2019/4/12.
*/
@Configuration
public
class
RestTemplateConfig {
@Autowired
private
FastJsonHttpMessageConverter httpMessageConverter;
@Bean
RestTemplate restTemplate()
throws
Exception {
HttpComponentsClientHttpRequestFactory factory =
new
HttpComponentsClientHttpRequestFactory();
factory.setConnectionRequestTimeout(
5
*
60
*
1000
);
factory.setConnectTimeout(
5
*
60
*
1000
);
factory.setReadTimeout(
5
*
60
*
1000
);
// https
SSLContextBuilder builder =
new
SSLContextBuilder();
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
ClassPathResource resource =
new
ClassPathResource(
"nonghang.keystore"
);
InputStream inputStream = resource.getInputStream();
keyStore.load(inputStream,
null
);
SSLConnectionSocketFactory socketFactory =
new
SSLConnectionSocketFactory(builder.build(), NoopHostnameVerifier.INSTANCE);
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register(
"http"
,
new
PlainConnectionSocketFactory())
.register(
"https"
, socketFactory).build();
PoolingHttpClientConnectionManager phccm =
new
PoolingHttpClientConnectionManager(registry);
phccm.setMaxTotal(
200
);
CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).setConnectionManager(phccm).setConnectionManagerShared(
true
).build();
factory.setHttpClient(httpClient);
RestTemplate restTemplate =
new
RestTemplate(factory);
List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
ArrayList<HttpMessageConverter<?>> convertersValid =
new
ArrayList<>();
for
(HttpMessageConverter<?> converter : converters) {
if
(converter
instanceof
MappingJackson2HttpMessageConverter ||
converter
instanceof
MappingJackson2XmlHttpMessageConverter) {
continue
;
}
convertersValid.add(converter);
}
convertersValid.add(httpMessageConverter);
restTemplate.setMessageConverters(convertersValid);
inputStream.close();
return
restTemplate;
}
}
|
到此配置完毕! 。
本文简述一下怎么使用restTemplate来访问https.
1
2
3
4
5
|
<
dependency
>
<
groupId
>org.apache.httpcomponents</
groupId
>
<
artifactId
>httpclient</
artifactId
>
<
version
>4.5.3</
version
>
</
dependency
>
|
这里使用httpclient的factory 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Bean
public
RestTemplate restTemplate()
throws
KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) ->
true
;
SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
.loadTrustMaterial(
null
, acceptingTrustStrategy)
.build();
SSLConnectionSocketFactory csf =
new
SSLConnectionSocketFactory(sslContext);
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(csf)
.build();
HttpComponentsClientHttpRequestFactory requestFactory =
new
HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
RestTemplate restTemplate =
new
RestTemplate(requestFactory);
return
restTemplate;
}
|
1
2
3
4
5
6
|
@Test
public
void
testHttps(){
String url =
"https://free-api.heweather.com/v5/forecast?city=CN101080101&key=5c043b56de9f4371b0c7f8bee8f5b75e"
;
String resp = restTemplate.getForObject(url, String.
class
);
System.out.println(resp);
}
|
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/fengbird/article/details/89462295 。
最后此篇关于RestTemplate添加HTTPS证书全过程解析的文章就讲到这里了,如果你想了解更多关于RestTemplate添加HTTPS证书全过程解析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我编写了以下代码来测试同步 RestTemplate 和 AsyncRestTemplate 的性能。我只是在 POSTMAN 上手动运行了几次。 我们只是将 10 个引用传递给 GET 调用,以便我
这种方式创建RestTemplate有什么区别 RestTemplate restTemplate = restTemplateBuilder .setConnectT
这个问题已经有答案了: IllegalArgumentException: Not enough variable values available with RestTemplate? (2 个回答
这是我的应用程序的主类 @SpringBootApplication (scanBasePackages = { "com.xyz.*" }) @EnableAsync @EnableAspectJA
我当前的代码: RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new
我将开发一个简单的 Spring MVC Web 应用程序,它将使用 Heroku 上的远程 RESTful 服务。 我希望 MVC Web 应用程序根据 Controller 调用 REST 服务。
项目场景: Spring 的 RestTemplate 是一个健壮的、流行的基于 Java 的 Http客户端。 RestTemplate实现request param参数传送,如果如下所示,直接传一
我想通过 RestTemplate 发送请求。但是我的网址有大括号('{','}'),因此我有异常(exception):“没有足够的变量值可用于扩展......”。 我尝试通过 uri UriCom
有一个 RestFull 方法返回一个菜单对象列表 public ResponseEntity> getMenus() { .. } 但我不知道如何从 RestTemplate 中获取它们,从 Res
摘要: RestTemplate与REST资源交互的方法涵盖了HTTP请求方法,包括get, post, put, delete。 本文分享自华为云社区《Springboot RestTemplate
我有一个 springboot 休息服务 A 使用 restTemplate 调用休息服务 B。休息服务 A 的 restTemplate bean 创建如下,超时设置如下面的代码片段所示。 @Bea
我有一个 @Service有几种方法,每种方法使用不同的 web api。每个调用都应该有一个自定义的读取超时。 拥有一个 RestTemplate 实例并在每个方法中通过工厂更改超时是否是线程安全的
这是我的休息模板配置, @Bean @Qualifier("myRestService") public RestTemplate createRestTemplate(@Va
是否可以使用 RestTemplateBuilder 创建仅带有不记名 header 和 token 的 RestTemplate 实例? 我知道我可以使用 RestTemplate 交换并在 Htt
我正在尝试对请求正文执行 DELETE,但我不断收到 400(错误请求)错误。当我在 swagger/postman 中这样做时,它成功地删除了记录。但是从 Java 代码我不能这样做 外部 API
我需要创建 RestTemplate 请求,它将发送图像以通过 PHP 应用程序上传。 我的代码是: Resource resource = new FileSystemResource("/User
我正在使用 swagger codegen ( on this Zoura swagger ) 创建 Java/rest 模板客户端。我正在使用 swagger Gradle 插件: id "org.
我有Restful API,当找不到某个项目时会响应404错误,但是根据未找到该项目的原因(未知,不可用等),会有不同的消息,可以使用Spring MVC通过以下方式完成: response.send
我正在使用 Spring 中的 RestTemplate 来查询搜索服务。我在进行正确的序列化方面遇到了一些困难。如果我使用此方法,restTemplate 将返回一个列表。我不明白如何传递参数化类型
我们有这样的代码,它使用 OData 来指定资源(为简单起见,在此处使用公司代码进行硬编码): String uri = "[my_endpoint]/companyprofiles.read?$fi
我是一名优秀的程序员,十分优秀!