class OpenSSL::X509::Store
Хранилище сертификатов X509 содержит доверенные сертификаты CA, используемые для проверки сертификатов узлов.
Проще всего создать полезное хранилище сертификатов следующим образом:
cert_store = OpenSSL::X509::Store.new cert_store.set_default_paths
При этом будут использоваться встроенные сертификаты вашей системы.
Если в вашей системе нет набора сертификатов по умолчанию, вы можете получить набор, извлечённый сопровождающими cURL из хранилища сертификатов CA Mozilla: 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
Атрибуты
Цепочка сертификатов, построенная при последнем вызове verify.
См. также StoreContext#chain.
Код ошибки, заданный при последнем вызове verify.
См. также StoreContext#error.
Описание кода ошибки, заданного при последнем вызове verify.
См. также StoreContext#error_string.
Функция обратного вызова для дополнительной проверки сертификатов. Она вызывается для каждого сертификата в цепочке и может использоваться для реализации пользовательских условий проверки сертификатов.
Функция обратного вызова вызывается с двумя значениями: логическим значением, указывающим, прошла ли предварительная проверка, выполняемая OpenSSL, и используемым StoreContext.
Функция обратного вызова может при необходимости изменить код ошибки с помощью StoreContext#error=. Она должна возвращать true или false.
ПРИМЕЧАНИЕ: любые исключения, возникшие внутри функции обратного вызова, будут проигнорированы.
См. также справочную страницу X509_STORE_CTX_set_verify_cb(3).
Общедоступные методы класса
static VALUE
ossl_x509store_initialize(int argc, VALUE *argv, VALUE self)
{
X509_STORE *store;
GetX509Store(self, store);
if (argc != 0)
rb_warn("OpenSSL::X509::Store.new does not take any arguments");
#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);
return self;
} Создаёт новое X509::Store.
Общедоступные методы экземпляра
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, "X509_STORE_add_cert");
return self;
} Добавляет OpenSSL::X509::Certificate cert в хранилище сертификатов.
См. также справочную страницу X509_STORE_add_cert(3).
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, "X509_STORE_add_crl");
return self;
} Добавляет OpenSSL::X509::CRL crl в хранилище.
См. также справочную страницу X509_STORE_add_crl(3).
static VALUE
ossl_x509store_add_file(VALUE self, VALUE file)
{
X509_STORE *store;
X509_LOOKUP *lookup;
const char *path;
GetX509Store(self, store);
path = StringValueCStr(file);
lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file());
if (!lookup)
ossl_raise(eX509StoreError, "X509_STORE_add_lookup");
if (X509_LOOKUP_load_file(lookup, path, X509_FILETYPE_PEM) != 1)
ossl_raise(eX509StoreError, "X509_LOOKUP_load_file");
#if OPENSSL_VERSION_NUMBER < 0x10101000 || defined(LIBRESSL_VERSION_NUMBER)
/*
* X509_load_cert_crl_file() which is called from X509_LOOKUP_load_file()
* did not check the return value of X509_STORE_add_{cert,crl}(), leaking
* "cert already in hash table" errors on the error queue, if duplicate
* certificates are found. This will be fixed by OpenSSL 1.1.1.
*/
ossl_clear_error();
#endif
return self;
} Добавляет сертификаты из file в хранилище сертификатов. file — это путь к файлу, содержащему один или несколько сертификатов в формате PEM, объединённых друг с другом.
См. также справочную страницу X509_LOOKUP_file(3).
static VALUE
ossl_x509store_add_path(VALUE self, VALUE dir)
{
X509_STORE *store;
X509_LOOKUP *lookup;
const char *path;
GetX509Store(self, store);
path = StringValueCStr(dir);
lookup = X509_STORE_add_lookup(store, X509_LOOKUP_hash_dir());
if (!lookup)
ossl_raise(eX509StoreError, "X509_STORE_add_lookup");
if (X509_LOOKUP_add_dir(lookup, path, X509_FILETYPE_PEM) != 1)
ossl_raise(eX509StoreError, "X509_LOOKUP_add_dir");
return self;
} Добавляет path в качестве каталога хешей, в котором хранилище будет выполнять поиск.
См. также справочную страницу X509_LOOKUP_hash_dir(3).
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;
} Задаёт флаги по умолчанию, используемые при проверке цепочки сертификатов с помощью Store.
flags состоит из одной или нескольких констант, определённых в OpenSSL::X509 и имеющих имя V_FLAG_*, объединённых побитовой операцией ИЛИ.
OpenSSL::X509::StoreContext#flags= позволяет изменить флаги для одной операции проверки.
См. также справочную страницу X509_VERIFY_PARAM_set_flags(3).
static VALUE
ossl_x509store_set_purpose(VALUE self, VALUE purpose)
{
X509_STORE *store;
int p = NUM2INT(purpose);
GetX509Store(self, store);
X509_STORE_set_purpose(store, p);
return 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_SIGN
OpenSSL::X509::StoreContext#purpose= позволяет изменить значение для одной операции проверки.
См. также справочную страницу X509_VERIFY_PARAM_set_purpose(3).
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, "X509_STORE_set_default_paths");
return Qnil;
} Настраивает store на поиск сертификатов CA по мере необходимости в системном хранилище сертификатов по умолчанию. Расположение хранилища обычно можно определить по следующим значениям:
-
OpenSSL::X509::DEFAULT_CERT_FILE
-
OpenSSL::X509::DEFAULT_CERT_DIR
См. также справочную страницу X509_STORE_set_default_paths(3).
static VALUE
ossl_x509store_set_time(VALUE self, VALUE time)
{
X509_STORE *store;
X509_VERIFY_PARAM *param;
GetX509Store(self, store);
#ifdef HAVE_X509_STORE_GET0_PARAM
param = X509_STORE_get0_param(store);
#else
param = store->param;
#endif
X509_VERIFY_PARAM_set_time(param, NUM2LONG(rb_Integer(time)));
return time;
} Задаёт время, используемое при проверке сертификатов с помощью хранилища. По умолчанию используется текущее системное время, если другое значение не указано.
OpenSSL::X509::StoreContext#time= позволяет изменить значение для одной операции проверки.
См. также справочную страницу X509_VERIFY_PARAM_set_time(3).
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;
} Задаёт параметры доверия по умолчанию, используемые при проверке сертификатов с помощью хранилища.
OpenSSL::X509::StoreContext#trust= позволяет изменить значение для одной операции проверки.
См. также справочную страницу X509_VERIFY_PARAM_set_trust(3).
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;
} Выполняет проверку сертификата OpenSSL::X509::Certificate cert.
chain может быть массивом объектов OpenSSL::X509::Certificate, используемых для построения цепочки сертификатов.
Если задан блок, он заменяет функцию обратного вызова, установленную с помощью verify_callback=.
После завершения проверки сведения об ошибке можно получить с помощью error и error_string, а построенную цепочку сертификатов — с помощью chain.
static VALUE
ossl_x509store_set_vfy_cb(VALUE self, VALUE cb)
{
X509_STORE *store;
GetX509Store(self, store);
rb_iv_set(self, "@verify_callback", cb);
// We don't need to trigger a write barrier because `rb_iv_set` did it.
X509_STORE_set_ex_data(store, store_ex_verify_cb_idx, (void *)cb);
return cb;
} Общая функция обратного вызова для проверки OpenSSL
Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.