我已经完成了从PEM QString加载x509的功能。 这个函数适用于大多数证书,但对某些人来说有一个奇怪的行为:
X509* Certificat::stringPEMToX509(QString* stringPem)
{
X509* certificat;
BIO* bio = BIO_new(BIO_s_mem());
const char* pem = stringPem->toAscii().constData();
BIO_puts(bio, pem);
certificat = PEM_read_bio_X509(bio, NULL, NULL, NULL);
if (certificat == NULL)
{
//Here is the problem
//Sometimes OpenSSL just return "no start line"
//But after 3 or 4 tries, it work and load the PEM into the x509
return Certificat::stringPEMToX509(stringPem);
}
BIO_free_all(bio);
return certificat;
}
有时OpenSSL不想加载我的PEM并且PEM_read_bio_X509
返回NULL,但如果我再次尝试3或4次(有时更少,有时更多),它将起作用。
如果我在返回NULL时检查ERR_reason_error_string(err)
,则会收到no start line
错误。
这是为什么?它看起来完全随机。 我犯了什么错误吗?
我知道简单地一遍又一遍地回忆这个函数是不好的,因为如果问题持续存在会产生一个无限循环,但那不是主题,我会在以后做一个for循环。