Я застрял на действительно странной проблеме, возникающей в CMS_verify () в OpenSSL. Я разрабатываю метод для подписи и проверки данных в C ++ с помощью OpenSSL, но проверка выдает очень странную ошибку, как видно из следующей заглушки кода:
// Sign
BIO_puts(in, "My test string.");
cms = CMS_sign(serverCert, privateKey, recips, in, CMS_BINARY);
if (!cms) {
cout << ERR_error_string(ERR_get_error(), NULL) << endl;
} else {
cout << "Successfully signed!" << endl;
}
// Verify
if (!CMS_verify(cms, certs, st, NULL, out, 0)) {
cout << ERR_error_string(ERR_get_error(), NULL) << endl;
} else {
cout << "Successfully verified!" << endl;
}
size = BIO_get_mem_data(out, &outString);
cout << "Verified string: " << string(outString, size) << endl;
BIO_ctrl(out, BIO_CTRL_RESET, 0, NULL);
// Verify without certificate verification
if (!CMS_verify(cms, certs, st, NULL, out, CMS_NO_SIGNER_CERT_VERIFY)) {
cout << ERR_error_string(ERR_get_error(), NULL) << endl;
} else {
cout << "Successfully verified!" << endl;
}
signers = CMS_get0_signers(cms);
for (int i = 0; i < sk_X509_num(signers); i++) {
X509_STORE_CTX_init(storeCtx, st, sk_X509_value(signers, i), NULL);
if (!X509_verify_cert(storeCtx)) {
cout << X509_verify_cert_error_string(storeCtx->error) << endl;
} else {
cout << "Signer certificate has been verified." << endl;
}
}
size = BIO_get_mem_data(out, &outString);
cout << "Verified string: " << string(outString, size) << endl;
Соответствующий вывод:
Successfully signed!
error:2E099064:CMS routines:CMS_SIGNERINFO_VERIFY_CERT:certificate verify error
Verified string:
Successfully verified!
Signer certificate has been verified.
Verified string: My test string.
Таким образом, как можно видеть, сертификаты, которые я использую, являются действительными, но каким-то образом метод CMS_Verify () не может проверить конвертированные сертификаты в моей структуре CMS.
Кажется, мой обходной путь работает, но мне действительно интересно узнать, что я делаю неправильно.
Так может кто-нибудь, пожалуйста, помогите мне?
Задача ещё не решена.