在构建系统时,开发人员通常会忽略安全性方面。 安全一直是令人担忧的重要问题,但是它比以前吸引了更高的关注。 就在今年,我们发生了像Heartbleed Bug或CelebrityGate丑闻这样的案件。 这与帖子无关,只是安全真正重要的示例,我们应该意识到这一点。

随着REST服务的日益普及,有必要以某种方式确保这些安全。 几周前,我不得不将客户端与https后面的REST服务集成。 我以前从未做过,这就是这篇文章的原因。 我必须承认自己不是安全专家,所以如果我写任何愚蠢的文章,请纠正我。

设置

对于此示例,我使用了以下设置:

  • 具有SSL配置的 TomEE (或Tomcat )
  • 弹簧
  • Apache HTTP组件

我不会讨论有关SSL和TSL的许多详细信息,因此请在此处查看其他内容。 请注意,TLS是SSL演进的新名称。 有时两者之间会产生混淆,人们通常会说SSL,但使用的是TSL的最新版本。 记住这一点。

不要忘记按照下一页上的说明为Tomcat设置SSL: SSL Configuration HOW-TO 。 服务器需要向客户端提供一组凭据(证书),以保护服务器与客户端之间的连接。

编码

服务

让我们创建一个简单的Spring REST服务:

RestService.java

@Controller
@RequestMapping("/")
public class RestService {@RequestMapping(method = RequestMethod.GET)@ResponseBodypublic String get() {return "Called the get Rest Service";}
}

而且,我们还需要一些接线来使其工作:

RestConfig.java

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.radcortez.rest.ssl")
public class RestConfig {}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-appversion="3.1"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"><servlet><servlet-name>rest</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextClass</param-name><param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value></init-param><init-param><param-name>contextConfigLocation</param-name><param-value>com.radcortez.rest.ssl</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>rest</servlet-name><url-pattern>/</url-pattern></servlet-mapping><security-constraint><web-resource-collection><web-resource-name>Rest Application</web-resource-name><url-pattern>/*</url-pattern></web-resource-collection><user-data-constraint><!-- Needed for our application to respond to https requests --><transport-guarantee>CONFIDENTIAL</transport-guarantee></user-data-constraint></security-constraint>
</web-app>

请注意元素security-constraintuser-data-constraint<transport-guarantee>CONFIDENTIAL</transport-guarantee> 。 需要这些来指定应用程序需要安全连接。 选中“ 保护 Java应用程序的Web应用程序安全” 。

运行服务

只需使用您喜欢的IDE环境在TomEE服务器上部署应用程序,然后访问https://localhost:8443/ 。 您应该获得以下信息(您可能需要先接受服务器证书):

请注意,浏览器协议为https ,端口为8443 (假设您将默认设置保留在SSL Configuration HOW-TO中) 。

客户

现在,如果您尝试使用Java客户端调用此REST服务,则很可能将获得以下消息和Exception(或类似信息):

消息: GET请求“ https:// localhost:8443 /”上的I / O错误:sun.security.validator.ValidatorException:

异常: 以下原因 引起:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到到请求目标的有效证书路径

发生这种情况是因为正在运行的JDK没有针对您的服务器的有效证书。 您可以导入它,并解决该问题,但是让我们做一些更有趣的事情。 我们将以编程方式为受信任的密钥库提供服务器证书。

这在以下情况下特别有用:

  • 您正在将代码运行到多个环境中
  • 您不必每次都手动将证书导入JDK
  • 如果您升级JDK,则必须记住有关证书的信息
  • 由于某些奇怪的原因,您无权访问JDK本身来导入证书

让我们写一些代码:

RestClientConfig.java

@Configuration
@PropertySource("classpath:config.properties")
public class RestClientConfig {@Beanpublic RestOperations restOperations(ClientHttpRequestFactory clientHttpRequestFactory) throws Exception {return new RestTemplate(clientHttpRequestFactory);}@Beanpublic ClientHttpRequestFactory clientHttpRequestFactory(HttpClient httpClient) {return new HttpComponentsClientHttpRequestFactory(httpClient);}@Beanpublic HttpClient httpClient(@Value("${keystore.file}") String file,@Value("${keystore.pass}") String password) throws Exception {KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());FileInputStream instream = new FileInputStream(new File(file));try {trustStore.load(instream, password.toCharArray());} finally {instream.close();}SSLContext sslcontext =SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build();SSLConnectionSocketFactory sslsf =new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1.2"}, null,BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);return HttpClients.custom().setSSLSocketFactory(sslsf).build();}@Beanpublic static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {return new PropertySourcesPlaceholderConfigurer();}
}

在这里,我们使用Spring RestOperations接口,该接口指定了一组基本的RESTful操作。 接下来,我们使用Apache HTTP组件SSLConnectionSocketFactory ,它使我们能够根据可信证书列表来验证服务器的身份。 证书从KeyStore从服务器使用的同一文件中加载 。

RestServiceClientIT.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = RestClientConfig.class)
public class RestServiceClientIT {@Autowiredprivate RestOperations rest;@Testpublic void testRestRequest() throws Exception {ResponseEntity response = rest.getForEntity("https://localhost:8443/", String.class);System.out.println("response = " + response);System.out.println("response.getBody() = " + response.getBody());}
}

一个简单的测试类。 我们还需要一个具有密钥库文件位置和密码的属性文件:

config.properties

keystore.file=${user.home}/.keystore
keystore.pass=changeit

如果您使用了所有默认值,这应该可以正常工作。

运行测试

如果现在运行在Java客户端中调用REST服务的测试,则应获得以下输出:

响应<200 OK,调用了get Rest服务,{服务器= [Apache-土狼/1.1],缓存控制= [私有],到期时间= [星期四,1970年1月1日,周四,01:00:00 WET],内容类型= ,Content-Length = [27],Date = [Tue,2014年12月23日,格林尼治标准时间]]>

