TLS 1.3握手失败客户端报“Header Too Long”mTLS场景问题咨询
核心问题定位
从调用栈可直接定位错误触发点:自定义私钥操作回调PrivateKeyOperationCallback调用d2i_X509_SIG解析ASN1结构时,输入内容不符合格式要求,触发ASN1_get_object返回「Header Too Long」错误。根因为TLS 1.3的mTLS CertificateVerify签名逻辑与你适配TLS 1.2的自定义私钥实现不兼容。
排查步骤
- 验证签名算法适配情况:TLS 1.3的CertificateVerify消息默认使用RSASSA-PSS padding签名,而TLS 1.2默认使用PKCS#1 v1.5 padding。检查你的
My_RSA_private_encrypt实现是否适配了RSA_PKCS1_PSS_PADDING类型的padding参数,如果仍按PKCS#1 v1.5的逻辑处理PSS签名输入,会生成错误的ASN1结构触发解析失败。 - 检查私钥回调的type参数处理:TLS 1.3会给
PrivateKeyOperationCallback传入新的签名算法标识(如RSA_PSS_RSAE_SHA256、RSA_PSS_RSAE_SHA384等),如果你之前适配TLS 1.2的代码未处理这些新的type值,直接套用旧逻辑构造X509_SIG结构,会导致输入的长度或内容错误。 - 打印
d2i_X509_SIG的入参校验:输出你传给d2i_X509_SIG的二进制内容和长度参数,正常X509_SIG的ASN1头长度不会超过4字节,若内容乱码、长度小于头长度或者远大于合法值,即可确认是上层构造ASN1结构的逻辑错误。
解决方案
- 新增TLS 1.3 PSS签名适配逻辑:在自定义私钥回调中新增PSS padding的处理分支,PSS签名不需要封装为X509_SIG结构,直接输出签名结果即可,无需调用
d2i_X509_SIG做ASN1解析。 - 强制使用TLS 1.2兼容的签名算法:如果你暂时不打算适配RSASSA-PSS签名,可在SSL上下文初始化阶段添加配置,强制使用PKCS#1 v1.5签名算法,代码示例:
SSL_CTX_set1_sigalgs_list(ctx, "RSA+SHA256:RSA+SHA384:RSA+SHA512:ECDSA+SHA256"); - 修复自定义RSA加密函数的padding处理:在
My_RSA_private_encrypt中增加padding参数判断,当入参padding为RSA_PKCS1_PSS_PADDING时,走PSS签名流程,跳过X509_SIG结构的解析逻辑。
内容的提问来源于stack exchange,提问作者Peeyush Jain
相关产品推荐
相关产品推荐

