使用OpenSSL库读取EC私钥文件报错:ASN1标签错误
问题描述
尝试读取私钥用于后续数据签名操作,读取RSA私钥文件(有效)无错误,但读取EC私钥文件(无效)时提示密钥无效,错误信息为:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag。本人是OpenSSL新手。
有效密钥文件
-----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: AES-128-CBC,EB51377407AB034BA6C4554097E3454C 7pONu/34Ky4JYGGLYL1PqCSKl87JUvt/X5wMN4upEPPUb1rTmHHS3eHNKMoqHnfL cAFGxdE38v/9YCO6jeuuyjXcLXt4KxWqY8cRH/gd1HwGJE1UR2w7Tb230J5y1jr6 skAiVfDB1ePfG5Vjn2D1jQj+MKKAYExBn+00ZdMA21dUDn6lFFAP74qMy0D8FiHz m29sDO7gyFvcapwugqfB/xG1MwjMWsY2ZO5D0XIlrh9N7yDY/cjHsFL86bD88AcB Wwr3aXa+Id2ymQ+d+KqeYYvXtnjfa1y/NX4J5GTuGYkQfBeidEsxbqIDkJc5yb4R 0VVefPZvhRbCVdrgR1l4AOM+/jFwGO4nlhF0zrRYjA5Y63VjMhqzprWm+n+7oEyv aSmGEJ8nbG5FVZkPLfOD83bI7yZkJEJXitdBUYEA8eeclocQ80i9NJ4OzvJKxkMO Fa9SIEA7BX1+n2dYVf6M7fFHSJTy3lnyaM/tPY2Z46nwWlbJosIUVm/MqqxjWBes 2Fx/qxLCCPoNJpbGMKfFtWj2PO+jQizsxR1GJMYstfLwwruXE6EQxHUnDWNkycyd GrjiR6ma6mYu/xfawtCHwSKyXqqHAi8849nY7z+r12LZIouOV2RbQHOv/7rBKpHW 7I4de7stlmMkS22kbi+sck1zJTALPvjhuaMqzcaIjVrQ4o75dNrDchKkxhmp+0zK 5+862LeW42hjfi4NP/Cdql4yQ8tppmbYBh0YjIvEVNywCooJEOculZb7EpXmut25 mzssKvNZgJoaRyHTc/JYFV9GmdjxxaLuzSC25g0lkG4/q+BImkUeS+sWQPFIUaFM UOHKMKYfwUstI93oRHjh+Og1DSOuCmFyVCMUqc+vkugdSWPpaofrqZoIJY6GNfDz g7IHB75AozSgO3tvQnPKMJYPe0S0KiTUolRqQ8D4yi2jizzaomvHRcHBOvmHcGuL LkDkDc9iQh3HstV3UVgNdzyaYS0zXQj39Sy1rTLxcUz+cPSTm5YyaN5jJyK8zfJi PEqUoQ1/A4OkSCRjzlTlA1zxrrMxooBFbnYYnHOiSRdtaRKWn+lgm7iFBDMpbZOt pFez+OTHvdPp2dWvdrxecL3tOHQ0cXV+pG8JcqXvkKZdBjKrLYpCtX22PrscGLR3 8B2A6KiZJX1135Ce1wPQ/lEF5vZE+rgZya0IvjtwAVX3jQYiSizq0zQzm7TkicbS 4BkK7FFmH+rR9LYHpQFWTBI4C/DVfCag5oC8hTsaWh9TL6zndprRSjW7hCKlyviD 2H4FCJsEbg+GOOmO60wK9WsZuly46jSlObkPgMiRRYZIHXWUkdav5K/1zgKsQ4Qy HPp+H/0iAOBZTV6fdQMNdPT1ssLig4m1Zcg1DwPIoMiZQ05ErlQ1+3i1u9TsXlMA 845SbcRFLDQMBcWmHARFpGhwtHXtaQU8w5kitazyXCnkXvFyKSWuJvCjZwiqIMQK XYvibAqdk8QnZHBNXx32T3BAsjyPqcb2oo129sk3qaEMenmwFuyyVo+ArJEV0YMX WZZhB5c+3xMjQvMTA5c7l05tUs44q9WYQJhppPyxbU8kScOcw87nHOUbrCqqJr7Y -----END RSA PRIVATE KEY-----
无效密钥文件
-----BEGIN EC PRIVATE KEY----- MIGNAgEAMBAGByqGSM49AgEGBSuBBAAKBHYwdAIBAQQgvuua2biCekB5C2oW/Ip3 Hi7YVb9nyaQp7GKpb8OomWOgBwYFK4EEAAqhRANCAATGVHYUkO49tiWNbhQHbmtC l1mW9L0btglwvhld9zFwQTNHq3g07RM4s4+DTmiQWBPtrF6S8xJekFiSs9dN6zl9 -----END EC PRIVATE KEY-----
我的代码
var bp: PBIO; PrivKeyFile, FCertPassword : AnsiString; begin Result := False; PrivKeyFile := 'private.pem'; FCertPassword := '123456789'; bp := BIO_new_file(PAnsiChar(PrivKeyFile), 'r'); if CheckError() then Exit; try FPrivateKeyData := PEM_read_bio_PrivateKey(bp, nil, nil, PAnsiChar(FCertPassword)); if CheckError() then Exit; finally BIO_free(bp); end; end;
错误信息
error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
问题分析与解决方法
- 问题根源:该错误说明EC私钥文件的ASN.1编码存在问题,从给出的无效密钥内容来看,文件明显被截断,内容不完整,导致OpenSSL无法正确解析ASN.1结构。
- 解决步骤:
- 重新生成完整的EC私钥文件,使用OpenSSL命令:
openssl ecparam -name prime256v1 -genkey -noout -out ec_private.pem,如果需要加密密钥,可添加-aes-128-cbc参数,生成时会提示设置密码。 - 检查现有EC私钥文件是否因传输、存储等原因被意外截断,确保从
-----BEGIN EC PRIVATE KEY-----到-----END EC PRIVATE KEY-----之间的所有内容完整无缺。 - 代码层面无需修改,
PEM_read_bio_PrivateKey是OpenSSL的通用私钥读取函数,支持RSA和EC私钥,只要密钥文件有效就能正常读取。
- 重新生成完整的EC私钥文件,使用OpenSSL命令:
内容的提问来源于stack exchange,提问作者Ehab
相关产品推荐
相关产品推荐

