首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

OpenSSL::X509::Store

父类:Object

X509证书存储包含用于验证对等证书的可信CA证书。

创建有用证书存储的最简单方法是:

代码语言:javascript
复制
cert_store = OpenSSL::X509::Store.new
cert_store.set_default_paths

这将使用您系统的内置证书。

如果你的系统没有默认的证书集合,你可以从cURL维护人员那里获得一个从Mozilla CA证书存储中提取的集合:curl.haxx.se/docs/caextract.html(你可能希望使用firefox-db2pem.sh脚本从本地安装中提取证书以避免中间人攻击。)

从上面的链接下载或生成cacert.pem后,您可以从pem文件创建证书存储,如下所示:

代码语言:javascript
复制
cert_store = OpenSSL::X509::Store.new
cert_store.add_file 'cacert.pem'

证书存储可以与SSLSocket一起使用,如下所示:

代码语言:javascript
复制
ssl_context = OpenSSL::SSL::SSLContext.new
ssl_context.verify_mode = OpenSSL::SSL::VERIFY_PEER
ssl_context.cert_store = cert_store

tcp_socket = TCPSocket.open 'example.com', 443

ssl_socket = OpenSSL::SSL::SSLSocket.new tcp_socket, ssl_context

属性

chainR

由最后一次验证调用构建的证书链。

errorR

由最后一次调用所设置的错误代码。

error_stringR

由最后一次调用所设置的错误代码的描述。

verify_callbackR

额外证书验证的回调。它针对链中的每个不可信证书进行调用。

该回调被调用两个值,一个布尔值,用于指示OpenSSL的预验证是否成功,以及StoreContext是否正在使用。回调必须返回true或false。

公共类方法

X509 :: Store.new→存储显示源文件

创建一个新的X509 :: Store。

代码语言:javascript
复制
static VALUE
ossl_x509store_initialize(int argc, VALUE *argv, VALUE self)
{
    X509_STORE *store;

/* BUG: This method takes any number of arguments but appears to ignore them. */
    GetX509Store(self, store);
#if !defined(HAVE_OPAQUE_OPENSSL)
    /* [Bug #405] [Bug #1678] [Bug #3000]; already fixed? */
    store->ex_data.sk = NULL;
#endif
    X509_STORE_set_verify_cb(store, x509store_verify_cb);
    ossl_x509store_set_vfy_cb(self, Qnil);

    /* last verification status */
    rb_iv_set(self, "@error", Qnil);
    rb_iv_set(self, "@error_string", Qnil);
    rb_iv_set(self, "@chain", Qnil);
    rb_iv_set(self, "@time", Qnil);

    return self;
}

公共实例方法

add_cert(cert)显示源文件

将OpenSSL :: X509 :: Certificate添加cert到证书存储区。

代码语言:javascript
复制
static VALUE
ossl_x509store_add_cert(VALUE self, VALUE arg)
{
    X509_STORE *store;
    X509 *cert;

    cert = GetX509CertPtr(arg); /* NO NEED TO DUP */
    GetX509Store(self, store);
    if (X509_STORE_add_cert(store, cert) != 1){
        ossl_raise(eX509StoreError, NULL);
    }

    return self;
}

add_crl(crl)→自己显示源文件

将OpenSSL :: X509 :: CRL添加crl到商店。

代码语言:javascript
复制
static VALUE
ossl_x509store_add_crl(VALUE self, VALUE arg)
{
    X509_STORE *store;
    X509_CRL *crl;

    crl = GetX509CRLPtr(arg); /* NO NEED TO DUP */
    GetX509Store(self, store);
    if (X509_STORE_add_crl(store, crl) != 1){
        ossl_raise(eX509StoreError, NULL);
    }

    return self;
}

add_file(文件)→自己显示源文件

将证书添加file到证书存储区。在file可以包含多个PEM编码证书。

代码语言:javascript
复制
static VALUE
ossl_x509store_add_file(VALUE self, VALUE file)
{
    X509_STORE *store;
    X509_LOOKUP *lookup;
    char *path = NULL;

    if(file != Qnil){
        rb_check_safe_obj(file);
        path = StringValueCStr(file);
    }
    GetX509Store(self, store);
    lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file());
    if(lookup == NULL) ossl_raise(eX509StoreError, NULL);
    if(X509_LOOKUP_load_file(lookup, path, X509_FILETYPE_PEM) != 1){
        ossl_raise(eX509StoreError, NULL);
    }

    return self;
}

add_path(路径)→self显示源

添加path为商店查找的散列目录。

