最近碰到的一些 SSL 问题记录

本文介绍了如何解决Android6.0设备上出现的SSL连接问题及升级到JDK8后遇到的iOS推送服务SSL连接失败的问题。通过调整服务器侧的P参数长度解决了Android6.0的SSL握手失败,并通过转换证书格式解决了iOS推送服务的SSL连接问题。

最近碰到一些 SSL 的小问题,特记录下。

我们有个 Java 实现的 SSL TCP 服务端,为客户端(PC、Android 和 iOS)提供 SSL 接入连接服务。最近有用户反馈其手机上 App 不能正常连接登录,别人手机上都可以。经过单独回访调查该用户使用的手机操作系统是 Android 6.0,经搜索了解了 Android 6.0 之后 Google 使用了自家的 BoringSSL 替换了原来的 OpenSSL,怀疑是这里在捣鬼。

继续搜索类似问题解决方案,在参考[1] 中找到答案:

SSL/TLS握手过程中,假如选中了诸如 TLS_DHE_RSA_WITH_AES_128_CBC_SHA 这样使用 deffie-hellman 密钥的 cipher,那么在 deffie-hellman 密钥交换过程中会使用的一个P参数(prime number),服务器侧提供的 P 参数在 JDK8 之前都只用了 768bit 的长度,小于 1024bit 存在安全漏洞可导致 logjam attack,会被最新本版的浏览器和 BoringSSL 拒绝。

明了了原因后我们只好把 JDK 从 6 升级到了 8,顺利解决 Android6.0 SSL 握手失败问题。但解决完这个后,没多久又发现 APNS iOS 推送又不可用了,和苹果推送服务器建立 SSL 连接失败,无法推送消息。唯一的变化就是升级到了 JDK8 自然就将怀疑目标对准了 JDK8。

继续 Google 一把找了同类受害者,他已经搞明白了原因,见参考[2]

The problem was the exported keystore (in PKCS12 format) contained the private key as well as the production certificate and the development certificate for push notifications. Java can use keystores in the PKCS12 format. But Java 6 and Java 8 did not read-in the keystore the same way. It looks like Java 6 read in the production certificate for the private key and Java 8 read in the development certificate.

解决办法也很简单,先用 JDK6 提供的 keytool 将 .p12 格式的证书转换为 .jks 格式。再用 JDK8 提供的 keytool 将刚生成的 .jks 证书转换为 .p12 格式。转换命令如下:

.p12 -> .jks
/JDK6/keytool -importkeystore -destkeystore apns.jks -srckeystore apns_jdk6.p12 -srcstoretype PKCS12

.jks -> .p12
/JDK8/keytool -importkeystore -srckeystore apns.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore apns_jdk8.p12

参考

[1] liuxian233. Android 6.0 HTTPS连接ssl3_get_server_key_exchange:BAD_DH_P_LENGTH错误问题
[2] szediwy. Apple Push Notification with Java
[3] ASHISH PARAB. APPLE PUSH NOTIFICATION SERVICE CERTIFICATE ISSUE WITH JDK 7


写点文字,画点画儿,「瞬息之间」一切都变了。觉得不错,扫描二维码关注。
这里写图片描述

转载于:https://www.cnblogs.com/hehe520/p/6147586.html

### 如何排查和解决 SSL 证书问题 #### 理解 SSL 证书的作用及其常见问题 SSL 证书作为加密协议,保障用户与网站间的数据传输安全。当浏览器访问受 SSL 保护的站点时,会验证此证书的有效性。一旦发现证书存在问题,比如过期或不匹配等情况,就会触发诸如“[There was a problem confirming the ssl certificate]”这样的警告信息[^1]。 #### 浏览器端 SSL 错误处理方法 对于遇到上述错误提示的情况,建议采取如下措施来诊断并修复潜在的问题: - **更新浏览器版本**:有时特定版本可能存在已知漏洞或是对某些类型的 SSL/TLS 协议支持不佳。 - **清除缓存及Cookie**:旧有的连接记录可能干扰新请求的成功建立。 - **手动添加例外情况**:针对自签名或其他不受信任源签发的证书,在充分了解风险的前提下可考虑临时接受这些异常状况继续浏览。 #### Nginx 配置中的 SSL 设置调整 在 Ubuntu 上通过 Nginx 提供 HTTPS 访问服务的过程中,若遭遇 `SSL handshake failed` 的报错现象,应着重审查配置文件内的 SSL 参数设定是否恰当。具体来说就是确认 `ssl_certificate` 和 `ssl_certificate_key` 指向的是实际存在的、有效的公钥/私钥配对文件位置,并且权限设置允许 Web Server 进程读取它们的内容[^2]。 ```nginx server { listen 443 ssl; server_name example.com; ssl_certificate /etc/nginx/certificates/example_com.crt; ssl_certificate_key /etc/nginx/certificates/example_com.key; } ``` #### Java 应用程序环境下的 SSL 证书管理 为了使基于 JVM 构建的应用能够顺利发起带有客户端身份验证需求的安全 HTTP 请求,需确保目标主机所提供的 CA 或者直接颁发给对方的服务端实体所持有的 X.509 数字凭证已被加入到本地的信任库中去。这通常涉及到从远程获取 .cer 文件再利用 keytool 工具将其安装至 JRE 安装目录下 cacerts keystore 中的操作过程[^3]。 ```bash keytool -importcert -file Root.cer -alias rootca -keystore $JAVA_HOME/jre/lib/security/cacerts ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值