类 OpenSSL::X509::StoreContext

一个 StoreContext 用于验证单个证书,并保存相关状态。

公共类方法

new(store, cert = nil, untrusted = nil) 点击切换源代码

为 X.509 证书 cert 的验证设置一个 StoreContext

static VALUE
ossl_x509stctx_initialize(int argc, VALUE *argv, VALUE self)
{
    VALUE store, cert, chain, t;
    X509_STORE_CTX *ctx;
    X509_STORE *x509st;
    X509 *x509 = NULL;
    STACK_OF(X509) *x509s = NULL;
    int state;

    rb_scan_args(argc, argv, "12", &store, &cert, &chain);
    GetX509StCtx(self, ctx);
    GetX509Store(store, x509st);
    if (!NIL_P(cert))
        x509 = DupX509CertPtr(cert); /* NEED TO DUP */
    if (!NIL_P(chain)) {
        x509s = ossl_protect_x509_ary2sk(chain, &state);
        if (state) {
            X509_free(x509);
            rb_jump_tag(state);
        }
    }
    if (X509_STORE_CTX_init(ctx, x509st, x509, x509s) != 1){
        X509_free(x509);
        sk_X509_pop_free(x509s, X509_free);
        ossl_raise(eX509StoreError, "X509_STORE_CTX_init");
    }
    if (!NIL_P(t = rb_iv_get(store, "@time")))
        ossl_x509stctx_set_time(self, t);
    rb_iv_set(self, "@verify_callback", rb_iv_get(store, "@verify_callback"));
    rb_iv_set(self, "@cert", cert);

    return self;
}

公共实例方法

chain → nil | Array of X509::Certificate 点击切换源代码

返回已验证的链。

另请参见手册页 X509_STORE_CTX_set0_verified_chain(3)。

static VALUE
ossl_x509stctx_get_chain(VALUE self)
{
    X509_STORE_CTX *ctx;
    const STACK_OF(X509) *chain;

    GetX509StCtx(self, ctx);
    chain = X509_STORE_CTX_get0_chain(ctx);
    if (!chain)
        return Qnil; /* Could be an empty array instead? */
    return ossl_x509_sk2ary(chain);
}
cleanup() 点击切换源代码
# File ext/openssl/lib/openssl/x509.rb, line 337
def cleanup
  warn "(#{caller.first}) OpenSSL::X509::StoreContext#cleanup is deprecated with no replacement" if $VERBOSE
end
current_cert → X509::Certificate 点击切换源代码

返回导致错误的证书。

另请参见手册页 X509_STORE_CTX_get_current_cert(3)。

static VALUE
ossl_x509stctx_get_curr_cert(VALUE self)
{
    X509_STORE_CTX *ctx;

    GetX509StCtx(self, ctx);

    return ossl_x509_new(X509_STORE_CTX_get_current_cert(ctx));
}
current_crl → X509::CRL 点击切换源代码

返回导致错误的 CRL

另请参见手册页 X509_STORE_CTX_get_current_crl(3)。

static VALUE
ossl_x509stctx_get_curr_crl(VALUE self)
{
    X509_STORE_CTX *ctx;
    X509_CRL *crl;

    GetX509StCtx(self, ctx);
    crl = X509_STORE_CTX_get0_current_crl(ctx);
    if (!crl)
        return Qnil;

    return ossl_x509crl_new(crl);
}
error → Integer 点击切换源代码

返回 stctx 的错误代码。这通常在 verify 完成后调用,或者从设置为 OpenSSL::X509::Store#verify_callback= 的验证回调中调用。

另请参见手册页 X509_STORE_CTX_get_error(3)。

static VALUE
ossl_x509stctx_get_err(VALUE self)
{
    X509_STORE_CTX *ctx;

    GetX509StCtx(self, ctx);

    return INT2NUM(X509_STORE_CTX_get_error(ctx));
}
error = error_code 点击切换源代码

设置 stctx 的错误代码。这由设置为 OpenSSL::X509::Store#verify_callback= 的验证回调使用。

