Spec-Zone.ru › Ruby 2.3

класс OpenSSL::SSL::SSLSocket

Родитель:
Object
Включенные модули:
OpenSSL::Buffering, OpenSSL::SSL::SocketForwarder

Следующие атрибуты доступны, но не отображаются в rdoc.

  • io, context, sync_close

Методы публичного класса

new(io, ctx = nil) Показать исходный код
# File ext/openssl/lib/openssl/ssl.rb, line 254
def initialize(io, ctx = nil); raise NotImplementedError; end

Методы публичного экземпляра

accept → self Показать исходный код
static VALUE
ossl_ssl_accept(VALUE self)
{
    ossl_ssl_setup(self);

    return ossl_start_ssl(self, SSL_accept, "SSL_accept", Qfalse);
}

Ожидает, пока клиент SSL/TLS инициирует установление соединения. Установление соединения может начаться после отправки нешифрованных данных по сокету.

accept_nonblock([options]) → self Показать исходный код
static VALUE
ossl_ssl_accept_nonblock(int argc, VALUE *argv, VALUE self)
{
    VALUE opts;

    rb_scan_args(argc, argv, "0:", &opts);
    ossl_ssl_setup(self);

    return ossl_start_ssl(self, SSL_accept, "SSL_accept", opts);
}

Инициирует установление SSL/TLS соединения как серверу в режиме без блокировки.

# emulates blocking accept
begin
  ssl.accept_nonblock
rescue IO::WaitReadable
  IO.select([s2])
  retry
rescue IO::WaitWritable
  IO.select(nil, [s2])
  retry
end

Указав в хэше опций `exception: false`, вы можете указать, что #accept_nonblock не должен генерировать исключение IO::WaitReadable или IO::WaitWritable, а вместо этого должен возвращать символ :wait_readable или :wait_writable.

alpn_protocol → String Показать исходный код
static VALUE
ossl_ssl_alpn_protocol(VALUE self)
{
    SSL *ssl;
    const unsigned char *out;
    unsigned int outlen;

    ossl_ssl_data_get_struct(self, ssl);

    SSL_get0_alpn_selected(ssl, &out, &outlen);
    if (!outlen)
        return Qnil;
    else
        return rb_str_new((const char *) out, outlen);
}

Возвращает строку протокола ALPN, которая была выбрана клиентом во время установления соединения.

cert → cert or nil Показать исходный код
static VALUE
ossl_ssl_get_cert(VALUE self)
{
    SSL *ssl;
    X509 *cert = NULL;

    ossl_ssl_data_get_struct(self, ssl);

    /*
     * Is this OpenSSL bug? Should add a ref?
     * TODO: Ask for.
     */
    cert = SSL_get_certificate(ssl); /* NO DUPs => DON'T FREE. */

    if (!cert) {
        return Qnil;
    }
    return ossl_x509_new(cert);
}

Сертификат X509 для этого конечного узла сокета.

cipher → [name, version, bits, alg_bits] Показать исходный код
static VALUE
ossl_ssl_get_cipher(VALUE self)
{
    SSL *ssl;
    SSL_CIPHER *cipher;

    ossl_ssl_data_get_struct(self, ssl);

    cipher = (SSL_CIPHER *)SSL_get_current_cipher(ssl);

    return ossl_ssl_cipher_to_ary(cipher);
}

Шифр, используемый для текущего соединения.

client_ca → [x509name, ...] Показать исходный код
static VALUE
ossl_ssl_get_client_ca_list(VALUE self)
{
    SSL *ssl;
    STACK_OF(X509_NAME) *ca;

    ossl_ssl_data_get_struct(self, ssl);

    ca = SSL_get_client_CA_list(ssl);
    return ossl_x509name_sk2ary(ca);
}

Возвращает список корневых сертификатов клиентов. Обратите внимание, что в отличие от OpenSSL::SSL::SSLContext#client_ca возвращается не массив X509::Certificate, а экземпляры X509::Name для имени субъекта (DN) корневых сертификатов.

В режиме сервера возвращает список, заданный OpenSSL::SSL::SSLContext#client_ca. В режиме клиента возвращает список корневых сертификатов клиентов, переданных сервером.

connect → self Показать исходный код
static VALUE
ossl_ssl_connect(VALUE self)
{
    ossl_ssl_setup(self);

    return ossl_start_ssl(self, SSL_connect, "SSL_connect", Qfalse);
}

Инициирует установление SSL/TLS соединения с сервером. Установление соединения может начаться после отправки нешифрованных данных по сокету.

connect_nonblock([options]) → self Показать исходный код
static VALUE
ossl_ssl_connect_nonblock(int argc, VALUE *argv, VALUE self)
{
    VALUE opts;
    rb_scan_args(argc, argv, "0:", &opts);

    ossl_ssl_setup(self);

    return ossl_start_ssl(self, SSL_connect, "SSL_connect", opts);
}

