欢迎来到快钱!
1.适用性声明

本文档适用于与快钱有系统交互的商户。

如商户仅使用快钱POS机,而无系统交互,可忽略该文档。POS机应用场景,如有影响,会另行通知。

 

2.背景介绍

快钱支付系统使用HTTPS来保证通信安全,目前快钱服务端使用的安全协议有SSLv3、TLSv1、TLSv1.1、TLSv1.2。其中,因SSLv3、TLSv1逐渐暴露出一系列安全漏洞,为了保证跟快钱通讯的安全性,快钱服务端已经于2018年10月全面禁用了SSLv3协议。现快钱服务端将逐步禁用TLSv1协议。

 

3.禁用计划
下表列出了快钱支付服务端禁用不安全协议的时间计划。

协议版本

当前快钱服务端禁用情况(生产环境)

计划禁用时间

SSLv3

已全面禁用

2018年10月

TLSv1

未禁用

2019年5月

表1  快钱支付服务端(生产环境)禁用不安全协议的时间计划

 

 

4.需要您做什么
贵司需要确认贵司业务系统与快钱支付系统交互的系统或组件中,贵司作为https通讯的客户端,在与快钱系统建立HTTPS时所支持的SSL/TLS版本。

 

(注意:本次协议改造适用的场景是贵司系统作为HTTPS通讯的客户端,快钱作为HTTPS通讯的服务端,不影响贵司作为服务端对外提供服务所支持的SSL/TLS版本,通常服务端支持的SSL/TLS版本配置在贵司的SSL代理节点上,如apache、nginx、IIS等服务器、F5或其他SSL代理节点。)

 

如果贵司使用的是SSLv3或者TLSv1,则需要在表1的计划禁用时间点之前完成修正,使支持TLSv1.1或TLSv1.2(推荐使用TLSv1.2)。否则,在快钱禁用相应的SSL/TLS版本之后,贵司业务系统与快钱支付系统之间将不能正常进行HTTPS通讯,影响业务的正常运行。

行动建议:

1)按照“参考修正方法”章节的方法尽快完成环境自查和修正。

2)完成自查和修正后,按照“验证方法”章节,与快钱sandbox测试环境进行验证。

如果贵司当前支持TLSv1.1或TLSv1.2,则贵司不需要进行任何修正。

 

5.参考修正方法

5.1. JAVA

 

5.1.1.  不兼容的现象

如果在与快钱系统进行建立HTTPS连接时,贵司客户端环境不支持TLS1.1或TLS1.2,则会抛出SSL握手失败的异常,典型异常日志如下:

javax.net.ssl.SSLHandshakeException:Received fatal alert: handshake_failure...

使用JDK自带的接口建立HTTPS连接,设置SSL/TLS版本的典型方法如下:

SSLContext context =SSLContext.getInstance("SSL");            //支持SSLv3TLSv1

SSLContext context =SSLContext.getInstance("SSLv3");        //支持SSLv3TLSv1

SSLContext context =SSLContext.getInstance("TLS");            //支持SSLv3TLSv1

SSLContext context =SSLContext.getInstance("TLSv1");        //支持SSLv3TLSv1

SSLContext context = SSLContext.getInstance("TLSv1.1");    //支持SSLv3TLSv1TLSv1.1

SSLContext context =SSLContext.getInstance("TLSv1.2");    //支持SSLv3TLSv1TLSv1.1TLSv1.2

 

主流JDK环境对各版本SSL/TLS版本支持情况如下:

类型

JDK8

JDK7

JDK6

JDK5

SSL/TLS版本

TLSv1.2 (default)

TLSv1.1

TLSv1

SSLv3

TLSv1.2

TLSv1.1

TLSv1 (default)

SSLv3

TLS v1.2(JDK 6u121及以上版本)

TLS v1.1 (JDK 6u111及以上版本)

TLSv1 (default)

SSLv3

 

TLSv1

SSLv3

表2 主流JDK环境对各版本SSL/TLS版本支持情况

 

参考资料:

https://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html#SSLContext

https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#SSLContext

https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#SSLContext

http://www.oracle.com/technetwork/java/javase/documentation/cve-2014-3566-2342133.html

 

使用其他方式(比如使用其他Java接口,或使用第三方包)实现HTTPS连接的,需要自行查看相应代码,确认在建立HTTPS连接时使用的SSL/TLS版本和相关细节,以完成相应的修正。

 

5.1.2.  修正方案

使用使用Java自带接口(javax.net.ssl.SSLSocket)实现的,修正方法如下:

1)确保JDK环境支持并启用TLSv1.1或者TLSv1.2。

JDK支持的TLS版本情况见表2主流JDK环境对各版本SSL/TLS版本支持情况。

2)确保建立HTTPS连接使用的版本为TLSv1.1或TLSv1.2。

 

