X509_STORE_CTX这个结构主要是用来校验证书用,一般都会使用X509_STORE这个已经设置好的对象来初始化X509_STORE_CTX,初始化函数如下:
int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509,
STACK_OF(X509) *chain)
这个初始化函数参数说明一下,第二个参数store是用来初始化第一个参数ctx,第三个参数x509表示待验证的证书,chain是不信任证书链。
具体的校验函数也是在该init函数里面设定的,如果自己不需要(一般也不需要),那么使用openssl自带实现的internal_verify函数来进行证书链的校验。
if (store && store->verify)
ctx->verify = store->verify;
else
ctx->verify = internal_verify;
另外这个init函数中还设置了很多回调函数,基本上都是把X509_STORE的函数抄一份给X509_STORE_CTX。下面开始具体讲一讲internal_verify这个函数。
很早时候看过一些介绍性的书籍讲证书链的校验,一直以为证书校验过程是从leaf校验跟root的。实际看了openssl实现源码才知道原来是反着来的。
初始化X509_STORE_CTX这个结构之后,就开始证书链的校验了。其中校验的证书有两种类型:
1. 自签名证书。这种类型校验比较简单,从本地sto