Spec-Zone.ru › Ruby 3.2

класс OpenSSL::X509::Store

Родитель:
Объект

Хранилище 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