ssh升级以及ssh: symbol lookup error: ssh: undefined symbol: EVP_aes_128_ctr错误处理

本文详细介绍了解压安装openssl、zlib及openssh包的过程,并提供了配置库文件搜索路径、备份启动脚本、卸载原有openssh及启动服务的具体步骤。

1、解压安装openssl包:(不能卸载openssl,否则会影响系统的ssl加密库文件,除非你可以做两个软连接libcryto和libssl)

# tar -zxvf openssl-1.0.1.tar.gz

# cd openssl-1.0.1

#./config -fPIC threads shared

# make

# make test

# make install

# mv /usr/bin/openssl /usr/bin/openssl.OFF

# mv /usr/include/openssl /usr/include/openssl.OFF

//该步骤可能提示无文件,忽略即可

# ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl

# ln -s /usr/local/ssl/include/openssl /usr/include/openssl

//移走原先系统自带的openssl,将自己编译产生的新文件进行链接。

2、配置库文件搜索路径

# chmod 755 /usr/local/ssl

# echo "/usr/local/ssl/lib" >> /etc/ld.so.conf

# /sbin/ldconfig -v

# openssl version -a

OpenSSL 1.0.1 14 Mar 2012

built on: Fri Mar 16 17:14:50 CST 2012

platform: linux-x86_64

options:  bn(64,64) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx)

compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -m64 -DL_ENDIAN -DTERMIO -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM

OPENSSLDIR: "/usr/local/ssl"

 

3、备份启动脚本

# cp /etc/init.d/sshd /root/

 

 /#1、停止SSHD服务 

# /sbin/service sshd stop

 

4、卸载系统里原有Openssh

# rpm –qa|grep openssh  //查询系统原安装的openssh包,全部卸载。

# rpm -e openssh --nodeps

# rpm -e openssh-server --nodeps

# rpm -e openssh-clients --nodeps

# rpm -e openssh-askpass

或rpm -e --nodeps `rpm -qa |grepopenssh`

#4、解压安装zlib包:

# tar -jxvf zlib-1.2.5.tar.bz2  //首先安装zlib库,否则会报zlib.c错误无法进行

# cd zlib-1.2.5

# ./configure

# make&&make install

5、解压安装openssh包:

先将将/etc/ssh的文件夹备份:

# mv /etc/ssh /etc/ssh_bak

# tar -zxvf openssh-6.6p1.tar.gz

# cd openssh-6.6p1

#./configure --sysconfdir=/etc/ssh --with-ssl-dir=/usr/local/ssl  --with-md5-passwords --mandir=/usr/share/man  --with-pam

# make

# make install

6、启动服务

# cp -p contrib/redhat/sshd.init /etc/init.d/sshd

(suse:cpcontrib/suse/rc.sshd /etc/init.d/sshd)

# chmod +x /etc/init.d/sshd

# chkconfig --add sshd

# cp sshd_config /etc/ssh/sshd_config  (如提示覆盖,yes回车)

# cp sshd /usr/sbin/sshd   (如提示覆盖,yes回车)

# cp ssh-keygen /usr/bin/ssh-keygen

(redhat:cpssh-keygen /usr/bin/ssh-keygen)

验证是否service sshd start成功

service sshd start

service sshd restart

ssh -V   //如果看到了新的版本号就没问题啦!如果没有ssh这条命令,执行

(redhat、suse:ln -s /usr/local/bin/ssh /usr/bin/ssh)

 

升级后普通用户无法相互ssh登陆

提示 ssh: symbol lookup error: ssh: undefined symbol: EVP_aes_128_ctr

在网上查了好久终于解决了:

解决方法如下:

给相应配置文件赋权,使用root用户执行如下三个命令即可

 

[root@hadoop1 ~]# chmod o+rx /usr/bin/openssl
[root@hadoop1 ~]# chmod o+rx /usr/include/openssl
[root@hadoop1 ~]# chmod o+rx /usr/local/ssl -R

转载于:https://www.cnblogs.com/chenjunjie/p/4103264.html

