2017 年起 app store 要求 app 对接的服务器支持 TLS v1.2,否则 ats 检测不予通过。有点强制推 TLS v1.2 的意味。本文介绍如何使 tomcat 强制执行 TLS v1.2、完全正向加密。本文示例 tomcat 版本 7.0.68,jdk 版本 1.7.0。
笔者强烈推荐在 DNS 解析层或反向代理服务层做这件事情,不建议放在 tomcat 这一层做。如果你非要在 tomcat 这层做,可以参考本文的做法。
首先声明,tomcat 7 以后能够通过 JSSE 支持 TLSv1、TLSv1.1、TLSv1.2。也能支持 ATS 所要求的那些正向签字算法,但是 ATS 要求只能支持这些正向签字算法,一些安全级别较弱的算法不能够支持,也就是完全正向加密。总之,本文要做的事情就是禁用 TLSv1、TLSv1.1,禁用非正向加密的弱签字算法。

1. Tomcat 强制完全 TLS v1.2

JDK 1.7 以上的 JSSE 才能支持到 TLS v1.2。

1.1. ssl 证书迁移到 tomcat

1.1.1. 联系证书颁发公司,转换为 jks 后缀格式

对方技术支持会返回 keystore.jks 证书文件及其密码证书密码。

1.1.2. 将证书文件放在 %tomcat%/conf/ 目录

1.1.3. 证书 tomcat 配置

将 %tomcat%/conf/server.xml 中的以下注释部分取消注释:

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />

然后向该 Connector 标签添加证书相关参数:
keystoreFile="conf/keystore.jks" keystorePass="证书密码"

1.2. 配置 tomcat 支持 TLSv1.2

1.2.1. jvm 支持

编辑 %tomcat%/bin/catalina.sh(或 bat),在文件内容前添加:
set JAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2" -Dsun.security.ssl.allowUnsafeRenegotiation=false -Dhttps.protocols="TLSv1.2"

1.2.2.tomcat 配置

在上述 Connector 标签添加以下参数:
sslEnabledProtocols="TLSv1.2"

1.3. 完全 TLS v1.2 的检测

1.3.1. tomcat 启动时的验证

我们在启动 tomcat 的时候可以看到配置的 JAVA_OPTS 相关日志:
一月 11, 2017 11:29:36 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Command line argument: -Djdk.tls.client.protocols=TLSv1.2
一月 11, 2017 11:29:36 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Command line argument: -Dsun.security.ssl.allowUnsafeRenegotiation=false
一月 11, 2017 11:29:36 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Command line argument: -Dhttps.protocols=TLSv1.2

1.3.2. openssl 命令行工具

我们先看看 TLSv1.1 协议是否已禁用:
C:\tools\OpenSSL-Win32\bin>openssl s_client -connect localhost:8443 -tls1_1
CONNECTED(000000D0)
3252:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:ssl\record\rec_layer_s3.c:1394:SSL alert number 40
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 102 bytes
握手失败,TLSv1.1 协议是否已禁用。再来看看 TLSv1.2:
C:\tools\OpenSSL-Win32\bin>openssl s_client -connect localhost:8443 -tls1_2
CONNECTED(000000D0)
depth=0 C = cn, ST = sh, L = sh, O = kdf, OU = kdf, CN = defonds kong
verify error:num=18:self signed certificate
verify return:1
depth=0 C = cn, ST = sh, L = sh, O = kdf, OU = kdf, CN = defonds kong
verify return:1
---
Certificate chain
 0 s:/C=cn/ST=sh/L=sh/O=kdf/OU=kdf/CN=defonds kong
   i:/C=cn/ST=sh/L=sh/O=kdf/OU=kdf/CN=defonds kong
---
Server certificate
-----BEGIN CERTIFICATE-----
(略)
-----END CERTIFICATE-----
subject=/C=cn/ST=sh/L=sh/O=kdf/OU=kdf/CN=defonds kong
issuer=/C=cn/ST=sh/L=sh/O=kdf/OU=kdf/CN=defonds kong
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 990 bytes and written 342 bytes
可以看到 tomcat 只支持 TLSv1.2 了。

2. Tomcat 强制完全正向加密

2.1. 配置 tomcat

在上述Connector标签添加以下参数:
ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
  TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
  TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
  TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384,
  TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256,
  TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,
  SSL_RSA_WITH_3DES_EDE_CBC_SHA"

最后重启tomcat即可。

2.2. 完全正向加密的检测

很多证书服务商提供了在线 ATS 检测接口,比如:

如腾讯云的检测结果:

3. 相关工具下载

本文所涉及 openssl 工具安装包,以及 server.xml、catalina.bat、keystore.jks 都已打包上传 CSDN 资源,有兴趣的朋友可以自行去下载以参考:
SSL/TLS 检测工具以及 tomcat 正向加密配置例子

