Как вы проверяете сертификат с помощью корневого сертификата, который его подписал? Я зашел так далеко:
$root_x509 = Crypt::OpenSSL::X509->new_from_string($root_key_data, FORMAT_ASN1);
$root_key = Crypt::OpenSSL::RSA->new_public_key($x509->pubkey());
$other_x509 = Crypt::OpenSSL::X509->new_from_string($other_key_data, FORMAT_ASN1);
$other_key = Crypt::OpenSSL::RSA->new_public_key($x509->pubkey());
Хорошо, тогда что? Я не вижу очевидного $root_key->verify_certificate($other_x509); Crypt :: OpenSSL :: VerifyX509 - единственный / лучший ответ? Этот модуль проблематично скомпилировать и установить, но я продолжу в том же духе, если так будет. Но я чувствую, что что-то упускаю.
Похоже, например, что у python есть очевидный API, эквивалент которого я не вижу ни в одной из Perl-библиотек OpenSSL:
trusted_store = X509Store()
trusted_store.add_cert(trusted_root)
try:
X509StoreContext(trusted_store, itunes_cert).verify_certificate()
except X509StoreContextError as e:
print("iTunes certificate invalid")
Да, я смотрел на это. Модульные тесты не проходят, они не дают очевидных сбоев, и они не проходят по-разному на разных платформах (Centos 6, Centos 7, MacOS).
Исходный код Crypt :: OpenSSL :: VerifyX509 выглядит довольно просто. Не могли бы вы дать больше информации о неудаче?





После обширных исследований ближайшим к полному решению, помимо Crypt :: OpenSSL :: VerifyX509 (см. Выше), является Net :: SSLeay, который имеет целый набор низкоуровневых привязок к openssl. Недавно они добавили:
1.83 2018-01-06
X509_STORE_CTX_new and X509_verify_cert
но документация скудна, и мне не удалось устранить связанные с этим ошибки.
Вместо этого я проверил цепочку сертификатов вручную:
и повторите для каждого сертификата в цепочке.
Частью всего этого является проверка сроков действия и возможностей продления для каждого сертификата.
Взгляните на search.cpan.org/~chrisa/Crypt-OpenSSL-VerifyX509-0.10/…