身体叫得到休息服务

结论

而已! 现在,您可以以安全的方式与客户端调用REST服务。 如果您希望将证书添加到JDK密钥库,请检查此文章 。

敬请期待与Java EE JAX-RS等效的等效产品。

资源资源

您可以从我的github仓库REST SSL克隆完整的工作副本。

翻译自: https://www.javacodegeeks.com/2014/12/ssl-tls-rest-server-client-with-spring-and-tomee.html

SSL / TLS REST服务器–带有Spring和TomEE的客户端相关推荐

  1. ssl/tls服务器瞬时_SSL / TLS REST服务器–带有Spring和TomEE的客户端

    ssl/tls服务器瞬时 在构建系统时,开发人员通常会忽略安全性方面. 安全一直是令人担忧的重要问题,但是它比以前吸引了更高的关注. 就在今年,我们发生了像Heartbleed Bug或Celebri ...

  2. 车联网通信安全之 SSL/TLS 协议

    前言 在汽车出行愈加智能化的今天,我们可以实现手机远程操控车辆解锁.启动通风.查看车辆周围影像,也可以通过 OTA(空中下载技术)完成升级车机固件.更新地图包等操作,自动驾驶技术更是可以让车辆根据路面 ...

  3. SSL/TLS单向认证和双向认证介绍

    为了便于理解SSL/TLS的单向认证和双向认证执行流程,这里先介绍一些术语. 1. 散列函数(Hash function):又称散列算法.哈希函数,是一种从任何一种数据中创建小的数字"指纹& ...

  4. SSL/TLS攻击介绍--重协商漏洞攻击

    一.概述 最近几年曝出的高风险SSL/TLS安全漏洞大多跟SSL实现库相关,比如2011年曝出的SSL/TLS默认重协商漏洞,可导致DOS攻击, 比如2014年4月曝出的"心脏滴血" ...

  5. 手工测试SSL/TLS的脆弱性

    该文章描绘了主要的SSL/TLS (mis)配置及简单的测试你系统的脆弱性.如下为已考虑到的配置和攻击相关的内容. SSLv2 Support SSLv3 Support Cipher Suites ...

  6. linux 允许ssl采用中强度加密_彻底搞清HTTPS安全通讯之SSL/TLS加密协议

    一. 简介 SSL(Secure Socket Layer 安全套接层),由网景在20世纪90年代开发的安全协议: 1995年Netscape发布SSL v2.0 1996年Netscape发布SSL ...

  7. HTTPS安全通讯 2. SSL/TLS加密协议

    HTTPS安全通讯 2. SSL/TLS加密协议 一. 概述 1. SSL 2. `OpenSSL` 3. `https` 4. 密钥协商算法 1.4.1 RSA算法 1.4.2 DH算法 5. 前向 ...

  8. 服务器SSL/TLS快速检测工具TLLSSLed

    服务器SSL/TLS快速检测工具TLLSSLed 现在SSL和TLS被广泛应用服务器的数据加密中,如网站的HTTPS服务.所以,在渗透测试中如何快速检测服务器的SSL和TLS配置寻找安全漏洞,就显得很 ...

  9. 服务器——SSL/TLS协议信息泄露漏洞(CVE-2016-2183)修复办法

    前言:近期某台Windows Server服务器的远程连接端口(3389)被扫出了SSL/TLS协议信息泄露漏洞(CVE-2016-2183),尝试了网上很多复制来复制去的"解决方法&quo ...

最新文章

  1. HR经理必须掌握的五原则
  2. BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)
  3. python如何计算分子描述符_Python——描述符(descriptor)解密
  4. Spring Integration关键案例与现实生活场景
  5. Workflow WF Reference Links for 2009-02-13
  6. 恶意攻击防范之信用卡业务的计数器反欺诈
  7. 06 is和==的区别 encode()编码 decode()解码
  8. word中替换方式处理多行文本为一段
  9. 5e检索服务器信息,服务器检索 - 找服玩|Minecraft服务器列表
  10. 基于深度信念网络的事件识别
  11. 计算机英语口语面试自我介绍,面试英文口语自我介绍(精选8篇)
  12. 【SQL数据库】数据库的创建、查询、插入等操作使用方法(结合黑皮书教材网站(db-book中的例子)在MySQL Workbench和shell中实现查询操作
  13. Android Studio4.0以上设置护眼背景色
  14. CSS transform属性的简单应用——双开门动画效果
  15. 【阿朱标红】华为新员工入职180天详细培训计划
  16. EMLOG采集插件 采集资源 小刀模板采集通用
  17. 【拆书】《深度工作》教你时间管理
  18. vue Error: No PostCSS Config found in
  19. Flowable 流程引擎系列文章导读
  20. 手把手 在windows10下安装配置anaconda

热门文章

  1. 三个水桶(看了三遍,想了五遍!)
  2. 用IDEA把SpringBoot项目打成jar发布项目 不要用 在上面有可以用的
  3. java 单例 生命周期_单例模式--- 声明周期托管方式
  4. 微信小程序父级之间的传值_微信小程序自定义组件封装及父子间组件传值的方法...
  5. 猜数字游戏 : 共给玩家10次机会,若第一次就猜对了,显示‘您真是个天才’,若10也没猜对,显示“您太笨了,下次努力吧!”, 若是第2-10次猜对了,只简单的显示:“恭喜您猜对了”。
  6. python3多线程第三方库_Python3 多线程
  7. tomcat(10)安全性
  8. jvm(2)-OutOfMemoryError 异常(内存溢出异常)
  9. Quartz定时任务的基本搭建
  10. Spring boot web(2):web综合开发