Инициирует установление SSL/TLS соединения как клиенту в режиме без блокировки.

# emulates blocking connect
begin
  ssl.connect_nonblock
rescue IO::WaitReadable
  IO.select([s2])
  retry
rescue IO::WaitWritable
  IO.select(nil, [s2])
  retry
end

Указав в хэше опций `exception: false`, вы можете указать, что #connect_nonblock не должен генерировать исключение IO::WaitReadable или IO::WaitWritable, а вместо этого должен возвращать символ :wait_readable или :wait_writable.

npn_protocol → String Показать исходный код
static VALUE
ossl_ssl_npn_protocol(VALUE self)
{
    SSL *ssl;
    const unsigned char *out;
    unsigned int outlen;

    ossl_ssl_data_get_struct(self, ssl);

    SSL_get0_next_proto_negotiated(ssl, &out, &outlen);
    if (!outlen)
        return Qnil;
    else
        return rb_str_new((const char *) out, outlen);
}

Возвращает строку протокола, выбранную клиентом во время установления соединения.

peer_cert → cert or nil Показать исходный код
static VALUE
ossl_ssl_get_peer_cert(VALUE self)
{
    SSL *ssl;
    X509 *cert = NULL;
    VALUE obj;

    ossl_ssl_data_get_struct(self, ssl);

    cert = SSL_get_peer_certificate(ssl); /* Adds a ref => Safe to FREE. */

    if (!cert) {
        return Qnil;
    }
    obj = ossl_x509_new(cert);
    X509_free(cert);

    return obj;
}

Сертификат X509 для узла-партнера этого сокета.

peer_cert_chain → [cert, ...] or nil Показать исходный код
static VALUE
ossl_ssl_get_peer_cert_chain(VALUE self)
{
    SSL *ssl;
    STACK_OF(X509) *chain;
    X509 *cert;
    VALUE ary;
    int i, num;

    ossl_ssl_data_get_struct(self, ssl);

    chain = SSL_get_peer_cert_chain(ssl);
    if(!chain) return Qnil;
    num = sk_X509_num(chain);
    ary = rb_ary_new2(num);
    for (i = 0; i < num; i++){
        cert = sk_X509_value(chain, i);
        rb_ary_push(ary, ossl_x509_new(cert));
    }

    return ary;
}

Цепочка сертификатов X509 для узла-партнера этого сокета.

pending → Integer Показать исходный код
static VALUE
ossl_ssl_pending(VALUE self)
{
    SSL *ssl;

    ossl_ssl_data_get_struct(self, ssl);

    return INT2NUM(SSL_pending(ssl));
}

Количество байтов, немедленно доступных для чтения.

post_connection_check(hostname) Показать исходный код
# File ext/openssl/lib/openssl/ssl.rb, line 308
def post_connection_check(hostname)
  if peer_cert.nil?
    msg = "Peer verification enabled, but no certificate received."
    if using_anon_cipher?
      msg += " Anonymous cipher suite #{cipher[0]} was negotiated. Anonymous suites must be disabled to use peer verification."
    end
    raise SSLError, msg
  end

  unless OpenSSL::SSL.verify_certificate_identity(peer_cert, hostname)
    raise SSLError, "hostname \"#{hostname}\" does not match the server certificate"
  end
  return true
end

Проверка имени узла после установления соединения SSL.

Этот метод ОБЯЗАТЕЛЬНО должен быть вызван после вызова connect для проверки имени узла удалённого узла-партнёра.

session() Показать исходный код
# File ext/openssl/lib/openssl/ssl.rb, line 323
def session
  SSL::Session.new(self)
rescue SSL::Session::SessionError
  nil
end
session = session → session Показать исходный код
static VALUE
ossl_ssl_set_session(VALUE self, VALUE arg1)
{
    SSL *ssl;
    SSL_SESSION *sess;

/* why is ossl_ssl_setup delayed? */
    ossl_ssl_setup(self);

    ossl_ssl_data_get_struct(self, ssl);

    SafeGetSSLSession(arg1, sess);

    if (SSL_set_session(ssl, sess) != 1)
        ossl_raise(eSSLError, "SSL_set_session");

    return arg1;
}

Устанавливает Session для использования при установлении соединения.

session_reused? → true | false Показать исходный код
static VALUE
ossl_ssl_session_reused(VALUE self)
{
    SSL *ssl;

    ossl_ssl_data_get_struct(self, ssl);

    switch(SSL_session_reused(ssl)) {
    case 1:     return Qtrue;
    case 0:     return Qfalse;
    default:    ossl_raise(eSSLError, "SSL_session_reused");
    }

    UNREACHABLE;
}

Возвращает true, если во время установления соединения был выбран повторно используемый сеанс.

