编译过时的PHP会产生带有OpenSSL函数的核心转储。OpenSSL版本不匹配?

编译过时的PHP会产生带有OpenSSL函数的核心转储。OpenSSL版本不匹配?,php,openssl,coredump,Php,Openssl,Coredump,我使用这些./config选项编译了OpenSSL 0.9.8x: ./config --prefix=/usr/local/openssl-0.9.8 --openssldir=/usr/local/openssl-0.9.8 我正在使用这些./configure选项编译我的PHP版本(以及其他选项): 问题是,当我使用openssl\u public\u encrypt运行PHP脚本时,我遇到了一个分段错误 gdb是这么说的: Program terminated with signal

我使用这些./config选项编译了OpenSSL 0.9.8x:

./config --prefix=/usr/local/openssl-0.9.8 --openssldir=/usr/local/openssl-0.9.8
我正在使用这些./configure选项编译我的PHP版本(以及其他选项):

问题是,当我使用
openssl\u public\u encrypt
运行PHP脚本时,我遇到了一个分段错误

gdb是这么说的:

Program terminated with signal 11, Segmentation fault.
#0  0x00007fd3381c5a48 in RSA_public_encrypt () from /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
在/usr/local/openssl-0.9.8/lib/中有libcrypto.so.0.9.8,为什么不使用它呢

以下是我的OpenSSL生成文件:

以下是我的PHP生成文件:

下面是一个复制问题的文件:


有什么想法吗?谢谢

问题在于ld linux在运行时解析到错误库的链接

通过设置LD_LIBRARY_PATH尝试执行它:
LD\u LIBRARY\u PATH=/usr/local/openssl-0.9.8/lib php非常旧的php脚本,不应该使用它。php


如果可行,您可能希望使用以下命令执行它:
LD\u DEBUG=all php…
来检查动态链接器不使用0.9.8 openssl版本的位置和原因。

使用
LD\u LIBRARY\u PATH
通常会解决问题,但在这种情况下不会解决您的问题

