自签名证书研究

在openssl源码中找到X509的定义:

struct x509_st {
    X509_CINF *cert_info;
    X509_ALGOR *sig_alg;
    ASN1_BIT_STRING *signature;
    int valid;
    int references;
    char *name;
    CRYPTO_EX_DATA ex_data;
    /* These contain copies of various extension values */
    long ex_pathlen;
    long ex_pcpathlen;
    unsigned long ex_flags;
    unsigned long ex_kusage;
    unsigned long ex_xkusage;
    unsigned long ex_nscert;
    ASN1_OCTET_STRING *skid;
    AUTHORITY_KEYID *akid;
    X509_POLICY_CACHE *policy_cache;
    STACK_OF(DIST_POINT) *crldp;
    STACK_OF(GENERAL_NAME) *altname;
    NAME_CONSTRAINTS *nc;
# ifndef OPENSSL_NO_RFC3779
    STACK_OF(IPAddressFamily) *rfc3779_addr;
    struct ASIdentifiers_st *rfc3779_asid;
# endif
# ifndef OPENSSL_NO_SHA
    unsigned char sha1_hash[SHA_DIGEST_LENGTH];
# endif
    X509_CERT_AUX *aux;
} /* X509 */ ;

有如下代码片段来验证一个证书 是否为自签名证书

自签名证书研究_第1张图片


1、首先比较证书的subject和issuer是否相同。

2、检查证书的SKID和AKID是否相同。(subject key identifier、authority key identifier)


观察一个证书的内容:(将证书内容用ASN.1工具解码出来)

自签名证书研究_第2张图片

红色部分就是SKID和AKID的内容。


对应在openssl中的信息。





==============================================================================================================================


上述SKID和AKID是在证书扩展里的内容。证书扩展是可有可无的。所以,当不存在SKID和AKID的时候,只能通过判断subject和issuer。



你可能感兴趣的:(OpenSSL,证书)