使用Jsoup1.8.1请求HTTPS站点抛出SSLException:Tag mismatch异常求解决
问题根因
你遇到的AEADBadTagException: Tag mismatch错误核心是2014年发布的jsoup 1.8.1版本内置的HTTP客户端实现,和JDK 16的TLS 1.3加密栈不兼容,维基百科现在默认开启TLS 1.3加密,老版本jsoup无法正确解析TLS 1.3的GCM加密报文导致校验失败。
可行解决方案
方案1:升级jsoup版本(最推荐)
直接修改pom.xml中jsoup的依赖版本为最新稳定版即可,新版本已完全适配高版本JDK的SSL实现:
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.17.2</version> </dependency>
修改后重新拉取依赖,原有代码无需任何改动即可正常运行。
方案2:强制指定TLS 1.2协议(不升级jsoup的临时方案)
如果受项目限制无法升级jsoup版本,可在发起请求时强制使用TLS 1.2协议,规避TLS 1.3的兼容问题,修改代码如下:
import javax.net.ssl.SSLContext; import java.security.SecureRandom; import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; public class Main{ public static void main( String[] args ) throws Exception{ // 初始化TLS 1.2的SSL上下文 SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); sslContext.init(null, null, new SecureRandom()); // 连接时指定使用该SSL上下文的Socket工厂 Document doc = Jsoup.connect("https://en.wikipedia.org/wiki/Main_Page") .sslSocketFactory(sslContext.getSocketFactory()) .get(); String title = doc.title(); System.out.println("title is: " + title); } }
方案3:添加JVM启动参数
不想修改代码的话,可直接在运行配置的JVM参数中添加如下配置,全局强制客户端使用TLS 1.2协议:
-Djdk.tls.client.protocols="TLSv1.2"
内容的提问来源于stack exchange,提问作者Riko
相关产品推荐
相关产品推荐

