класс OpenSSL::SSL::SSLSocket
Следующие атрибуты доступны, но не отображаются в rdoc.
-
io, context, sync_close
Методы публичного класса
# File ext/openssl/lib/openssl/ssl.rb, line 254 def initialize(io, ctx = nil); raise NotImplementedError; end
Методы публичного экземпляра
static VALUE
ossl_ssl_accept(VALUE self)
{
ossl_ssl_setup(self);
return ossl_start_ssl(self, SSL_accept, "SSL_accept", Qfalse);
} Ожидает, пока клиент SSL/TLS инициирует установление соединения. Установление соединения может начаться после отправки нешифрованных данных по сокету.
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.
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, которая была выбрана клиентом во время установления соединения.
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 для этого конечного узла сокета.
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);
} Шифр, используемый для текущего соединения.
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. В режиме клиента возвращает список корневых сертификатов клиентов, переданных сервером.
static VALUE
ossl_ssl_connect(VALUE self)
{
ossl_ssl_setup(self);
return ossl_start_ssl(self, SSL_connect, "SSL_connect", Qfalse);
} Инициирует установление SSL/TLS соединения с сервером. Установление соединения может начаться после отправки нешифрованных данных по сокету.
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.
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);
} Возвращает строку протокола, выбранную клиентом во время установления соединения.
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 для узла-партнера этого сокета.
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 для узла-партнера этого сокета.
static VALUE
ossl_ssl_pending(VALUE self)
{
SSL *ssl;
ossl_ssl_data_get_struct(self, ssl);
return INT2NUM(SSL_pending(ssl));
} Количество байтов, немедленно доступных для чтения.
# 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 для проверки имени узла удалённого узла-партнёра.
# File ext/openssl/lib/openssl/ssl.rb, line 323 def session SSL::Session.new(self) rescue SSL::Session::SessionError nil end
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 для использования при установлении соединения.
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, если во время установления соединения был выбран повторно используемый сеанс.
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».
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;
} Описание текущего состояния соединения.
static VALUE
ossl_ssl_read(int argc, VALUE *argv, VALUE self)
{
return ossl_ssl_read_internal(argc, argv, self, 0);
} Считывает length байта из SSL соединения. Если предоставлен предварительно выделенный буфер buffer, данные будут записаны в него.
static VALUE
ossl_ssl_write(VALUE self, VALUE str)
{
return ossl_ssl_write_internal(self, str, Qfalse);
} Записывает string в SSL соединение.
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.
Методы приватного экземпляра
# File ext/openssl/lib/openssl/ssl.rb, line 337 def client_cert_cb @context.client_cert_cb end
# File ext/openssl/lib/openssl/ssl.rb, line 353 def session_get_cb @context.session_get_cb end
# File ext/openssl/lib/openssl/ssl.rb, line 349 def session_new_cb @context.session_new_cb end
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.
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, данные будут записаны в него.
# File ext/openssl/lib/openssl/ssl.rb, line 341 def tmp_dh_callback @context.tmp_dh_callback || OpenSSL::PKey::DEFAULT_TMP_DH_CALLBACK end
# File ext/openssl/lib/openssl/ssl.rb, line 345 def tmp_ecdh_callback @context.tmp_ecdh_callback end
# 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.