- 证书加载报错
Haproxy配置检查时报证书加载错误
haproxy -c -f /etc/haproxy.cfg
'bind *:443' : unable to load certificate chain from file '/etc/haproxy/78a6822f-cf06-446e-98bd-036b81ad9635.pem'
- 跟踪调试
openssl 一般使用 ERR_put_error 方法暂存错误码,为了定位错误发生点,使用gdb进行追踪:
最终报错信息为,在将读到的字节按照asn1格式解码的时候,libcrypto库认为私钥文件应该具备的一个tag属性不符
- 私钥解析
使用ASN.1 JavaScript decoder对私钥进行解析
私钥是PKCS#8结构的,而其私钥文件中-----BEGIN RSA PRIVATE KEY-----的字符又导致 openssl 将其作为PKCS#1结构进行解析,导致openssl认为证书格式不对从而报错
4. ASN.1格式分析
ASN.1 是一种通用的用于加解密的数据编码格式。
其中PKCS#8可以包含其他 ASN.1 结构,通过设置ALGORITHM-IDENTIFIER参数为PKCS#1,可以表示rsaEncryption结构
参见 rfc5208 - Appendix A. ASN.1 Syntax;
PKCS#1仅用于表示 RSA 算法用到的公私钥结构。
其中RSA私钥文件表示为:
RSAPrivateKey ::= SEQUENCE {
version Version,
modulus INTEGER, -- n
publicExponent INTEGER, -- e
privateExponent INTEGER, -- d
prime1 INTEGER, -- p
prime2 INTEGER, -- q
exponent1 INTEGER, -- d mod (p-1)
exponent2 INTEGER, -- d mod (q-1)
coefficient INTEGER, -- (inverse of q) mod p
otherPrimeInfos OtherPrimeInfos OPTIONAL
}
以上结构参见 rfc3447 - A.1.2 RSA private key syntax
私钥的结构不符合 rfc3447 - A.1.2 RSA private key syntax。
- 解决办法
转换私钥格式,从PKCS#8转化为PKCS#1格式, 重新加载成功
openssl rsa -in test.pkcs8.key -out test.pkcs1.key