Обнаружение поддержки SSL во время выполнения в геме pg - PullRequest
0 голосов
/ 12 декабря 2018

У нас есть некоторый Ruby-код, который выполняет что-то вроде:

require 'pg'

# Create a remote Postgres database instance, and wait
# until it's online, then try to connect:
conn = PG::Connection.new(
    ... params ...
    sslmode: 'require')

Важной частью является то, что удаленный экземпляр Postgres настроен так, что использование SSL является обязательным (например, , например, )- sslmode: 'require' в клиентском коде является избыточным.

Это прекрасно работает на многих машинах разработчика, но некоторые разработчики замечают, что они получают ошибку вроде:

 FATAL:  no pg_hba.conf entry for host "...", user "...", database "...", SSL off (PG::ConnectionBad)

икоренной причиной, по-видимому, является то, что их гем pg на самом деле не имеет поддержки SSL.

Мой вопрос: есть ли способ определить, действительно ли гем pg имеет поддержку SSL, безна самом деле пытается подключиться к серверу, требующему SSL ?(Было бы намного лучше, если бы мы могли сразу же обнаружить проблему, вместо того, чтобы ждать, пока не будет создан удаленный экземпляр Postgres, и только потом обнаруживать проблему.)

Моей первой мыслью было проверить метод наpg гем, такой как init_openssl , но в документации утверждается:

Когда поддержка SSL не скомпилирована, эта функция присутствует, но ничего не делает.

и это поведение одинаково, независимо от того, присутствует поддержка SSL или нет:

2.3.1 :002 > PG.init_openssl(true, true)
 => nil 

Информация о среде: ruby ​​2.3 на последней OS X, pg gem 0.19.0, различные версииlibpq

1 Ответ

0 голосов
/ 13 декабря 2018

Сначала убедитесь, что Ruby скомпилирован с поддержкой OpenSSL:

ruby -r rbconfig -e 'puts RbConfig::CONFIG["configure_args"]'
'--prefix=/Users/foo/.rvm/rubies/ruby-2.6.0-preview2' '' '--with-opt-dir=/usr/local/opt/libyaml:/usr/local/opt/readline:/usr/local/opt/libksba:/usr/local/opt/openssl@1.1' '--disable-install-doc' '--enable-shared' 'build_alias=' 'host_alias=' 'target_alias=' 'CC=gcc'

Убедитесь, что openssl находится где-то в выводе --with-opt-dir.Кроме того, вы можете проверить с помощью этого:

ruby -r openssl -e 'puts OpenSSL::OPENSSL_LIBRARY_VERSION'
OpenSSL 1.1.1  11 Sep 2018

Далее найдите свой pg_ext.bundle.Расположение этого зависит от того, как вы устанавливаете Ruby и гемы, но если вы используете RVM, довольно просто найти его в ~/.rvm/gems.Например, он расположен здесь для меня:

~/.rvm/gems/ruby-2.6.0-preview2/gems/pg-1.1.3/ext/pg_ext.bundle

Теперь запустите otool -L, чтобы найти библиотеки, с которыми он связан:

otool -L /Users/foo/.rvm/gems/ruby-2.6.0-preview2/gems/pg-1.1.3/ext/pg_ext.bundle
  /Users/foo/.rvm/gems/ruby-2.6.0-preview2/gems/pg-1.1.3/ext/pg_ext.bundle:
  /Users/foo/.rvm/rubies/ruby-2.6.0-preview2/lib/libruby.2.6.dylib (compatibility version 2.6.0, current version 2.6.0)
  /usr/local/opt/postgresql/lib/libpq.5.dylib (compatibility version 5.0.0, current version 5.11.0)
  /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)

Теперь запустите otool -L против libpq dylib указан в выводе выше, чтобы увидеть, с чем он связан:

otool -L /usr/local/opt/postgresql/lib/libpq.5.dylib
  /usr/local/opt/postgresql/lib/libpq.5.dylib:
  /usr/local/opt/postgresql/lib/libpq.5.dylib (compatibility version 5.0.0, current version 5.11.0)
  /usr/local/opt/openssl/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
  /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
  /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos (compatibility version 5.0.0, current version 6.0.0)
  /System/Library/Frameworks/LDAP.framework/Versions/A/LDAP (compatibility version 1.0.0, current version 2.4.0)
  /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)

Пока он связан с libssl и libcrypto, установленный гем pg также должен поддерживать OpenSSL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...