非常教程

Ruby 2.4参考手册

OpenSSL

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

OpenSSL相关

1.OpenSSL::ASN1
2.OpenSSL::ASN1::ASN1Data
3.OpenSSL::ASN1::ASN1Error
4.OpenSSL::ASN1::Constructive
5.OpenSSL::ASN1::ObjectId
6.OpenSSL::ASN1::Primitive
7.OpenSSL::BN
8.OpenSSL::BNError
9.OpenSSL::Buffering
10.OpenSSL::Cipher
11.OpenSSL::Cipher::Cipher
12.OpenSSL::Config
13.OpenSSL::ConfigError
14.OpenSSL::Digest
15.OpenSSL::Digest::DigestError
16.OpenSSL::Engine
17.OpenSSL::Engine::EngineError
18.OpenSSL::ExtConfig
19.OpenSSL::HMAC
20.OpenSSL::HMACError
21.OpenSSL::Netscape
22.OpenSSL::Netscape::SPKI
23.OpenSSL::Netscape::SPKIError
24.OpenSSL::OCSP
25.OpenSSL::OCSP::BasicResponse
26.OpenSSL::OCSP::CertificateId
27.OpenSSL::OCSP::OCSPError
28.OpenSSL::OCSP::Request
29.OpenSSL::OCSP::Response
30.OpenSSL::OCSP::SingleResponse
31.OpenSSL::OpenSSLError
32.OpenSSL::PKCS12
33.OpenSSL::PKCS5
34.OpenSSL::PKCS5::PKCS5Error
35.OpenSSL::PKCS7
36.OpenSSL::PKCS7::RecipientInfo
37.OpenSSL::PKCS7::SignerInfo
38.OpenSSL::PKey
39.OpenSSL::PKey::DH
40.OpenSSL::PKey::DHError
41.OpenSSL::PKey::DSA
42.OpenSSL::PKey::DSAError
43.OpenSSL::PKey::EC
44.OpenSSL::PKey::EC::Group
45.OpenSSL::PKey::EC::Point
46.OpenSSL::PKey::PKey
47.OpenSSL::PKey::PKeyError
48.OpenSSL::PKey::RSA
49.OpenSSL::PKey::RSAError
50.OpenSSL::Random
51.OpenSSL::SSL
52.OpenSSL::SSL::Session
53.OpenSSL::SSL::SocketForwarder
54.OpenSSL::SSL::SSLContext
55.OpenSSL::SSL::SSLError
56.OpenSSL::SSL::SSLServer
57.OpenSSL::SSL::SSLSocket
58.OpenSSL::X509::Attribute
59.OpenSSL::X509::Certificate
60.OpenSSL::X509::CRL
61.OpenSSL::X509::Extension
62.OpenSSL::X509::ExtensionFactory
63.OpenSSL::X509::Name
64.OpenSSL::X509::Name::RFC2253DN
65.OpenSSL::X509::Request
66.OpenSSL::X509::Revoked
67.OpenSSL::X509::StoreContext
Ruby 2.4

Ruby 是一种面向对象、命令式、函数式、动态的通用编程语言,是世界上最优美而巧妙的语言。

主页 https://www.ruby-lang.org/
源码 https://github.com/ruby/ruby
版本 2.4
发布版本 2.4.1

Ruby 2.4目录

1.缩略 | Abbrev
2.ARGF
3.数组 | Array
4.Base64
5.基本对象 | BasicObject
6.基准测试 | Benchmark
7.BigDecimal
8.绑定 | Binding
9.CGI
10.类 | Class
11.比较 | Comparable
12.负责 | Complex
13.计算续体 | Continuation
14.覆盖 | Coverage
15.CSV
16.日期 | Date
17.日期时间 | DateTime
18.DBM
19.代理 | Delegator
20.摘要 | Digest
21.Dir
22.DRb
23.编码 | Encoding
24.枚举 | Enumerable
25.枚举 | Enumerator
26.ENV
27.ERB
28.错误 | Errors
29.Etc
30.期望值 | Exception
31.错误类 | FalseClass
32.Fiber
33.Fiddle
34.文件 | File
35.文件实用程序 | FileUtils
36.查找 | Find
37.浮点 | Float
38.Forwardable
39.GC
40.GDBM
41.GetoptLong
42.Hash
43.Integer
44.IO
45.IPAddr
46.JSON
47.Kernel
48.语言 | 3Language
49.记录 | Logger
50.编排 | Marshal
51.MatchData
52.数学 | Math
53.矩阵 | Matrix
54.方法 | Method
55.模型 | Module
56.监控 | Monitor
57. 互斥 | Mutex
58.Net
59.Net::FTP
60.Net::HTTP
61.Net::IMAP
62.Net::SMTP
63.NilClass
64.数字 | Numeric
65.对象 | Object
66.ObjectSpace
67.Observable
68.Open3
69.OpenSSL
70.OpenStruct
71.OpenURI
72.OptionParser
73.路径名 | Pathname
74.完整输出 | PrettyPrint
75.Prime
76.Proc
77.过程 | Process
78.PStore
79.PTY
80.队列 | Queue
81.随机 | Random
82.范围 | Range
83.合理的 | Rational
84.Readline
85.Regexp
86.Resolv
87.Ripper
88.RubyVM
89.Scanf
90.SDBM
91.SecureRandom
92.Set
93.Shell
94.信号 | Signal
95.Singleton
96.套接字 | Socket
97.字符串 | String
98.StringIO
99.StringScanner
100.结构 | Struct