当前位置:朝夕网 » 数码科技 » 如何优雅处理HTTPS中的证书问题

如何优雅处理HTTPS中的证书问题

Java中HTTPS会遇到的问题访问自签名的HTTPS网站高版本JRE访问SSLv3/SSLv2站点一些银行接口需要加载keystore的场景1 访问自签名的HTTPS网站常常看到的回答是直接通过信任

Java中HTTPS会遇到的问题访问自签名的HTTPS网站高版本JRE访问SSLv3/SSLv2站点一些银行接口需要加载keystore的场景1 访问自签名的HTTPS网站

常常看到的回答是直接通过信任所有来支持, 这不优雅; 优雅的操作应该:

下载服务端的CA证书

2 高版本JRE访问SSLv3/SSLv2站点 ​

通常你得到的答案是通过修改`${JRE_HOME}/lib/security/java.security`目录下某些配置项来取消高版本SDK对某些不安全SSL协议版本或算法的限制。

​各版本对SSL的支持情况

* 在2015年1月发布的升级补丁中也已经禁用对SSLv3的支持。 ​

所以为什么会出现在某些高版本无法访问某些HTTPS站点的原因就是由于有以下可能:

服务端支持对SSL版本在本地JRE已经被禁用, 例如服务端只支持SSLv3而JDK已经默认关闭了对SSLv3的支持。服务端使用的JSSE Ciphers和本地支持的JSSE Ciphers没有共同项导致无法正常选择加密算法。

​2.1 确认当前JRE启用SSL协议 ​ ​ ​

@Testpublic void sslSupport() throws IOException { SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault(); SSLSocket soc = (SSLSocket) factory.createSocket(); // Returns the names of the protocol versions which are // currently enabled for use on this connection. String[] protocols = soc.getEnabledProtocols(); System.out.println(&

Enabled protocols:TLSv1TLSv1.1TLSv1.2

2.2 确认当前JRE启用CipherSutes ​

String[] cipers = soc.getEnabledCipherSuites();System.out.println(&

Enabled CipherSutes:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384TLS_RSA_WITH_AES_256_CBC_SHA256TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384TLS_DHE_RSA_WITH_AES_256_CBC_SHA256TLS_DHE_DSS_WITH_AES_256_CBC_SHA256TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHATLS_ECDHE_RSA_WITH_AES_256_CBC_SHATLS_RSA_WITH_AES_256_CBC_SHATLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA…

​2.3 检查服务器支持的SSL协议 ​

这里我推荐使用nmap检测:

nmap –script ssl-enum-ciphers -p 443 badssl.com

输出

Starting Nmap 7.70 ( https://nmap.org ) at 2019-01-01 22:26 CSTNmap scan report for badssl.com (104.154.89.105)Host is up (0.32s latency).rDNS record for 104.154.89.105: 105.89.154.104.bc.googleusercontent.comPORT STATE SERVICE443/tcp open https| ssl-enum-ciphers:| TLSv1.0:| ciphers:| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) – A……| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) – A| compressors:| NULL| cipher preference: server| warnings:| 64-bit block cipher 3DES vulnerable to SWEET32 attack| TLSv1.1:| ciphers:| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) – A……| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) – A| compressors:| NULL| cipher preference: server| warnings:| 64-bit block cipher 3DES vulnerable to SWEET32 attack| TLSv1.2:| ciphers:| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) – A……| TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA (dh 2048) – A| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) – A| compressors:| NULL| cipher preference: server| warnings:| 64-bit block cipher 3DES vulnerable to SWEET32 attack|_ least strength: CNmap done: 1 IP address (1 host up) scanned in 39.91 seconds

​根据输出可以看到badssl.com同时支持TLSv1.0、TLSv1.1以及TLSv1.2, 同时也可以看到当前对应协议支持的加密算法。 ​

2.4 解决方案

JRE在${JRE_HOME}/lib/security/java.security配置了一些算法的配置, 例如本地我的${JRE_HOME}/lib/security/java.security配置内容为: ​

jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, \\ EC keySize < 224, 3DES_EDE_CBC

表示当前JRE要禁用SSLv3协议以及RC4、DES等算法。当然我们可以通过手动修改该文件来取消这些限制来达到我们对目的, 但这样程序在部署到新环境就可能不能正常运行, 不优雅! 优雅对操作如下:

根据协议版本动态对JRE对设置取消设置, 在JRE中管理相关SSL协议以及算法的配置项主要是jdk.tls.disabledAlgorithms。// 取消当前运行环境对SSLv3、RC4、DES以及3DES_EDE_CBC的禁用限制static { String disabledAlgorithms = Security.getProperty(&

当然到这里可能你依然会质疑何苦呢,而且使用了不安全的协议。哈哈,人生就是这么让你无可奈何,咱也没得选择。

附录

[1] HTTPS<br/>

https://en.wikipedia.org/wiki/HTTPS

[2] Obtain a Certificate from Server<br/>

https://ldapwiki.com/wiki/Obtain%20a%20Certificate%20from%20Server

[3] Transport Level Security (TLS) and Java<br/>

http://www.ateam-oracle.com/tls-and-java/

[4] Diagnosing TLS, SSL, and HTTPS<br/>

https://blogs.oracle.com/java-platform-group/diagnosing-tls,-ssl,-and-https

以上就是朝夕生活(www.30zx.com)关于“如何优雅处理HTTPS中的证书问题”的详细内容,希望对大家有所帮助!

免责声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如有侵权行为,请第一时间联系我们修改或删除,多谢。朝夕网 » 如何优雅处理HTTPS中的证书问题