Spec-Zone.ru › Ruby 3.1

class OpenSSL::X509::Store

Parent:
Объект

Хранилище сертификатов X509 содержит доверенные сертификаты ЦС, используемые для проверки сертификатов партнёров.

Самый простой способ создать полезное хранилище сертификатов:

cert_store = OpenSSL::X509::Store.new
cert_store.set_default_paths

Это воспользуется встроенными сертификатами вашей системы.

Если в вашей системе нет набора сертификатов по умолчанию, вы можете получить набор, извлечённый из хранилища сертификатов Mozilla CA, от разработчиков cURL здесь: 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

Атрибуты

chain[R]

Цепочка сертификатов, построенная последним вызовом verify.

См. также StoreContext#chain.

error[R]

Код ошибки, установленный последним вызовом verify.

См. также StoreContext#error.

error_string[R]

Описание кода ошибки, установленного последним вызовом verify.

См. также StoreContext#error_string.

verify_callback[R]

Обратный вызов для дополнительной проверки сертификатов. Вызывается для каждого сертификата в цепочке и может использоваться для реализации пользовательских условий проверки сертификатов.

Обратный вызов вызывается со двумя значениями: булевым значением, которое указывает, прошла ли предварительная проверка OpenSSL, и используемым StoreContext.

Обратный вызов может использовать StoreContext#error= для изменения кода ошибки по мере необходимости. Обратный вызов должен возвращать либо true, либо false.

ПРИМЕЧАНИЕ: любые исключения, поднятые внутри обратного вызова, будут игнорироваться.

См. также страницу руководства X509_STORE_CTX_set_verify_cb(3).

Открытые методы класса

X509::Store.new → store Показать исходный код
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);
    rb_iv_set(self, "@time", Qnil);

    return self;
}

Создаёт новое хранилище X509::Store.

Открытые методы экземпляра

add_cert(cert) → self Показать исходный код
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).

add_crl(crl) → self Показать исходный код
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).

add_file(file) → self Показать исходный код
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).

add_path(path) → self Показать исходный код
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).

flags = flags Показать исходный код
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).

purpose = purpose Показать исходный код
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).

set_default_paths Показать исходный код
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).

time = time Показать исходный код
static VALUE
ossl_x509store_set_time(VALUE self, VALUE time)
{
    rb_iv_set(self, "@time", time);
    return time;
}

Устанавливает время, которое будет использоваться при проверке сертификатов с помощью хранилища. По умолчанию, если не указано, используется текущее системное время.

OpenSSL::X509::StoreContext#time= можно использовать для изменения значения для отдельной операции проверки.

См. также страницу руководства X509_VERIFY_PARAM_set_time(3).

trust = trust Показать исходный код
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).

verify(cert, chain = nil) → true | false Показать исходный код
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.

verify_callback=(p1) Показать исходный код
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 верификации.

Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API