[转帖]TLS 版本问题

转帖 From 

https://www.cnblogs.com/xjnotxj/p/7252043.html

一、环境:

CentOS 6.8
nginx 1.6.0
php 7.0.10

二、背景

最近开发一个小程序,而小程序对后台接口服务器的要求是:

1、请求域名在request合法域名
2、基于 https 协议
3、TLS 版本 1.2+

1、2 两条都满足了,但是第三条亟待解决,导致小程序调用接口时报错:

三、正文

(1)为什么要满足 TLS 版本 1.2+ ?

2017年1月1日起,苹果强制所有 app 满足 HTTPS,即 iOS9 推出的 App Transport Security (ATS) 特性。

访问 https://www.qcloud.com/product/ssl#userDefined10 ,
输入域名,检查您的 iOS app 是否满足 ATS 特性:

报错了,提示不支持 TLS1.2。

(2)如何满足 TLS 版本 1.2+ ?

1、openSSL 版本 1.0.1+

查看 openSSL 版本:

openssl version -a

2、nginx 版本为 0.7.65,0.8.19 及更高版本

查看 nginx 版本:

nginx -V

结果是,我的版本都符合要求。

(3)nginx 配置 TLS1.2

本人申请的是腾讯云的安全证书,官方有提供 nginx 如何配置的文档:
https://www.qcloud.com/document/product/400/6973#1.nginx-.E8.AF.81.E4.B9.A6.E9.85.8D.E7.BD.AE

配置 nginx.conf 支持 TLS1.2 的方法如下(看 ssl_protocols 参数):

server {
        listen 443;
        server_name www.domain.com; #填写绑定证书的域名 ssl on; ssl_certificate 1_www.domain.com_bundle.crt; ssl_certificate_key 2_www.domain.com.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置 ssl_prefer_server_ciphers on; location / { root html; #站点目录 index index.html index.htm; } }

四、遇到的问题

按照上文一切都做完之后,发现还是不行。

折腾好久之后。

发现,原来是 nginx 之前有配另一个 https 的 server,关于
ssl_protocols 的参数值为:

  ssl_protocols  SSLv2 SSLv3 TLSv1;

里面根本没有包含 TLSv1.2!从而影响了我们这个 server!

所以把改成:

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

再测试:

完美。

 
以及启用的方法 更高级别安全性的方法
The DEFAULT System.Net.ServicePointManager.SecurityProtocol in both .NET 4.0/4.5 is:

 SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls.

.NET 4.0 supports up to TLS 1.0 while .NET 4.5 supports up to TLS 1.2

However, an application targeting .NET 4.0 can still support up to TLS 1.2 if .NET 4.5 is installed in the same environment. .NET 4.5 installs on top of .NET 4.0, replacing System.dll.

I've verified this by observing the correct security protocol set in traffic with fiddler4 and by manually setting the enumerated values in a .NET 4.0 project:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 |(SecurityProtocolType)768 | (SecurityProtocolType)3072;

 

转载于:https://www.cnblogs.com/jinanxiaolaohu/p/9677762.html

### TLS 版本配置与兼容性 #### TLS 版本的历史与发展 TLS 协议自推出以来经历了多个版本的发展。2008年发布的 TLS 1.2 是一个重要里程碑,它引入了更强大的加密算法,如 AES 和 SHA-256[^2]。尽管握手过程较长,但在 TLS 1.3 发布之前,TLS 1.2 成为了最广泛使用的版本。 #### 应用中的 TLS 版本配置需求 对于某些应用程序来说,在不同环境下可能需要支持不同的 TLS 版本来满足特定的服务接口要求或者保持向后兼容性。例如,当应用需对接那些仅接受较高版本 TLS 的外部服务时,或是为了确保能在较老版本的操作系统上正常工作(比如 Android),开发者就必须显式地设置所要启用的 TLS 版本[^1]。 #### 使用 OkHttp 进行 TLS 版本修改 在基于 OkHttp 构建的应用程序里调整 TLS 设置可以通过创建并指定 `ConnectionSpec` 来实现。下面是一个简单的例子来展示如何强制使用 TLS 1.2: ```java import okhttp3.OkHttpClient; import okhttp3.ConnectionSpec; public class TlsConfigExample { public static OkHttpClient createClient() { ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) .tlsVersions(ConnectionSpec.MODERN_TLS.tlsVersions()) .build(); return new OkHttpClient.Builder() .connectionSpecs(Collections.singletonList(spec)) .build(); } } ``` 这段代码构建了一个只允许现代 TLS (即至少为 TLS 1.2)连接规格的对象,并将其应用于新的 HTTP 客户端实例中。 #### 测试和验证 TLS 配置 为了确认 Tomcat 或其他服务器已经正确设置了所需的 TLS 版本,可以利用工具来进行 SSL/TLS 兼容性的检测。这通常涉及到发送请求给目标站点并通过网络分析器查看响应头信息或直接读取日志文件以判断实际协商成功的协议版本。另外也可以通过编程方式获取当前 JVM 中默认上下文对象 (`SSLContext`) 所采用的安全参数作为辅助手段[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值