另请参见手册页 X509_STORE_CTX_set_error(3)。

static VALUE
ossl_x509stctx_set_error(VALUE self, VALUE err)
{
    X509_STORE_CTX *ctx;

    GetX509StCtx(self, ctx);
    X509_STORE_CTX_set_error(ctx, NUM2INT(err));

    return err;
}
error_depth → Integer 点击切换源代码

返回链的深度。这与 error 一起使用。

另请参见手册页 X509_STORE_CTX_get_error_depth(3)。

static VALUE
ossl_x509stctx_get_err_depth(VALUE self)
{
    X509_STORE_CTX *ctx;

    GetX509StCtx(self, ctx);

    return INT2NUM(X509_STORE_CTX_get_error_depth(ctx));
}
error_string → String 点击切换源代码

返回由 error 获取的错误代码对应的可读错误字符串。

另请参见手册页 X509_verify_cert_error_string(3)。

static VALUE
ossl_x509stctx_get_err_string(VALUE self)
{
    X509_STORE_CTX *ctx;
    long err;

    GetX509StCtx(self, ctx);
    err = X509_STORE_CTX_get_error(ctx);

    return rb_str_new2(X509_verify_cert_error_string(err));
}
flags = flags 点击切换源代码

将验证标志设置为上下文。这将覆盖由 Store#flags= 设置的默认值。

另请参见手册页 X509_VERIFY_PARAM_set_flags(3)。

static VALUE
ossl_x509stctx_set_flags(VALUE self, VALUE flags)
{
    X509_STORE_CTX *store;
    long f = NUM2LONG(flags);

    GetX509StCtx(self, store);
    X509_STORE_CTX_set_flags(store, f);

    return flags;
}
purpose = purpose 点击切换源代码

设置上下文的用途。这将覆盖由 Store#purpose= 设置的默认值。

另请参见手册页 X509_VERIFY_PARAM_set_purpose(3)。

static VALUE
ossl_x509stctx_set_purpose(VALUE self, VALUE purpose)
{
    X509_STORE_CTX *store;
    int p = NUM2INT(purpose);

    GetX509StCtx(self, store);
    X509_STORE_CTX_set_purpose(store, p);

    return purpose;
}
time = time 点击切换源代码

设置验证中使用的日期时间。如果未设置,则使用当前日期时间。

另请参见手册页 X509_VERIFY_PARAM_set_time(3)。

static VALUE
ossl_x509stctx_set_time(VALUE self, VALUE time)
{
    X509_STORE_CTX *store;
    long t;

    t = NUM2LONG(rb_Integer(time));
    GetX509StCtx(self, store);
    X509_STORE_CTX_set_time(store, 0, t);

    return time;
}
trust = trust 点击切换源代码

设置上下文的信任设置。这将覆盖由 Store#trust= 设置的默认值。

另请参见手册页 X509_VERIFY_PARAM_set_trust(3)。

static VALUE
ossl_x509stctx_set_trust(VALUE self, VALUE trust)
{
    X509_STORE_CTX *store;
    int t = NUM2INT(trust);

    GetX509StCtx(self, store);
    X509_STORE_CTX_set_trust(store, t);

    return trust;
}
verify → true | false 点击切换源代码

使用设置为 stctx 的参数执行证书验证。

另请参见手册页 X509_verify_cert(3)。

static VALUE
ossl_x509stctx_verify(VALUE self)
{
    X509_STORE_CTX *ctx;

    GetX509StCtx(self, ctx);
    VALUE cb = rb_iv_get(self, "@verify_callback");
    X509_STORE_CTX_set_ex_data(ctx, stctx_ex_verify_cb_idx, (void *)cb);

    switch (X509_verify_cert(ctx)) {
      case 1:
        return Qtrue;
      case 0:
        ossl_clear_error();
        return Qfalse;
      default:
        ossl_raise(eX509CertError, "X509_verify_cert");
    }
}