Похоже, вы не тестируете то, что, по вашему мнению, тестируете.
Добавление следующего в конец своего фрагмента для получения дополнительной информации о ваших сертификатах
#define PRINT_NAMES(cert) \
printf("\n" #cert " subject name: "); \
X509_NAME_print_ex_fp(stdout, X509_get_subject_name(cert), 0, 0); \
printf("\n" #cert " issuer name: "); \
X509_NAME_print_ex_fp(stdout, X509_get_issuer_name(cert), 0, 0); \
printf("\n");
PRINT_NAMES(trusted_root);
PRINT_NAMES(untrusted_root);
PRINT_NAMES(untrusted_cert);
результаты в
trusted_root subject name: C=GB, ST=England, O=Alice Ltd, CN=ROOT
trusted_root issuer name: C=GB, ST=England, O=Alice Ltd, CN=ROOT
untrusted_root subject name: C=GB, ST=England, O=Alice Ltd, CN=FAKE_CA
untrusted_root issuer name: C=GB, ST=England, O=Alice Ltd, CN=FAKE_CA
untrusted_cert subject name: C=GB, ST=England, O=Alice Ltd, CN=FAKE_CA1
untrusted_cert issuer name: C=GB, ST=England, O=Alice Ltd, CN=ROOT
Так что untrusted_cert
был фактически выдан trusted_root
, что объясняет результат.
Чтобы быстро проверить то, что вы намеревались проверить, вы могли бы перевернуть имена два строковых литерала, поэтому определите первый как fakeRootPem
, а второй как rootPem
. Это сделает ROOT
ненадежным и FAKE_CA
доверенным для вашего кода и, следовательно, даст желаемый / ожидаемый результат.