如何获取Java 11中TLSv1.2支持的密码套件列表及实现代码?
Java 11中获取TLSv1.2支持的密码套件列表
一、通过Java代码列出TLSv1.2可用密码套件
完全可以编写Java代码获取Java 11中TLSv1.2支持的密码套件。Java的JSSE(Java安全套接字扩展)提供了对应API,可通过SSLContext获取指定协议支持的套件。
以下是可直接运行的示例代码:
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import java.util.Arrays; public class TLSCipherSuites { public static void main(String[] args) throws Exception { // 初始化TLSv1.2版本的SSL上下文 SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); sslContext.init(null, null, null); // 获取套接字工厂实例 SSLSocketFactory socketFactory = sslContext.getSocketFactory(); // 获取当前JSSE实现支持的所有密码套件 String[] cipherSuites = socketFactory.getSupportedCipherSuites(); // 过滤出仅适配TLSv1.2的套件(排除明确标记为低版本协议的套件) System.out.println("Java 11中TLSv1.2支持的密码套件:"); Arrays.stream(cipherSuites) .filter(suite -> !suite.contains("_SSLv3_") && !suite.contains("_TLSv1_") && !suite.contains("_TLSv1.1_")) .forEach(System.out::println); } }
代码说明:
getSupportedCipherSuites()返回的是当前Java环境支持的所有密码套件,其中部分套件可能同时兼容多个TLS版本,因此通过过滤排除标记为SSLv3、TLSv1.0、TLSv1.1的套件,即可得到TLSv1.2适配的套件列表;- 运行代码后会直接输出所有符合条件的密码套件名称。
二、通过OpenSSL查看密码套件(注意局限性)
你提到的openssl命令可以列出OpenSSL库支持的密码套件,但Java的JSSE实现与OpenSSL支持的套件并不完全一致——Java使用自身的加密库(如SunJSSE),和OpenSSL是相互独立的实现,两者的支持范围存在差异。
OpenSSL命令及中文输出示例:
执行命令:
openssl ciphers -V | head
翻译后的输出:
0xC0,0x30 - ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 密钥交换=ECDH 身份验证=RSA 加密=AESGCM(256) 消息认证码=AEAD 0xC0,0x2C - ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 密钥交换=ECDH 身份验证=ECDSA 加密=AESGCM(256) 消息认证码=AEAD 0xC0,0x28 - ECDHE-RSA-AES256-SHA384 TLSv1.2 密钥交换=ECDH 身份验证=RSA 加密=AES(256) 消息认证码=SHA384 0xC0,0x24 - ECDHE-ECDSA-AES256-SHA384 TLSv1.2 密钥交换=ECDH 身份验证=ECDSA 加密=AES(256) 消息认证码=SHA384 0xC0,0x14 - ECDHE-RSA-AES256-SHA SSLv3 密钥交换=ECDH 身份验证=RSA 加密=AES(256) 消息认证码=SHA1 0xC0,0x0A - ECDHE-ECDSA-AES256-SHA SSLv3 密钥交换=ECDH 身份验证=ECDSA 加密=AES(256) 消息认证码=SHA1 0x00,0xA5 - DH-DSS-AES256-GCM-SHA384 TLSv1.2 密钥交换=DH/DSS 身份验证=DH 加密=AESGCM(256) 消息认证码=AEAD 0x00,0xA3 - DHE-DSS-AES256-GCM-SHA384 TLSv1.2 密钥交换=DH 身份验证=DSS 加密=AESGCM(256) 消息认证码=AEAD 0x00,0xA1 - DH-RSA-AES256-GCM-SHA384 TLSv1.2 密钥交换=DH/RSA 身份验证=DH 加密=AESGCM(256) 消息认证码=AEAD 0x00,0x9F - DHE-RSA-AES256-GCM-SHA384 TLSv1.2 密钥交换=DH 身份验证=RSA 加密=AESGCM(256) 消息认证码=AEAD
注意事项:
如果需要确认Java实际运行环境中支持的密码套件,优先使用Java代码的方式,OpenSSL的结果仅作为参考,不能完全代表Java的支持情况。
内容的提问来源于stack exchange,提问作者PatS
相关产品推荐
相关产品推荐