可使用以下方法指定支持的TLS版本(推荐使用TLSv1.2):

SSLContext sc =SSLContext.getInstance("TLSv1.1");     //支持SSLv3TLSv1TLSv1.1

SSLContext sc =SSLContext.getInstance("TLSv1.2");     //支持SSLv3TLSv1TLSv1.1TLSv1.2

 

使用其他方式(比如使用其他Java接口,或使用第三方包)实现HTTPS连接的,需要自行查看相应代码,确认在建立HTTPS连接时使用的SSL/TLS版本和相关细节,以完成相应的修正。

 

5.2.  PHP

 

5.2.1.  不兼容的现象

如果在与快钱系统进行建立HTTPS连接时,贵司客户端环境不支持TLS1.1或TLS1.2,则会抛出SSL握手失败的异常,典型异常日志如下:

SSL connect error

PHP一般使用curl来建立https连接,可手动指定使用的SSL/TLS版本。典型实现代码如下:

代码实例

使用的SSL/TLS版本

curl_setopt($ch, CURLOPT_SSLVERSION,0);

The default acceptable version range. The mimimum acceptable version is  by default TLS 1.0 since curl verson 7.39.0 (unless the TLS library has a  stricter rule).

curl_setopt($ch, CURLOPT_SSLVERSION,1);

TLS v1.0 or later

curl_setopt($ch, CURLOPT_SSLVERSION,2);

SSL v2 (but not SSLv3)

curl_setopt($ch, CURLOPT_SSLVERSION,3);

SSL v3 (but not SSLv2)

curl_setopt($ch, CURLOPT_SSLVERSION,4);

TLS v1.0 or later (Added in curl version 7.34.0)

curl_setopt($ch, CURLOPT_SSLVERSION,5);

TLS v1.1 or later  (Added in curl  version 7.34.0)

curl_setopt($ch, CURLOPT_SSLVERSION,6);

TLS v1.2 or later (Added in curl version 7.34.0)

表3  php指定SSL/TLS版本的典型代码示例

 

如不手动指定SSL/TLS版本,则curl使用默认的版本与服务端进行协商。

特别需要注意的是,支持TLS1.1或TLS1.2需要客户端环境的curl 7.34.0及以上版本,同时,您还需要保证curl依赖的加密算法库(通常为OpenSSL或NSS)的支持,需要满足OpenSSL 1.0.1及以上或NSS 3.15.1及以上版本。

您可以使用以下php代码检查curl版本和依赖的加密算法库(通常为OpenSSL或NSS)的版本:

#!/usr/bin/php

<?php

$version = curl_version();

echo "curl_version:". $version['version']."\r\n";

echo "ssl_version:".$version['ssl_version']."\r\n";

?>

curl的加密算法库为OpenSSL的输出结果类似如下:

加密算法库为NSS的输出结果类似如下:

 

参考资料:

http://www.php.net/manual/zh/function.curl-setopt.php

https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/NSS_3.15.1_release_notes

https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/NSS_3.14_release_notes

https://www.openssl.org/

 

 

5.2.2.  修正方案

如您当前的环境不支持TLSv1.1或TLSv1.2,建议您按照以下方法进行修正:

1)确保curl版本大于或等于7.34.0,同时确保curl依赖的加密算法库的支持。

如curl的SSLVersion是NSS,则需要NSS3.15.1及以上版本。

如curl的SSLVersion是OpenSSL,则需要OpenSSL 1.0.1及以上版本。

使用其他加密算法库的,请自行查阅相关实现细节。

2)确认您当前环境与快钱系统建立HTTPS连接时是否指定了具体的SSL/TLS版本。

如指定了具体的SSL/TLS版本,则需要确保使用的版本支持TLSv1.1或TLSv1.2。

如未指定,则系统使用默认支持的SSL/TLS版本与快钱服务端进行协商。因此您在确保满足上述1中的curl和加密算法库(NSS或OpenSSL)的版本要求后,一般不需要再做其他额外修正。

 

 

5.3.   .NET

 

5.3.1.  不兼容的现象

.net环境如出现以下异常,则很有可能是您的客户端环境不支持TLSv1.1或TLSv1.2。

The request was aborted: Could not create SSL/TLSsecure channel.

 

5.3.2.  修正方案

主流操作系统支持的SSL/TLS协议情况如下表:

Windows OS

SSLv2

SSLv3

TLS 1.0

TLS 1.1

TLS 1.2

Windows XP   

Enabled

Enabled

Enabled

Not Supported

Not Supported

Windows Server 2003

Enabled

Enabled

Enabled

Not Supported

Not Supported

Windows Vista

Enabled

Enabled

Default

Not Supported

Not Supported

Windows Server 2008

Enabled

Enabled

