Ruby 2.4
OpenSSL

OpenSSL::X509::Store

class OpenSSL::X509::Store

父类:Object

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

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

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文件创建证书存储,如下所示:

cert_store = OpenSSL::X509::Store.new cert_store.add_file 'cacert.pem'

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

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。

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到证书存储区。

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到商店。

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编码证书。

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为商店查找的散列目录。

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定义的常量组成。

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

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; }

时间=时间显示来源

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

static VALUE ossl_x509store_set_time(VALUE self, VALUE time) { rb_iv_set(self, "@time", time return time; }

信任=信任显示源

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检索错误信息,并且可以通过链检索重设完成证书链。

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验证

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; }