参考资料

为通过 ATS 检测 Tomcat 完全 TLS v1.2、完全正向加密及其结果检验的更多相关文章

  1. windows下脚本检测tomcat是否启动,没有启动则启动

    最近有个服务需要部署到windows server2003上面,机房没有windows ser的机器,没办法搞了个阿里云服务,购买的配置比较低, 不知道什么原因,tomcat启动后总是容易自动退出,搞 ...

  2. [转载] TLS协议分析 与 现代加密通信协议设计

    https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/?from=time ...

  3. linux本地检测tomcat是否启动成功

    @参考文章 原文如下: linux本地检测如何tomcat是否启动成功? 解决方法: 1.curl 127.0.0.1:8080 第一可以知道本地是否可以访问tomcat,返回页面代码 2.tail ...

  4. Shell脚本检测Tomcat是否正在运行

    #!/bin/sh # configurations # computer 设备名称 # target 监控目标 # watcher 跟踪者(邮箱) computer="ehetong&qu ...

  5. JRockit检测Tomcat内存溢出JAVA内存泄漏问题

    http://blog.csdn.net/liyanhui1001/article/details/8240473 公司的一个Java应用系统上线以来,基本每1天OutOfMemoryError: P ...

  6. 检测tomcat服务是否正常

    由于tomcat服务经常会出现进程在,但是服务却无法正常响应的问题,而且进程跑在docker容器中,使用zabbix控制不是很方便,故此写了个简单的小脚本: #!/bin/bash #Author:f ...

  7. tomcat使用自签名证书实现https加密访问

    部署好java环境和tomcat之后 执行以下语句 #生成证书,keytool是java工具命令,-genkey生成证书,-alias证书名称,-keyalg应该是指算法,-keystore是证书存储 ...

  8. Wsyscheck(系统检测维护工具) v1.68.33绿色版

    软件名称:系统检测维护工具(Wsyscheck) v1.68.33绿色版软件类别:国产软件运行环境:windows软件语言:简体中文授权方式:免费版软件大小:1022 KB软件等级:整理时间:2011 ...

  9. 关于 iOS 10 中 ATS 的问题

    本文于 2016 年 11 月 28 日按照 Apple 最新的文档和 Xcode 8 中的表现进行了部分更新. WWDC 15 提出的 ATS (App Transport Security) 是 ...

随机推荐

  1. win10不能被远程解决方案(开启远程桌面,防火墙仍不能被远程解决方案)

    开启远程桌面,防火墙仍不能被远程解决方案 1.“Win+R”→“gpedit.msc” 2.依次展开“计算机配置”→“管理模版”→“系统”→“凭据分配”→找到“允许分配保存的凭据用于仅NTLM服务器身 ...

  2. 使用VS2012调试Dump文件

    前一节我讲了怎么设置C++崩溃时生成Dump文件 , 点击 传送门 , 这一节我讲讲怎么使用 VS2012 调试生成的 Dump 文件 , 甚至可以精确到出错的那一行代码上面 ; 1. 生成 Dump ...

  3. Java入门:基础算法之求数组元素的和

    本程序计算数组中所有元素的和. 代码1:数组元素由程序内部初始化 /** * @author: 理工云课堂 * @description: 求数组元素的和 */ class SumOfArray{ p ...

  4. cuckoo 安装

    最新 https://www.jianshu.com/p/f623fa0bebf9 http://www.freebuf.com/articles/system/123816.html http:// ...

  5. Hadoop基础-HDFS递归列出文件系统-FileStatus与listFiles两种方法

    Hadoop基础-HDFS递归列出文件系统-FileStatus与listFiles两种方法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. fs.listFiles方法,返回Loc ...

  6. java基础-数组的折半查找原理

    java基础-数组的折半查找原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果让你写一个数组的查找功能,需求如下:在一个数组中,找一个元素,是否存在于数组中, 如果存在就返回 ...

  7. servlet拦截器

    servlet拦截未登录的用户请求 java代码: package com.gavin.filter; import java.io.IOException; import javax.servlet ...

  8. Object-C使用类静态方法创建对象时容易内存泄露

    1.所谓使用类的静态方法创建对象,就是指使用类名调用一次它的静态方法(非显式调用alloc)便可以得到一个新建的对象,比如下面两个例子: NSString* str1 = [NSString stri ...

  9. 基于 Cocos2d-x-lua 的游戏开发框架 Dorothy 简介

    基于 Cocos2d-x-lua 的游戏开发框架 Dorothy 简介 概述 Dorothy 是一个在 Cocos2d-x-lua 基础上发展起来的分支, 它去掉 Cocos2d-x-lua 那些过多 ...

  10. 关于File 文件操作

    1.通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据2.通过Cont ...