ssh
を作成するときにno version information available
を取得しています。
Opensslバージョン:
sat:~# openssl version
OpenSSL 1.0.1f 6 Jan 2014
ldd /usr/bin/ssh
の出力は次のとおりです。
/usr/bin/ssh: /usr/local/lib/libcrypto.so.1.0.0: no version information available (required by /usr/bin/ssh)
linux-vdso.so.1 => (0x00007fff48bff000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fdd57f1f000)
libcrypto.so.1.0.0 => /usr/local/lib/libcrypto.so.1.0.0 (0x00007fdd57b3a000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fdd57935000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fdd5771e000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007fdd57508000)
libgssapi_krb5.so.2 => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007fdd572c8000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdd56f3e000)
/lib64/ld-linux-x86-64.so.2 (0x00007fdd583b3000)
libkrb5.so.3 => /usr/lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007fdd56c6a000)
libk5crypto.so.3 => /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007fdd56a40000)
libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007fdd5683c000)
libkrb5support.so.0 => /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007fdd56633000)
libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007fdd5642e000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fdd56212000)
locate libcrypto.so.1.0.0
の出力:
sat:~# locate libcrypto.so.1.0.0
/usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
/usr/local/lib/libcrypto.so.1.0.0
/usr/src/openssl-1.0.1f/libcrypto.so.1.0.0
このエラーを修正する方法は?
注意:
openssl
をコンパイルしてインストールしました。その後、ssh
からapt-get
をインストールしました。
Opensslをコンパイルしてインストールしました。その後、apt-getを使用してsshをインストールしました。
これらはおそらくOpenSSLの2つの異なるバージョンです。 1.0.0は1.0.1、1.0.2などとバイナリ互換であるため、おそらく問題ありません(ただし、1.1.0とはバイナリ互換ではありません)。
あなたのssh
はおそらく_/usr/lib/x86_64-linux-gnu/
_のバージョンのOpenSSLを使用しています。 OpenSSLのバージョンが使用されていることを確認するには、_LD_PRELOAD
_を使用する必要があります(もちろん、バイナリ互換性を前提としています)。
_LD_PRELOAD
_などを使用したくない場合は、ソースからssh
をビルドします。必ずrpath
を指定して、リンクエディターがシステムのバージョンではなく、お使いのバージョンのOpenSSLを使用するようにしてください。つまり、LDFLAGS
には_-Wl,-rpath,<path to your openssl>
_のようなものを含める必要があります。これは、通常の_-lcrypto
_、_-lssl
_、および_-L<path to your openssl>
_に追加されます。
Mac OS Xを使用している場合、_-Bstatic
_や_-rpath
_などのリンカーオプションは通知なく無視されることに注意してください。 OS Xは0.9.8を提供しているため、互換性のないバイナリが原因で不思議なクラッシュが発生します。
バージョン情報がありません
バージョン情報がないので、わかりません。 ssh
は、コンパイル時に_OPENSSL_VERSION_NUMBER
_または実行時にSSLeay
/_SSLeay_version
_を使用できます。詳細は OPENSSL_VERSION_NUMBER(3)
を参照してください。
このエラーを修正する方法は?
誤解しているかもしれませんが、投稿のどこにもエラーはありません。
問題:libssl.so.1.0.0
およびlibcrypto.so.1.0.0
バージョン情報がない警告/エラー。
多くの研究、時間と労力(数週間かかった)の後、これが最終的に私がやったことです...
Openssl 1.0.1hのバージョンのソースコードを抽出したディレクトリで(他のバージョンでも動作するはずです)openssl.ld
というファイルを作成します
このファイルにこれを入れてください...
OPENSSL_1.0.0 {
global:
*;
};
それを保存。次に入力してください...
make clean
(私たちが新鮮であることを確認するためだけに。)
さて、本当に気が遠くなるような部分について...
./config --prefix=/usr/local --openssldir=/usr/local/openssl shared -Wl,--version-script=openssl.ld -Wl,-Bsymbolic-functions
その後...
make
make test
make install
ldconfig
そして、それでうまくいくはずです。 (とてもシンプルです。パッチは必要ありません。)
このソリューションを32ビット版と64ビット版の両方のDebian Wheezyに適用しました。そして観察をしました。 64ビットバージョンでは、libssl.so.1.0.0
ディレクトリに作成される新しいlibcrypto.so.1.0.0
および/usr/local/lib
ファイルが自動的にデフォルトで使用されます。 32ビット版はそうではありません。これが、32ビットバージョンのDebian Wheezyにはこの問題が発生しないと最初は思っていた理由ですが、32ビットバージョンを入手すると、/usr/local/lib
ディレクトリの新しいopensslライブラリを使用できます。
ldd
コマンドを使用して、バイナリが使用しているライブラリをテストすることも、これを理解する上で非常に重要です。
カスタムコンパイルライブラリをインストールする場合は、プレフィックス/usr/local
、/usr
、または/
にインストールしてシステムを壊さないでください。たとえば、Debian/Ubuntuは、ldconfig
が通常/usr/local/lib
にリストされているため、次に呼び出されたときに/etc/ld.so.conf.d/libc.conf
でカスタムライブラリを取得します。
Openssl 1.0.2eをmake install
に変換して--prefix=/usr/local
にした後、ldconfig
を実行します(引数なしで/etc/ld.so.cache
を更新します):
# ldconfig -p | egrep 'lib(crypt|ssl)'
libssl.so.1.0.0 (libc6,x86-64) => /usr/local/lib/libssl.so.1.0.0
libssl.so.1.0.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libssl.so.1.0.0
libssl.so (libc6,x86-64) => /usr/local/lib/libssl.so
libssl.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libssl.so
libcrypto.so.1.0.0 (libc6,x86-64) => /usr/local/lib/libcrypto.so.1.0.0
libcrypto.so.1.0.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
libcrypto.so (libc6,x86-64) => /usr/local/lib/libcrypto.so
libcrypto.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcrypto.so
libcrypt.so.1 (libc6,x32, OS ABI: Linux 3.4.0) => /libx32/libcrypt.so.1
libcrypt.so.1 (libc6,x86-64, OS ABI: Linux 2.6.24) => /lib/x86_64-linux-gnu/libcrypt.so.1
libcrypt.so.1 (libc6, OS ABI: Linux 2.6.24) => /lib32/libcrypt.so.1
libcrypt.so (libc6,x32, OS ABI: Linux 3.4.0) => /usr/libx32/libcrypt.so
libcrypt.so (libc6,x86-64, OS ABI: Linux 2.6.24) => /usr/lib/x86_64-linux-gnu/libcrypt.so
libcrypt.so (libc6, OS ABI: Linux 2.6.24) => /usr/lib32/libcrypt.so
カスタムコンパイルされたものがopenssl
パッケージのlibsをオーバーライドする方法に注意してください。
ソフトウェアを/opt/$WHATEVER-$VERSION/
にインストールします
次に、/opt/$WHATEVER-$VERSION/bin
でカスタムコンパイルされたバイナリを使用する場合は、appendをPATH
に追加します(プリペンドしないでください) 、システムを破壊するリスクがあるため)。
export CFLAGS="$CFLAGS -I/opt/$WHATEVER-$VERSION/include" \
CXXFLAGS="$CXXFLAGS -I/opt/$WHATEVER-$VERSION/include" \
LDFLAGS="-lwhatever -L/opt/$WHATEVER-$VERSION/lib"
上記と同じですが、-Wl,-rpath,/opt/$WHATEVER-$VERSION/lib
をLDFLAGSに追加します
もう1つ行うことは、make install
の代わりに checkinstall
を使用して、完全なパッケージ名にcustom-$WHATEVER-$VERSION
が含まれるリムーバブルパッケージを作成し、バージョン管理を簡単にして破損を回避することです。互換性のないアップグレードによるカスタムパッケージ。
上記のソリューションがOPENSSL_1.0.1バージョンを必要とする特定のバイナリを破壊することを発見しました。たとえばカールのように。 apt-file searchはcurlを使用しているため、私のソリューションでは機能しなくなります。したがって、一部のバイナリは1.0.0バージョンを必要とし、他のバイナリは1.0.1バージョンを必要とします。
Openssl.ldファイルを編集することで解決できると思います。そのため、一部のバイナリは1.0.0バージョンを取得し、他のバイナリは1.0.1バージョンを取得します。現時点ではこれは私を超えています。たぶん他の誰かがこれを解決できます。