使用openssl s_client测试APNs握手时无法加载客户端证书私钥
APNs TLS握手测试私钥加载报错排查
测试执行命令
openssl s_client -connect gateway.push.apple.com:2195 -cert cert.pem -key privateKey.pem
实际触发报错
unable to load client certificate private key file 4452410816:error:0909006C:PEM routines:get_name:no start line:crypto/pem/pem_lib.c:745:Expecting: ANY PRIVATE KEY
核心问题原因
这个报错发生在openssl本地加载私钥的阶段,根本没有完成到APNs网关的网络请求,不存在APNs侧拒绝的可能,本质是程序无法将指定路径下的privateKey.pem识别为合法的PEM格式私钥。
分步排查修复
- 校验私钥文件的PEM格式合法性
报错中no start line是最明确的格式异常信号:合法PEM私钥必须以标准标识行开头,比如
-----BEGIN PRIVATE KEY-----、-----BEGIN RSA PRIVATE KEY-----、-----BEGIN ENCRYPTED PRIVATE KEY-----,且末尾必须有对应的匹配结束行-----END xxxx-----。如果文件开头是其他内容(比如证书文本、乱码、空内容),就会触发该报错。 - 排除文件内容编码错乱
- 检查文件是否被文本编辑器自动添加了UTF-8 BOM头、混入了多余的换行/空格,这类不可见内容会直接破坏PEM格式的识别规则
- 不要直接把其他编码格式的私钥(比如DER编码的.key、PKCS12格式的.p12文件)改后缀为.pem直接使用,这类文件无法被openssl按PEM规则解析,需要先完成格式转换,常用转换命令如下:
# DER格式私钥转PEM openssl rsa -inform DER -in private_key.der -out private_key.pem # 从p12安装包拆分导出标准PEM格式证书和私钥 openssl pkcs12 -in apns_cred.p12 -clcerts -nokeys -out cert.pem openssl pkcs12 -in apns_cred.p12 -nocerts -nodes -out privateKey.pem
- 校验证书与私钥的配对关系
即使文件格式正确,如果私钥和客户端证书不是同一对密钥对,也会在加载阶段触发兼容类报错,可以通过提取两边的模数哈希做校验,两个值完全一致才是配对的:# 提取证书的模数哈希 openssl x509 -in cert.pem -noout -modulus | openssl md5 # 提取私钥的模数哈希 openssl rsa -in privateKey.pem -noout -modulus | openssl md5 - 检查文件读取权限
确认执行openssl命令的当前系统用户对privateKey.pem有读取权限,如果权限不足导致程序读到空文件,同样会触发格式解析失败的报错。
内容的提问来源于stack exchange,提问作者cam
相关产品推荐
相关产品推荐

