Perl/Postgresql:未编译 SSL 支持时,sslmode 值“require”无效

Posted

技术标签:

【中文标题】Perl/Postgresql:未编译 SSL 支持时,sslmode 值“require”无效【英文标题】:Perl/Postgresql: sslmode value "require" invalid when SSL support is not compiled 【发布时间】:2021-09-11 06:36:50 【问题描述】:

我正在尝试在 SLES12 机器上使用 Perl 5.26.1 连接到 Postgresql 12.1 数据库实例,但遇到了错误。我的测试脚本很简单。

#!/usr/pkgs/perl/5.26.1/bin/perl

use DBI;
my $dbname = "XXX";  
my $host = "XXX";  
my $port = XXX;  
my $username = "XXX";  
my $password = "XXX";

my $dbh = DBI -> connect("dbi:Pg:dbname=$dbname;sslmode=require;host=$host;port=$port",  
                            $username,
                            $password,
                            AutoCommit => 0, RaiseError => 1
                         ) or die $DBI::errstr;

当我运行此脚本时,我收到以下错误:sslmode value "require" invalid when SSL support is not compiled in at...

我已将 LD_LIBRARY_PATH 设置为指向我的本地版本的 libpq 库(从源代码 postgresql-13.3 构建)。我在 --open-ssl 支持下构建了这个库。我通过pg_config --configure 确认了这一点。

$ ./bin/pg_config --configure
 '--prefix' '/myworkarea/tmp/local' '--with-perl' '--with-python' '--with-tcl' '--with-openssl' '--with-ldap' '--with-pam' '--with-libxml' '--with-libxslt'

我可以使用 pgAdmin 毫无问题地连接到数据库。我确认它支持通过 DBD:Pg 连接到 Postgres。

$ perl -MDBI -e 'DBI->installed_versions'
  Perl            : 5.026001    (x86_64-linux)
  OS              : linux       (4.4.49-92.14-default)
  DBI             : 1.639
  DBD::mysql      : 4.043
  DBD::Sybase     : 1.16
  DBD::Sponge     : 12.010003
  DBD::SQLite     : 1.54
  DBD::Proxy      : 0.2004
  DBD::Pg         : 3.7.4
  DBD::Oracle     : 1.80
  DBD::ODBC       : 1.56
  DBD::Multiplex  : 2.11
  DBD::Mock       : 1.45
  DBD::Mem        : 0.001
  DBD::LDAP       : 0.22
  DBD::Gofer      : 0.015327
  DBD::File       : 0.44
  DBD::ExampleP   : 12.014311
  DBD::DBM        : 0.08
  DBD::CSV        : 0.49

但是我查看了 Pg.so 来查找依赖项,但它似乎仍然指向系统安装文件而不是我的版本。我该如何解决这个问题?

$ ldd /usr/pkgs/perl/5.26.1/lib64/site_perl/x86_64-linux/auto/DBD/Pg/Pg.so
        linux-vdso.so.1 (0x00007ffff7ffa000)
        libpq.so.5 => /usr/pkgs/postgresql/9.5.0/lib/libpq.so.5 (0x00007ffff797b000)   <-- Not picking up my setting from LD_LIBRARY_PATH
        libm.so.6 => /lib64/libm.so.6 (0x00007ffff767e000)
        libc.so.6 => /lib64/libc.so.6 (0x00007ffff72d9000)
        libpthread.so.0 => /lib64/noelision/libpthread.so.0 (0x00007ffff70bc000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ffff7ddb000)

【问题讨论】:

尝试将POSTGRES_HOME 设置为安装根目录(其中包含./bin/pg_config),然后重新安装DBD::Pg。 LD_LIBRARY_PATH 不会为您做任何事情。 谢谢。我将通过在自定义区域重新安装 DBD::Pg 来试一试。 请参阅README 的安装部分。您可以提供参数来说明使用哪个库。 谢谢。我也能够重建 DBD:Pg。现在可以了。 【参考方案1】:

与 DBD::Pg 链接的 PostgreSQL 客户端共享库 (libpq) 是在不支持 SSL 的情况下构建的。那是行不通的。您必须使用带有 SSL 支持的 libpq。

这需要做两件事:

    使用 --with-openssl 开关配置 PostgreSQL。 通过设置 POSTGRES_LIBPOSTGRES_HOME 环境变量来构建 DBD:Pg 模块以链接 1) 中的库。有关安装,请参阅 README 部分。

【讨论】:

以上是关于Perl/Postgresql:未编译 SSL 支持时,sslmode 值“require”无效的主要内容,如果未能解决你的问题,请参考以下文章

nginx如果未开启SSL模块,配置https时提示错误

nginx添加ssl模块

OpenSSL 编译错误未定义参考

apache动静态编译

开始Nginx的SSL模块

原已经安装好的nginx,现在需要添加一个未被编译安装的模块: