OpenSSL определение самоподписанного :
Имена субъектов и издателей совпадают и значения расширений подразумевают, что он самоподписан.
Код , который определяет, является ли сертификат самоподписанным :
/* Return 1 is a certificate is self signed */
static int cert_self_signed(X509 *x)
{
X509_check_purpose(x, -1, 0);
if (x->ex_flags & EXFLAG_SS)
return 1;
else
return 0;
}
И код , который устанавливает EXFLAG_SS
:
/* Does subject name match issuer ? */
if (!X509_NAME_cmp(X509_get_subject_name(x), X509_get_issuer_name(x))) {
x->ex_flags |= EXFLAG_SI;
/* If SKID matches AKID also indicate self signed */
if (X509_check_akid(x, x->akid) == X509_V_OK &&
!ku_reject(x, KU_KEY_CERT_SIGN))
x->ex_flags |= EXFLAG_SS;
}
Итак, в основном нужно проверить три вещи:
- Имя субъекта и имя эмитента должны совпадать
- Идентификатор ключа субъекта и идентификатор ключа доступа должны совпадать
- Сертификат должен содержать расширение использования ключа с установленным битом
KU_KEY_CERT_SIGN
Вы уже сравниваете имя субъекта и имя эмитента. Следующее, что нужно сделать, это сравнить SKID и AKID. После беглого взгляда на pyopenssl это не похоже на способ проверить это, поэтому, если вам нужно чистое решение Python, вам, возможно, придется расширить библиотеку. Однако даже код, который у вас есть, вероятно, охватит вас в 95% случаев, когда вы сказали, что хотите, чтобы он покрывал.