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_x509
store
_set_purpose(VALUE self,VALUE purpose){X509_STORE *store
; int p = NUM2INT(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;
}