2016-11-15 6 views
1

Я новичок в OpenSSL APIКак проверить сертификат с базовым ограничением «CA = true»?

, когда я использую OpenSSL APP с помощью этой команды:

openssl x509 -in mycert.crt -text -noout 

формы это выход моего интереса:

... 
    X509v3 extensions: 
     X509v3 Basic Constraints: critical 
      CA:TRUE <-- this section I want to validate in my code 
    ... 

Я хочу, чтобы проверить CA частично используя API OpenSSL c, но не может понять, как это сделать. Я пробурено вниз код APP Src, но заблудился, когда я прибыл в

openssl/crypto/ct/ct_prn:102 

BIO_printf(out, "\n%*sExtensions: ", indent + 4, ""); 
if (sct->ext_len == 0) 
    BIO_printf(out, "none"); 
else 
    BIO_hex_string(out, indent + 16, 16, sct->ext, sct->ext_len); 

мой вопрос: , что правильный способ перебора расширений, найти Лобовой основной Сдерживает раздел и проверить, что мой сертификат CA: ИСТИНА

бонусный вопрос: , что ваш метод поиска в OpenSSL API для методов

ответ

1

бонус вопрос: каков ваш метод поиска в 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; 
... 
+0

большого объяснения и +1 для проходных – LordTitiKaka