ssl_version → String Показать исходный код
static VALUE
ossl_ssl_get_version(VALUE self)
{
    SSL *ssl;

    ossl_ssl_data_get_struct(self, ssl);

    return rb_str_new2(SSL_get_version(ssl));
}

Возвращает строку, представляющую версию SSL/TLS, согласованную для соединения, например, «TLSv1.2».

state → string Показать исходный код
static VALUE
ossl_ssl_get_state(VALUE self)
{
    SSL *ssl;
    VALUE ret;

    ossl_ssl_data_get_struct(self, ssl);

    ret = rb_str_new2(SSL_state_string(ssl));
    if (ruby_verbose) {
        rb_str_cat2(ret, ": ");
        rb_str_cat2(ret, SSL_state_string_long(ssl));
    }
    return ret;
}

Описание текущего состояния соединения.

sysclose → nil Показать исходный код
# File ext/openssl/lib/openssl/ssl.rb, line 297
def sysclose
  return if closed?
  stop
  io.close if sync_close
end

Отправляет «close notify» партнеру и пытается корректно закрыть SSL соединение.

Если sync_close установлен на true, также закрывается базовый IO.

sysread(length) → string Показать исходный код
sysread(length, buffer) → buffer
static VALUE
ossl_ssl_read(int argc, VALUE *argv, VALUE self)
{
    return ossl_ssl_read_internal(argc, argv, self, 0);
}

Считывает length байта из SSL соединения. Если предоставлен предварительно выделенный буфер buffer, данные будут записаны в него.

syswrite(string) → Integer Показать исходный код
static VALUE
ossl_ssl_write(VALUE self, VALUE str)
{
    return ossl_ssl_write_internal(self, str, Qfalse);
}

Записывает string в SSL соединение.

verify_result → Integer Показать исходный код
static VALUE
ossl_ssl_get_verify_result(VALUE self)
{
    SSL *ssl;

    ossl_ssl_data_get_struct(self, ssl);

    return INT2FIX(SSL_get_verify_result(ssl));
}

Возвращает результат проверки сертификатов узла-партнёра. Смотрите verify(1) для значений и описаний ошибок.

Если сертификат узла-партнёра не был представлен, возвращается X509_V_OK.

Методы приватного экземпляра

client_cert_cb() Показать исходный код
# File ext/openssl/lib/openssl/ssl.rb, line 337
def client_cert_cb
  @context.client_cert_cb
end
session_get_cb() Показать исходный код
# File ext/openssl/lib/openssl/ssl.rb, line 353
def session_get_cb
  @context.session_get_cb
end
session_new_cb() Показать исходный код
# File ext/openssl/lib/openssl/ssl.rb, line 349
def session_new_cb
  @context.session_new_cb
end
stop → nil Показать исходный код
static VALUE
ossl_ssl_stop(VALUE self)
{
    SSL *ssl;

    ossl_ssl_data_get_struct(self, ssl);

    ossl_ssl_shutdown(ssl);

    return Qnil;
}

Отправляет «close notify» партнеру и пытается корректно завершить соединение SSL.

sysread_nonblock(length) → строка Показать исходный код
sysread_nonblock(length, buffer) → буфер
sysread_nonblock(length[, buffer [, opts]) → буфер
static VALUE
ossl_ssl_read_nonblock(int argc, VALUE *argv, VALUE self)
{
    return ossl_ssl_read_internal(argc, argv, self, 1);
}

Неблокирующая версия sysread. Вызывает SSLError, если чтение заблокировано. Если передано «exception: false», этот метод возвращает символ :wait_readable, :wait_writable или nil вместо исключения.

Читает length байта из соединения SSL. Если предоставлен предварительно выделенный buffer, данные будут записаны в него.

syswrite_nonblock(строка) → Целое Показать исходный код
static VALUE
ossl_ssl_write_nonblock(int argc, VALUE *argv, VALUE self)
{
    VALUE str, opts;

    rb_scan_args(argc, argv, "1:", &str, &opts);

    return ossl_ssl_write_internal(self, str, opts);
}

Записывает string в соединение SSL в неблокирующем режиме. Вызывает SSLError, если запись заблокирована.

tmp_dh_callback() Показать исходный код
# File ext/openssl/lib/openssl/ssl.rb, line 341
def tmp_dh_callback
  @context.tmp_dh_callback || OpenSSL::PKey::DEFAULT_TMP_DH_CALLBACK
end
tmp_ecdh_callback() Показать исходный код
# File ext/openssl/lib/openssl/ssl.rb, line 345
def tmp_ecdh_callback
  @context.tmp_ecdh_callback
end
using_anon_cipher?() Показать исходный код
# File ext/openssl/lib/openssl/ssl.rb, line 331
def using_anon_cipher?
  ctx = OpenSSL::SSL::SSLContext.new
  ctx.ciphers = "aNULL"
  ctx.ciphers.include?(cipher)
end

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

Spec-Zone.ru

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