<think>我们面对的问题是一个系统级别的错误,具体表现是当尝试使用`git push`命令时,SSH客户端在尝试加载`libk5crypto.so.3`库时遇到了一个未定义的符号`EVP_KDF_ctrl`,并且这个符号的版本是`OPENSSL_1_1_1b`。根据提供的引用信息,我们可以推断出问题与OpenSSL库的版本不兼容有关。 ### 问题分析 1. **错误信息**: ``` /usr/bin/ssh: symbol lookup error: /lib64/libk5crypto.so.3: undefined symbol: EVP_KDF_ctrl, version OPENSSL_1_1_1b ``` 这表明在运行`ssh`时,动态链接器在加载`libk5crypto.so.3`(这是Kerberos加密相关的库)时,找不到它需要的符号`EVP_KDF_ctrl`,该符号应该由OpenSSL提供。 2. **可能的原因**: - 系统中安装了多个版本的OpenSSL库,而`libk5crypto.so.3`编译时链接的OpenSSL版本与当前运行时链接的版本不一致。 - OpenSSL库的符号版本问题:可能某个OpenSSL库文件(如`libcrypto.so`)被替换或升级,但未正确更新符号链接,导致其他库在运行时找不到预期的符号。 3. **引用信息分析**: - 引用[2]展示了系统中多个OpenSSL库文件的存在,包括多个版本的`libcrypto.so`。 - 引用[3]指出问题是由于`/lib64/libcrypto.so.1.1`这个软链接指向了`/lib64/libcrypto.so.1.1.1t`,而之前它是指向`/lib64/libcrypto.so.1.1.1k`的。这种改变可能导致与`libk5crypto.so.3`的编译环境不兼容。 ### 解决步骤 根据上述分析,我们可以尝试以下步骤来解决该问题: #### 步骤1: 确认当前OpenSSL库的链接情况 首先,检查`/lib64`目录下`libcrypto.so.1.1`的软链接指向: ```bash ls -l /lib64/libcrypto.so.1.1 ``` 如果它指向了一个较高版本的库(如`libcrypto.so.1.1.1t`),而系统中存在一个与`libk5crypto.so.3`兼容的较低版本(如`libcrypto.so.1.1.1k`),我们可以尝试将软链接改回兼容的版本。 #### 步骤2: 更改软链接指向 假设我们确认`libcrypto.so.1.1.1k`是存在的,并且我们希望使用它: ```bash sudo ln -sf /lib64/libcrypto.so.1.1.1k /lib64/libcrypto.so.1.1 ``` 这里使用`-f`选项强制覆盖现有的软链接。 #### 步骤3: 验证SSH是否正常工作 执行`ssh`命令测试: ```bash ssh -V ``` 或者尝试再次执行`git push`命令。 #### 步骤4: 如果问题依旧,检查其他库的依赖关系 使用`ldd`检查`ssh`的依赖关系: ```bash ldd /usr/bin/ssh ``` 特别关注`libk5crypto.so.3`和`libcrypto.so`的路径是否正确。 另外,检查`libk5crypto.so.3`依赖的OpenSSL库: ```bash ldd /lib64/libk5crypto.so.3 | grep crypto ``` 确保它链接的`libcrypto.so`版本与我们在步骤2中设置的版本一致。 #### 步骤5: 更新Kerberos库(可选) 如果上述步骤不能解决问题,可能需要更新或重新安装Kerberos相关库,以确保它们与当前OpenSSL版本兼容。例如,在基于RPM的系统(如CentOS)上: ```bash sudo yum update krb5-libs ``` 或者在基于Debian的系统上: ```bash sudo apt-get update sudo apt-get install --reinstall libkrb5-3 ``` #### 步骤6: 使用LD_PRELOAD(临时解决方案) 如果以上方法都无效,可以尝试临时使用`LD_PRELOAD`指定一个兼容的OpenSSL库: ```bash export LD_PRELOAD=/path/to/compatible/libcrypto.so ``` 然后再次运行`ssh`命令。但这不是一个持久的解决方案,因为它仅对当前会话有效。 ### 注意事项 - 在修改系统库的链接时,务必谨慎,因为错误的修改可能导致系统不稳定或其他应用程序无法运行。 - 建议在操作前备份相关文件。 ### 相关问题 1. 如何避免在Linux系统中出现库版本冲突? 2. 动态链接器在运行时如何解析共享库的依赖关系? 3. 除了修改软链接,还有哪些方法可以解决库版本不兼容的问题? [^1]: Linux: /usr/bin/ssh: symbol lookup error:libk5crypto.so.3: undefined symbol: EVP_KDF_ctrl。[mzhan017@citadel build_pfed]$ git push origin HEAD:refs/for/master /usr/bin/ssh: symbol lookup error: /lib64/libk5crypto.so.3: undefined symbol: EVP_KDF_ctrl, version OPENSSL_1_1_1b fatal: Could not read from remote repository. [^2]: openssl错误(/lib64/libk5crypto.so.3: undefined symbol: EVP_KDF_ctrl, version OPENSSL_1_1_1b)。[root@ktgd-web3 lib64]# find / -name 'libcrypt*' ...(省略部分输出) [^3]: libk5crypto.so.3: undefined symbol: EVP_KDF_ctrl, version OPENSSL_1_1_1b。后经过详细排查比对发现在linux目录中,/lib64/libcrypto.so.1.1软链接引用的是/lib64/libcrypto.so.1.1.1t文件冲突导致。linux系统/lib64/libcrypto.so.1.1软链接原是引用/lib64/libcrypto.so.1.1.1k文件的。可能是当时升级更换了软链接引用文件。</think>### 问题分析:SSH符号查找错误 错误信息表明 SSH 在加载 Kerberos 加密库 `libk5crypto.so.3` 时,无法找到 OpenSSL 的符号 `EVP_KDF_ctrl`(该符号属于 OpenSSL 1.1.1b 版本)。核心原因是 **OpenSSL 库版本冲突**,具体表现为: 1. 系统存在多个 OpenSSL 库版本(如 1.1.1k、1.1.1t 等)[^2] 2. `/lib64/libcrypto.so.1.1` 软链接指向了不兼容的版本(如 1.1.1t),而非原始兼容版本(如 1.1.1k)[^3] --- ### 解决方案 #### 步骤 1:确认当前软链接状态 ```bash ls -l /lib64/libcrypto.so.1.1 # 示例输出: # lrwxrwxrwx. 1 root root 19 Jan 10 11:00 /lib64/libcrypto.so.1.1 -> libcrypto.so.1.1.1t ``` #### 步骤 2:修复软链接指向兼容版本 找到系统中存在的 OpenSSL 1.1.1k 库文件(或其他兼容版本),并更新软链接: ```bash # 查找兼容库(通常位于 /usr/lib64/ 或 /lib64/) sudo find / -name "libcrypto.so.1.1.1k" 2>/dev/null # 更新软链接(假设找到 /usr/lib64/libcrypto.so.1.1.1k) sudo ln -sf /usr/lib64/libcrypto.so.1.1.1k /lib64/libcrypto.so.1.1 ``` #### 步骤 3:验证修复 ```bash # 检查软链接是否更新 ls -l /lib64/libcrypto.so.1.1 # 期望输出: -> libcrypto.so.1.1.1k # 测试 SSH 是否正常工作 ssh -V git push # 尝试原操作 ``` --- #### 备选方案:重建 Kerberos 库依赖 若问题依旧,重新链接 Kerberos 库: ```bash # 检查 Kerberos 库依赖 ldd /usr/lib64/libk5crypto.so.3 | grep crypto # 强制重建库缓存 sudo ldconfig -v ``` --- ### 问题根源 此错误通常由 **非标准升级 OpenSSL** 导致。例如: - 手动编译安装新版本 OpenSSL 后未正确更新符号链接 - 第三方软件(如安全代理)覆盖了系统库文件[^2] > **预防建议**:使用包管理器(`yum`/`apt`)升级 OpenSSL,避免手动替换库文件。 --- ### 相关问题 1. 如何安全升级 Linux 系统中的 OpenSSL 版本? 2. `ldconfig` 命令在解决库依赖冲突中的作用是什么? 3. 如何排查 Linux 动态链接库(.so)的版本兼容性问题? [^1]: Linux: /usr/bin/ssh: symbol lookup error:libk5crypto.so.3: undefined symbol: EVP_KDF_ctrl [^2]: openssl错误(/lib64/libk5crypto.so.3: undefined symbol: EVP_KDF_ctrl, version OPENSSL_1_1_1b) [^3]: libk5crypto.so.3: undefined symbol: EVP_KDF_ctrl, version OPENSSL_1_1_1b。后经过详细排查比对发现在linux目录中,/lib64/libcrypto.so.1.1软链接引用的是/lib64/libcrypto.so.1.1.1t文件冲突导致
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值