使用AWS EMR连接MongoDB时遭遇TLS错误求助
核心问题定位
从你导出的证书SAN信息里能看到重复的DNS:前缀:比如DNS:DNS:impl-stable-v4-mongodb0.ams-np-v4.internal.stuff.org,正确格式应为DNS:impl-stable-v4-mongodb0.ams-np-v4.internal.stuff.org。这种格式错误会导致Java的SSL验证无法识别这些SAN条目,进而触发匹配失败的报错。
具体排查与修复步骤
1. 确认证书本身的SAN格式问题
Java的X.509证书解析器仅识别DNS:<域名>格式的SAN条目,重复的DNS:前缀会让解析器把整个DNS:impl-stable-v4-mongodb0.ams-np-v4.internal.stuff.org当成一个完整域名,自然无法匹配实际的impl-stable-v4-mongodb0.ams-np-v4.internal.stuff.org。
2. 验证导入与导出的证书一致性
你导入证书时使用的别名是impl-stable.crt,但导出验证时用的是certs/impl-stable.crt,可能存在证书混淆。请用导入时的别名重新导出验证:
keytool -list -rfc -keystore /usr/lib/jvm/java/jre/lib/security/cacerts -alias impl-stable.crt
3. 确认EMR集群JVM证书路径匹配
AWS EMR不同版本可能使用不同的JDK路径,比如部分版本的cacerts路径为/usr/lib/jvm/java-1.8.0-openjdk/jre/lib/security/cacerts。需确认Spark任务实际使用的JVM对应的cacerts路径与你导入证书的路径一致,可通过Spark任务日志查看java.home参数确认。
4. 修复证书的SAN格式(根本解决)
根源是证书生成时SAN字段格式错误,需重新生成符合规范的证书:
- 在OpenSSL配置文件中正确定义SAN扩展:
重新生成证书后,再导入到EMR集群的cacerts密钥库中。[req] req_extensions = v3_req distinguished_name = req_distinguished_name [v3_req] subjectAltName = @alt_names [alt_names] DNS.1 = mongodb-0 DNS.2 = mongodb-0.mongodb-svc.core.svc.cluster.local DNS.3 = impl-stable-v4-mongodb0.ams-np-v4.internal.stuff.org DNS.4 = impl-stable-v4-mongodb1.ams-np-v4.internal.stuff.org DNS.5 = impl-stable-v4-mongodb2.ams-np-v4.internal.stuff.org # 其他需要的域名依次添加
内容的提问来源于stack exchange,提问作者TheFiddlerWins