我已经根据你的修改了Dockerfile,以修复这个错误

  • 删除PHP配置阶段的
    --disable rpath
    --libdir
    参数

    我们使用
    rpath
    在运行时定位共享对象,以便在/usr/local/openssl-0.9.8x上定制构建openssl

    请参阅中的选项
    -rpath=dir

    将目录添加到运行库搜索路径。这在将ELF可执行文件与共享对象链接时使用。将所有-rpath参数连接起来并传递给运行时链接器,运行时链接器使用它们在运行时定位共享对象。当定位链接中显式包含的共享对象所需的共享对象时,也会使用-rpath选项

  • 向OpenSSL的配置脚本添加
    shared
    选项

    构建共享库(libcrypto.so.0.9.8和libssl.so.0.9.8)

  • 仅在/usr/kerberos/lib中链接kerberos库

    运行时搜索路径的顺序是
    /usr/kerberos/lib:/usr/local/openssl-0.9.8/lib

  • 这是变化

    # https://pastebin.com/ziZzvTh8
    --- ziZzvTh8.txt    2019-10-08 10:31:33.229217226 +0800
    +++ Dockerfile   2019-10-08 12:07:03.271948150 +0800
    @@ -8,7 +8,7 @@
         && wget --no-check-certificate http://www.openssl.org/source/openssl-0.9.8x.tar.gz \
         && tar xvfz openssl-0.9.8x.tar.gz \
         && cd openssl-0.9.8x \
    -    && ./config --prefix=/usr/local/openssl-0.9.8 \
    +    && ./config shared --prefix=/usr/local/openssl-0.9.8 \
         && make \
         && make install
    
    @@ -23,7 +23,8 @@
         && ln -s /usr/lib/x86_64-linux-gnu/libexpat.so /usr/lib/ \
         && ln -s /usr/lib/x86_64-linux-gnu/libmysqlclient.so /usr/lib/libmysqlclient.so \
         && mkdir /usr/kerberos \
    -    && ln -s /usr/lib/x86_64-linux-gnu /usr/kerberos/lib
    +    && ln -s /usr/lib/x86_64-linux-gnu/mit-krb5 /usr/kerberos/lib
    +
    
     RUN apt-get build-dep -y php5
    
    @@ -43,7 +44,6 @@
            --with-zlib \
            --with-gd \
            --with-pgsql \
    -       --disable-rpath \
            --enable-inline-optimization \
            --with-bz2 \
            --with-zlib \
    @@ -62,7 +62,6 @@
            --enable-gd-native-ttf \
            --with-openssl=/usr/local/openssl-0.9.8 \
            --with-openssl-dir=/usr/local/openssl-0.9.8 \
    -       --with-libdir=/lib/x86_64-linux-gnu \
            --enable-ftp \
            --with-imap \
            --with-imap-ssl \
    @@ -72,4 +71,6 @@
          && make \
          && make install-cli
    
    +ADD test.php /root/test.php
    +
     CMD ["bash"]
    
    test.php

    <?php
    
    $key = <<<EOF
    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmHzD76i8DA25nC+Qsswi
    OM0lW+gViiQD4tEm7suxBc2BGibtdlrsprVIId92hSjQKx4x8+XVWU6k89T5vy8Y
    txpXN759OWdGkDi8uvZuYclMjW9Rao+oqSvbXH37R7oSY287I+6uOHclGhniQN3q
    RyoXBkbhDk0/FTI/i549q/gGk1UZYv449KLrDOqmtohRcIyAYVnvvWtD1kIzourq
    hMtEIrPqwoBqTaUA9kOIXw1jMovao2TN52j48KgOg9KjqtdwUwD9e6n7hJd/subF
    6woc8L7zjJFOHH5gacUC7vtiMpBpnSyLQpjFLepYYwftjsRmg4xLdh+Zvgw3xqi4
    lwIDAQAB
    -----END PUBLIC KEY-----
    EOF;
    
    var_dump(openssl_public_encrypt($data, $crypted, $key));
    var_dump($crypted);
    

    设置
    LB_LIBRARY_PATH
    仍会导致SEG故障
    LD_DEBUG=all
    给了我5.63mb的输出。下面是一个输出片段,它似乎与libcrypto有关。因此。1.0.0:下面是一个Dockerfile,它再现了以下问题:您使用哪个操作系统?command
    lddpath/to/php
    显示了什么消息?@Gasol-OS是debian:wheezy
    ldd/usr/local/bin/php
    将其作为输出。@Gasol-下面是一个Dockerfile,它复制了这个问题:
    <?php
    
    $key = <<<EOF
    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmHzD76i8DA25nC+Qsswi
    OM0lW+gViiQD4tEm7suxBc2BGibtdlrsprVIId92hSjQKx4x8+XVWU6k89T5vy8Y
    txpXN759OWdGkDi8uvZuYclMjW9Rao+oqSvbXH37R7oSY287I+6uOHclGhniQN3q
    RyoXBkbhDk0/FTI/i549q/gGk1UZYv449KLrDOqmtohRcIyAYVnvvWtD1kIzourq
    hMtEIrPqwoBqTaUA9kOIXw1jMovao2TN52j48KgOg9KjqtdwUwD9e6n7hJd/subF
    6woc8L7zjJFOHH5gacUC7vtiMpBpnSyLQpjFLepYYwftjsRmg4xLdh+Zvgw3xqi4
    lwIDAQAB
    -----END PUBLIC KEY-----
    EOF;
    
    var_dump(openssl_public_encrypt($data, $crypted, $key));
    var_dump($crypted);
    
    root@7c5df089bcb0:/# php -v
    PHP 4.4.9 (cli) (built: Oct  8 2019 04:09:29)
    Copyright (c) 1997-2008 The PHP Group
    Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
    
    root@7c5df089bcb0:/# php -i | grep OpenSSL
    CURL Information => libcurl/7.26.0 OpenSSL/0.9.8x zlib/1.2.7 libidn/1.25 libssh2/1.4.2 librtmp/2.3
    OpenSSL support => enabled
    OpenSSL Version => OpenSSL 0.9.8x 10 May 2012
    
    root@7c5df089bcb0:/# php /root/test.php
    bool(true)
    string(256) "W`r�b��e��',뱌Zł^�$�֗��S����w�j�د<������� �)<��j��JL(f@�A���5_S�X=g-?0M�(�d�����+���     �nD*gzË��ڞc'�\'͗�'vnmo�G�Bv�
    #~�y D!��lb�t^���| )[za��5���y�G{�\�"
    
    root@7c5df089bcb0:/# ldd `which php` | egrep 'libssl|libcrypto'
            libssl.so.0.9.8 => /usr/local/openssl-0.9.8/lib/libssl.so.0.9.8 (0x00007efe86da1000)
            libcrypto.so.0.9.8 => /usr/local/openssl-0.9.8/lib/libcrypto.so.0.9.8 (0x00007efe86a0b000)
            libssl.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007efe8401b000)
            libcrypto.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007efe83c21000)
    
    root@7c5df089bcb0:/# objdump -p `which php` | grep RPATH
      RPATH                /usr/lib/x86_64-linux-gnu:/usr/kerberos/lib:/usr/local/openssl-0.9.8/lib