бонус вопрос: каков ваш метод поиска в OpenSSL API для методов
К сожалению, нет простого способа в разы. Я проведу вас через шаги, которые я использую, чтобы ответить на такие уникальные вопросы.
Если вы знаете, что искать, иногда вы можете использовать браузер символов, например ctags. Однако я не использую его; вместо этого я обычно загораживаю источники.
Если вы когда-либо слышали, что OpenSSL является «самодокументирующийся», это является его воплощением.
мой вопрос: что такое правильный способ для перебора расширений, найти Лобовое основной Сдерживает раздел и проверить, что мой сертификат CA: ИСТИНА
Через некоторое время, вы вы почувствуете интересный материал. Из grep ниже я знаю его NID_basic_constraints
.
openssl-1.1.0b$ grep -iR basic * | grep constraint
crypto/objects/obj_dat.h: 0x55,0x1D,0x13, /* [ 505] OBJ_basic_constraints */
crypto/objects/obj_dat.h: {"basicConstraints", "X509v3 Basic Constraints", NID_basic_constraints, 3, &so[505]},
crypto/objects/obj_dat.h: 87, /* OBJ_basic_constraints 2 5 29 19 */
crypto/objects/obj_mac.num:basic_constraints 87
crypto/objects/objects.txt:!Cname basic-constraints
crypto/x509v3/v3_bcons.c: NID_basic_constraints, 0,
crypto/x509v3/v3_purp.c: NID_basic_constraints, /* 87 */
crypto/x509v3/v3_purp.c: /* Handle basic constraints */
crypto/x509v3/v3_purp.c: if ((bs = X509_get_ext_d2i(x, NID_basic_constraints, NULL, NULL)))
...
Сверху я знаю несколько вещей. Во-первых, v3_purp.c
- файл, представляющий интерес. Во-вторых, X509_get_ext_d2i(x, ...)
означает x
- X509*
. В-третьих, NID_basic_constraints
является предметом интереса.
И вот глава функции с интересами. BASIC_CONSTRAINTS
и оба bs->ca
выглядят интересными.
static void x509v3_cache_extensions(X509 *x)
{
BASIC_CONSTRAINTS *bs;
PROXY_CERT_INFO_EXTENSION *pci;
ASN1_BIT_STRING *usage;
ASN1_BIT_STRING *ns;
EXTENDED_KEY_USAGE *extusage;
X509_EXTENSION *ex;
int i;
if (x->ex_flags & EXFLAG_SET)
return;
X509_digest(x, EVP_sha1(), x->sha1_hash, NULL);
/* V1 should mean no extensions ... */
if (!X509_get_version(x))
x->ex_flags |= EXFLAG_V1;
/* Handle basic constraints */
if ((bs = X509_get_ext_d2i(x, NID_basic_constraints, NULL, NULL))) {
if (bs->ca)
x->ex_flags |= EXFLAG_CA;
if (bs->pathlen) {
if ((bs->pathlen->type == V_ASN1_NEG_INTEGER)
|| !bs->ca) {
x->ex_flags |= EXFLAG_INVALID;
x->ex_pathlen = 0;
} else
x->ex_pathlen = ASN1_INTEGER_get(bs->pathlen);
} else
x->ex_pathlen = -1;
BASIC_CONSTRAINTS_free(bs);
x->ex_flags |= EXFLAG_BCONS;
}
...
}
Следующая, заказ BASIC_CONSTRAINTS
. Вы хотите _st
, потому что именно так OpenSSL называет свои структуры.
$ grep -IR BASIC_CONSTRAINTS * | grep _st
include/openssl/x509v3.h:typedef struct BASIC_CONSTRAINTS_st {
И быстрый взгляд подхалима на BASIC_CONSTRAINTS_st
:
typedef struct BASIC_CONSTRAINTS_st {
int ca;
ASN1_INTEGER *pathlen;
} BASIC_CONSTRAINTS;
Последний вопрос может быть, как вы ухватить в X509 *x
? Ну, вы поняли, что от:
SSL_get_peer_certificate
(от соединения с SSL)
PEM_read_X509
(преобразование из кодировки PEM)
d2i_X509
(преобразование из ASN.1/кодирования DER)
- и т.д .. .
Если у вас уже есть X509* x
, это выглядит Лик e вам нужно только проверить на x->ex_flags & EXFLAG_V1
.
Lather, полоскание, повторяет для EXFLAG_V1
и X509_st
:
$ grep -IR EXFLAG_V1 * | grep define
crypto/x509v3/v3_purp.c:#define V1_ROOT (EXFLAG_V1|EXFLAG_SS)
include/openssl/x509v3.h:# define EXFLAG_V1 0x40
$ grep -IR X509 * | grep _st | grep typedef
crypto/x509v3/pcy_int.h:typedef struct X509_POLICY_DATA_st X509_POLICY_DATA;
include/openssl/ossl_typ.h:typedef struct x509_st X509;
include/openssl/ossl_typ.h:typedef struct X509_algor_st X509_ALGOR;
include/openssl/ossl_typ.h:typedef struct X509_crl_st X509_CRL;
...
большого объяснения и +1 для проходных – LordTitiKaka