代码语言:javascript
复制
static VALUE
ossl_x509store_add_path(VALUE self, VALUE dir)
{
    X509_STORE *store;
    X509_LOOKUP *lookup;
    char *path = NULL;

    if(dir != Qnil){
        rb_check_safe_obj(dir);
        path = StringValueCStr(dir);
    }
    GetX509Store(self, store);
    lookup = X509_STORE_add_lookup(store, X509_LOOKUP_hash_dir());
    if(lookup == NULL) ossl_raise(eX509StoreError, NULL);
    if(X509_LOOKUP_add_dir(lookup, path, X509_FILETYPE_PEM) != 1){
        ossl_raise(eX509StoreError, NULL);
    }

    return self;
}

标志=标志显示源

设置flag为商店。flag由零个或多个以名称V_FLAG_ *或or'ed定义的常量组成。

代码语言:javascript
复制
static VALUE
ossl_x509store_set_flags(VALUE self, VALUE flags)
{
    X509_STORE *store;
    long f = NUM2LONG(flags);

    GetX509Store(self, store);
    X509_STORE_set_flags(store, f);

    return flags;
}

目的=目的显示源

将商店的用途设置为purpose。如果指定,商店的验证将检查每个不受信任的证书的扩展与目的是否一致。目的是由常量指定的:

  • X509::PURPOSE_SSL_CLIENT
  • X509::PURPOSE_SSL_SERVER
  • X509::PURPOSE_NS_SSL_SERVER
  • X509::PURPOSE_SMIME_SIGN
  • X509::PURPOSE_SMIME_ENCRYPT
  • X509::PURPOSE_CRL_SIGN
  • X509::PURPOSE_ANY
  • X509::PURPOSE_OCSP_HELPER
  • X509 :: PURPOSE_TIMESTAMP_SIGNstatic VALUE ossl_x509store_set_purpose(VALUE self,VALUE purpose){X509_STORE * store; int p = NUM??2INT(purpose); GetX509Store(self,store); X509_STORE_set_purpose(store,p); 返回目的; } set_default_paths显示源配置store根据需要从系统默认证书存储中查找CA证书。商店的位置通常可以通过以下方式确定:
  • OpenSSL::X509::DEFAULT_CERT_FILE
  • OpenSSL::X509::DEFAULT_CERT_DIR
代码语言:javascript
复制
static VALUE
ossl_x509store_set_default_paths(VALUE self)
{
    X509_STORE *store;

    GetX509Store(self, store);
    if (X509_STORE_set_default_paths(store) != 1){
        ossl_raise(eX509StoreError, NULL);
    }

    return Qnil;
}

时间=时间显示来源

设置在验证中使用的时间。

代码语言:javascript
复制
static VALUE
ossl_x509store_set_time(VALUE self, VALUE time)
{
    rb_iv_set(self, "@time", time);
    return time;
}

信任=信任显示源

代码语言:javascript
复制
static VALUE
ossl_x509store_set_trust(VALUE self, VALUE trust)
{
    X509_STORE *store;
    int t = NUM2INT(trust);

    GetX509Store(self, store);
    X509_STORE_set_trust(store, t);

    return trust;
}

验证(cert,chain = nil)→true | 假显示源

在OpenSSL :: X509 ::证书上执行证书验证cert

chain 可以是用于构建证书链的OpenSSL :: X509 :: Certificate数组。

如果给出了一个块,它将覆盖verify_callback =设置的回调。

验证完成后,可以通过错误error_string检索错误信息,并且可以通过链检索重设完成证书链。

代码语言:javascript
复制
static VALUE
ossl_x509store_verify(int argc, VALUE *argv, VALUE self)
{
    VALUE cert, chain;
    VALUE ctx, proc, result;

    rb_scan_args(argc, argv, "11", &cert, &chain);
    ctx = rb_funcall(cX509StoreContext, rb_intern("new"), 3, self, cert, chain);
    proc = rb_block_given_p() ?  rb_block_proc() :
           rb_iv_get(self, "@verify_callback");
    rb_iv_set(ctx, "@verify_callback", proc);
    result = rb_funcall(ctx, rb_intern("verify"), 0);

    rb_iv_set(self, "@error", ossl_x509stctx_get_err(ctx));
    rb_iv_set(self, "@error_string", ossl_x509stctx_get_err_string(ctx));
    rb_iv_set(self, "@chain", ossl_x509stctx_get_chain(ctx));

    return result;
}

verify_callback =(p1)显示来源

一般回调OpenSSL验证

代码语言:javascript
复制
static VALUE
ossl_x509store_set_vfy_cb(VALUE self, VALUE cb)
{
    X509_STORE *store;

    GetX509Store(self, store);
    X509_STORE_set_ex_data(store, store_ex_verify_cb_idx, (void *)cb);
    rb_iv_set(self, "@verify_callback", cb);

    return cb;
}

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com