Default

Disabled

Disabled

Windows 7 (WS2008 R2)

Enabled

Enabled

Default

Disabled

Disabled

Windows 8 (WS2012)

Disabled

Enabled

Enabled

Enabled

Default

Windows 8.1 (WS2012 R2)

Disabled

Enabled

Enabled

Enabled

Default

Windows 10

Disabled

Enabled

Enabled

Enabled

Default

Windows Server 2016

Not  Supported

Disabled

Enabled

Enabled

Default

表4 主流操作系统支持的SSL/TLS协议情况

 

如果您的.net环境不支持TLSv1.1或TLSv1.2,建议您按照以下步骤进行修正:

1)确保您的操作系统支持TLS1.1或TLS1.2。操作系统支持SSL/TLS版本情况见表4。

Windows Server 2008启用TLSv1.1和TLSv1.2参考:

https://cloudblogs.microsoft.com/microsoftsecure/2017/07/20/tls-1-2-support-added-to-windows-server-2008/

Windows 7&Windows Server 2008 R2启用TLSv1.1和TLSv1.2参考:

https://support.microsoft.com/en-us/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-a-default-secure-protocols-in

2)确保您的.NET Framework设置以支持TLSv1.1和TLSv1.2。

参考资料:https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls

3)彻底审核您的代码,尽量不要手动指定TLS版本,而是让操作系统决定TLS版本。

 

5.4.  Python

Python开发环境,关于SSL/TLS方面的设置请参考:

https://docs.python.org/2.7/library/ssl.html

https://docs.python.org/3/library/ssl.html

 

5.5.  浏览器

 

5.5.1  通用检测方法

您可以使用浏览器访问如下链接

https://www.ssllabs.com/ssltest/viewMyClient.html,

然后查看ProtocolFeatures部分,来确认当前浏览器支持的SSL/TSL版本。

以下是用chrome 68版本检测的结果:

 

 

5.5.2   不兼容现象

5.5.2.1.    IE

IE浏览器若不支持TLSv1.1TLSv1.2可能出现以下现象(如IE11):

较低版本的IE还可能直接显示页面无法显示:

 

5.5.2.2.   Firefox

Firefox浏览器若不支持TLSv1.1或TLSv1.2可能出现以下现象:

 

 

 

5.5.3.  修正方案

5.5.3.1.   IE

首先需要IE 8.0及以上版本,如IE版本过低,则需要升级IE浏览器。

然后依次选择工具→Internet选项→高级→安全,然后勾选使用TLS1.1和使用TLS 1.2。

 

5.5.3.2.   Firefox、Chrome、Safari

Chrome、Firefox、Safari等浏览器如不支持TLS1.1和TLS 1.2,通常将浏览器升级到最新,并保持默认配置即可。

 

6.验证方法

6.1.  sandbox环境验证

如果具备验证条件,您可通过快钱支付 sandbox 测试环境来验证贵司系统是否支持TLSv1.1或TLSv1.2。

贵司可在快钱sandbox测试环境中,按照正常使用方法进行测试验证,如果业务测试可以顺利进行,说明是兼容TLSv1.1或TLSv1.2的。

sandbox环境(sandbox.99bill.com域名)禁用不安全协议的时间计划:

协议版本

当前快钱服务端禁用情况(sandbox测试环境)

计划禁用时间

SSLv3

已禁用

已禁用

TLSv1

未禁用

2019/5/30

表5  快钱支付服务端(sandbox测试环境)禁用不安全协议的时间计划

注意:

在sandbox环境验证时应使用跟贵司业务系统生产环境相同的操作系统、执行环境、开发语言及程序逻辑进行验证,这样验证出来的结果才是可靠的。

 

6.2.  客户端SSL/TLS版本自查

部分API和系统服务可能在sandbox环境不具备,对这部分API或系统服务,只能通过自查的方式,来确认贵司在与快钱系统建立HTTPS时所使用的SSL/TLS版本是否需要修正,自查和修正方法参考“参考修正方法”章节。

 

6.3.  验证或自查结果

如果贵司系统可正常获得快钱系统的响应,或者经自查确认与快钱建立HTTPS连接支持TLSv1.1或TLSv1.2,则您不需要再做其他事情。

如果贵司系统不能正常获得快钱系统的响应,或者经自查确认与快钱建立HTTPS连接不支持支持TLSv1.1或TLSv1.2,则需要完成相应的修正。我们总结了常见环境可能的修正方法于本文档“参考修正方法”章节,您可参考。

 

7.联系我们

如对本次SSL/TLS协议改造中有任何疑问,或在验证、修正过程遇到困难,您可联系在线客服或拨打快钱企业客户服务热线400-635-5799,说明:安全协议改造需要技术支持,即会安排技术支持人员远程协助。