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

ssl/tls服务器瞬时

在构建系统时,开发人员通常会忽略安全性方面。 安全一直是令人担忧的重要问题,但是它比以前吸引了更高的关注。 就在今年,我们发生了像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-Coyote / 1.1],缓存控制= [私有],到期时间= [星期四,1970年1月1日,周四,01:00:00 WET],内容类型= ,Content-Length = [27],Date = [Tue,2014年12月23日01:29:20 GMT]}>

身体叫得到休息服务

结论

而已! 现在,您可以以安全的方式与客户端调用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服务器瞬时

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux kvm百度云,容器与云|如何在 Ubuntu Linux 上使用 KVM 云镜像

如何下载并使用运行在 Ubuntu Linux 服务器上的 KVM 云镜像&#xff1f;如何在 Ubuntu Linux 16.04 LTS 服务器上无需完整安装即可创建虚拟机&#xff1f;如何在 Ubuntu Linux 上使用 KVM 云镜像&#xff1f;基于内核的虚拟机(KVM)是 Linux 内核的虚拟化模块&#xff0c;可将其…

C 的16个大坑,你能躲过几个?

首先说下C 和C语言有什么区别&#xff1f;分享一个我在知乎上看见的回答&#xff1a;C ≈ C with classes&#xff0c; C with STLC&#xff1a;面向机器编程C &#xff1a;面向编译器编程C 有个很重要的特性叫RAII&#xff0c;个人认为可以多多使用&#xff0c;相当方便。言归…

python占位符怎么输入_python占位符怎么输入

占位符&#xff0c;顾名思义就是插在输出里站位的符号。占位符是绝大部分编程语言都存在的语法&#xff0c; 而且大部分都是相通的&#xff0c; 它是一种非常常用的字符串格式化的方式。1、常用占位符的含义s : 获取传入对象的__str__方法的返回值&#xff0c;并将其格式化到指…

java 性能调优_Java性能调优调查结果(第三部分)

java 性能调优这是本系列文章的第三篇&#xff0c;我们将分析2014年10月进行的调查的结果。如果您尚未这样做&#xff0c;我建议从本系列的前两篇文章开始&#xff1a; 问题严重性分析和监视域分析 。 这篇文章着重于故障排除/根本原因检测。 本调查部分的背景&#xff1a;意识…

不懂指针类型,7个例子给你讲明白

1. int va;这是一个整型变量&#xff0c;32位CPU的话&#xff0c;占有32个bite2. int *va;这是一个整型指针变量&#xff0c;用于存放一个整型变量的地址&#xff0c;3. int **va;这是一个整型的二级指针&#xff0c;用于存放一个内存的地址&#xff0c;该地址对应的内存中存放…

linux ffmpeg yum源,ffmpeg最新的yum源地址及视频去logo

一&#xff1a;ffmpeg 最新yum源cat /etc/yum.repo.d/atrpms.repo[atrpms]nameRed Hat Enterprise Linux $releasever - $basearch - ATrpmsfailovermethodprioritybaseurlhttp://dl.atrpms.net/el$releasever-$basearch/atrpms/stableenabled1gpgcheck0gpgkeyfile:///etc/pki/…

Tomcat与Netty比较

Tomcat介绍Tomcat支持的协议Tomcat的优缺点Netty介绍Netty支持的协议Netty的优点和缺点Tomcat和Netty的区别Tomcat和Netty的应用场Tomcat和Netty来处理大规模并发连接的优化Tomcat与Netty的网络模型的区别Tomcat与Netty架构设计拓展 Tomcat介绍 Tomcat是一个免费的、开放源代码…

spring 项目集成配置_Spring重试–与项目集成的方式

spring 项目集成配置如果您需要在代码中实现健壮的重试逻辑&#xff0c;一种行之有效的方法是使用spring重试库。 我的目的不是要展示如何使用spring retry项目本身&#xff0c;而是要演示将其集成到代码库中的不同方式。 考虑一种服务来调用外部系统&#xff1a; package re…

redis 内存不足 排查_排查redis占用内存达90%以上

帮别人排查一个问题,项目还没上线但redis占用内存很高。思路如下&#xff1a;1、登陆redis控制台&#xff0c;首先用 keys * 获取所有的key> keys *x:x:ax:x:bx:x:c发现key也就十来个&#xff0c;用 TYPE x:x:a 发现a是一个list数据类型用lrange命令查看list中指定索引的值用…

C或C 如何通过程序执行shell命令并获取命令执行结果?

1 应用场景最近在实际程序开发中&#xff0c;需要通过程序执行 shell 命令&#xff0c;并获取命令输出内容。但是系统自带的 system 只能返回命令执行成功与否&#xff0c;不能捕获命令输出。2 扩展性由于应用场景本就广泛&#xff0c;因此扩展性较好。此函数可以执行任意命令&…

linux centos7安装ngix,centos7 环境下安装nginx--Linux

本文将要为您介绍的是centos7 环境下安装nginx--Linux,具体完成步骤:一、安装前需要的编译环境准备1、安装makeyum install -y gcc automake autoconf libtool make2、安装gcc、gcc-cyum install -y gcc gcc-c3、关闭防火墙iptables -F4、关闭selinux#临时关闭&#xff1a;sete…

16进制数组转成10进制 qt_QT 十六进制字符串转化为十六进制编码

/*************************************************Function: hexStringtoByteArray()Description:十六进制字串转化为十六进制编码Calls: formatString()Called By:Input: hex->待转化的十六进制字串Output: NULLReturn: QByteArrayOthers: NULL************************…

primefaces_使用PrimeFaces开发数据导出实用程序

primefaces我的日常工作涉及大量使用数据。 我们使用关系数据库来存储所有内容&#xff0c;因为我们依赖于企业级的数据管理。 有时&#xff0c;具有将数据提取为简单格式&#xff08;例如电子表格&#xff09;的功能很有用&#xff0c;以便我们可以按需进行操作。 这篇文章概述…

如何优雅地实现判断一个值是否在一个集合中?

如何判断某变量是否在某个集合中&#xff1f;注意&#xff0c;这里的集合可能并不是指确定的常量&#xff0c;也可能是变量。版本0#include int main(){int a 5;if(a 1 || a 2 || a 3 || a 4 || a 5){std::cout<<"find it"<<std::endl;}return 0;…

c语言所有关键字作用,void_C语言void关键字详解

void类型修饰符(type specifier)表示“没有值可以获得”。因此&#xff0c;不可以采用这个类型声明变量或常量。void 类型可以用于下面各小节所描述的目的。void用于函数声明没有返回值的函数&#xff0c;其类型为 void。例如&#xff0c;标准库函数 perror() 被声明为以下原型…

jvmti_拥有您的堆:使用JVMTI迭代类实例

jvmti今天&#xff0c;我想谈一谈我们大多数人每天都不会看到和使用的另一种Java&#xff0c;更确切地说&#xff0c;是有关较低级别的绑定&#xff0c;一些本机代码以及如何执行一些小的魔术。 尽管我们不会在JVM上找到真正的魔力源&#xff0c;但是在单个帖子的范围内可以实现…

babylonjs 分部加载模型_BabylonJS加载OBJ或STL模型文件实例

JavaScript语言&#xff1a;JaveScriptBabelCoffeeScript确定var canvas document.getElementById("renderCanvas");var engine new BABYLON.Engine(canvas, true);var createScene function() {// This creates a basic Babylon Scene object (non-mesh)var scen…

骚操作:利用强弱符号制作插件库

当有强符号和弱符号时&#xff0c;选择使用强符号那么我们正可以利用这个原则做以下事情&#xff1a;定义为弱符号&#xff0c;如果是弱符号&#xff0c;使用默认行为如果链接了库&#xff0c;是强符号&#xff0c;则使用外部定义行为以此来实现一个类似插件的功能。通俗一点说…

c语言里 t是什么作用,c语言里的\t是什么意思

c语言里的&#xff3c;t是什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;c语言里的&#xff3c;t是什么意思正宗叫法是“水平制表符”&#xff0c;就是在输出媒体上水平跳过多个空格…

boot jersey_Jersey和Spring Boot入门

boot jersey除了许多新功能&#xff0c;Spring Boot 1.2还带来了Jersey支持。 这是吸引喜欢标准方法的开发人员的重要一步&#xff0c;因为他们现在可以使用JAX-RS规范构建RESTful API&#xff0c;并将其轻松部署到Tomcat或任何其他Springs Boot支持的容器中。 带有Spring平台的…