opessh 在 arm linux 上移植

1 源码

版本匹配和兼容很重要,我不知道网上一些组合的版本是怎么调成功的,我这里使用 openssl-0.9.8以上的版本均失败。

版本:openssh-6.3.P1
wget -c https://github.com/openssh/openssh-portable/archive/refs/tags/V_6_3_P1.tar.gz
tar xzvf V_6_3_P1.tar.gz
mv openssh-portable-V_6_3_P1/ openssh-6.3p1
cd openssl-6.3p1

依赖库:
openssl-0.9.8e
zlib-1.2.11
注:这两个版本匹配的,大于openssh-6.3p1 和 openssl-0.9.8e 的版本,未能移植成功,不是编译有问题,就是编出来不能正常执行。

2 编译 zlib

./configure --prefix=/usr/local/arm/zlib
执行后,修改Makefile 中的CC 和CPP 为:
CC=arm-linux-gnueabihf-gcc
CPP=arm-linux-gnueabihf-gcc
make
make install

3 编译依赖库 openssl

版本:openssl-0.9.8e

openssl 编译配置

./Configure no-asm --prefix=/usr/local/arm/openssl-0.9.8e os/compiler:arm-linux-gnueabihf-gcc

openssl 编译

make
make install

常见错误:
编译和安装openssl时出错,POD document had syntax errors
错误信息:
  installing man1/smime.1
  smime.pod around line 272: Expected text after =item, not a number
  smime.pod around line 276: Expected text after =item, not a number
  smime.pod around line 280: Expected text after =item, not a number

处理:
perl 版本太高了,安排低版本perl 5.16能够解决问题,或者去掉 pod2man 程序,编完再加回来:
sudo mv /usr/bin/pod2man /usr/bin/pod2man_bak
编译完记得再改回来。。。
sudo mv /usr/bin/pod2man_bak /usr/bin/pod2man

4 编译 openssh

配置

autoreconf --install
./configure --prefix=/usr/local/openssh --host=arm-linux --with-libs --with-zlib=/usr/local/arm/zlib --with-ssl-dir=/usr/local/arm/openssl-0.9.8e --disable-etc-default-login CC=arm-linux-gnueabihf-gcc AR=arm-linux-gnueabihf-ar

编译

make
编译完成后,生成一系列可执行文件,应用工具有:
scp, sftp, ssh, ssh-add, ssh-agent, ssh-keygen, ssh-keysign, ssh-keyscan

服务程序有:
sshd, sftp-server

瘦身

嵌入式系统空间紧张的话,可以剥离调试信息瘦身:
arm-linux-gnueabihf-strip -o strip/scp scp
arm-linux-gnueabihf-strip -o strip/sftp sftp
arm-linux-gnueabihf-strip -o strip/sftp-server sftp-server
arm-linux-gnueabihf-strip -o strip/ssh ssh
arm-linux-gnueabihf-strip -o strip/ssh-add ssh-add
arm-linux-gnueabihf-strip -o strip/ssh-agent ssh-agent
arm-linux-gnueabihf-strip -o strip/sshd sshd
arm-linux-gnueabihf-strip -o strip/ssh-keygen ssh-keygen
arm-linux-gnueabihf-strip -o strip/ssh-keysign ssh-keysign
arm-linux-gnueabihf-strip -o strip/ssh-keyscan ssh-keyscan

可以做一个打包脚本,打到 openssh-6.3p1-install 目录:
#!/bin/bash
make -p openssh-6.3p1-install/bin
make -p openssh-6.3p1-install/sbin
make -p openssh-6.3p1-install/etc
cp scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keysign ssh-keyscan openssh-6.3p1-install/bin
cp sshd sftp-server openssh-6.3p1-install/sbin
cp moduli openssh-6.3p1-install/etc
cp ssh_config openssh-6.3p1-install/etc
cp sshd_config openssh-6.3p1-install/etc

5 复制文件到目标板上

在目标板上建立如下目录,并将对应文件复制到对应目录:
将scp, sftp, ssh, ssh-add, ssh-agent, ssh-keygen, ssh-keysign, ssh-keyscan 复制到/usr/local/openssh/bin;
将 sshd, sftp-server 复制到 /usr/local/openssh/sbin
将 moduli, sshd_config, ssh_config 复制到 /usr/local/openssh/etc;

可写脚本如下:
#!/bin/sh
mkdir -p /usr/local/openssh/bin
mkdir -p /usr/local/openssh/sbin
mkdir -p /usr/local/openssh/etc
cd /usr/local/openssh
cp openssh-6.3p1-install/bin/scp ./bin
cp openssh-6.3p1-install/bin/sftp ./bin
cp openssh-6.3p1-install/bin/ssh ./bin
cp openssh-6.3p1-install/bin/ssh-add ./bin
cp openssh-6.3p1-install/bin/ssh-agent ./bin
cp openssh-6.3p1-install/bin/ssh-keygen ./bin
cp openssh-6.3p1-install/bin/ssh-keysign ./bin
cp openssh-6.3p1-install/bin/ssh-keyscan ./bin

cp openssh-6.3p1-install/sbin/sshd ./sbin
cp openssh-6.3p1-install/sbin/sftp-server ./sbin
cp openssh-6.3p1-install/etc/moduli ./etc
cp openssh-6.3p1-install/etc/ssh_config ./etc
cp openssh-6.3p1-install/etc/sshd_config ./etc

6 目标板上的设置

6.1 生成所需的密钥文件(公钥+私钥)

加密系统中,任何一台计算机都需要有一对密钥(公钥+私钥)来验证自己的身份。
首先,生成服务器的密钥:

6.1.1 生成服务器密钥

cd /usr/local/openssh/etc
…/bin/kegen -t rsa -f ssh_host_rsa_key -N “”
一般用上述这个命令即可。

如需其他类型的密钥文件,可继续执行:
例如:rsa1 为版本1的密钥格式:
…/bin/kegen -t rsa1 -f ssh_host_key -N “”
dsa格式密钥:
…/bin/kegen -t dsa -f ssh_host_dsa_key -N “”

6.1.2 生成客户端访问的密钥

…/bin/kegen -t rsa -f user_key -N “”

6.1.3 许可客户端访问密钥

将公钥 user_key.pub 的内容复制到 .ssh/authorized_keys 文件中:
cat user_key.pub >> ~/.ssh/authorized_keys
这样,目标板(做为 SSHD 服务器)就会允许 authorized_keys 中的密钥身份访问它;

6.1.4 将客户端密钥复制到要访问此目标板的计算机上

复制 user_key 到客户端计算机,那么就可以从此客户端,使用此密钥来访问此目标板;

6.2 配置服务

cd /usr/local/openssh/etc
vi sshd_config
按需设置内容:

主要选项:
1)设置许可密钥的文件位置:
AuthorizedKeysFile .ssh/authorized_keys

2)是否允许 root 用户远程登录
设置为允许:
PermitRootLoin yes

3)协议版本
设置为2 更安全
Protocol 2

4)禁止使用密码登录
这样,远程登录使用密钥的话,就不需要再输入密码了:
PasswordAuthentication no

5)是否使用 challenge-response 验证方式
挑战身份验证模式,类似于微软的chap协议。openSSH在实现挑战响应模式的时候可采用S/KEY(one-time one-password)
不允许,只使用密钥文件:
ChallengeResponseAuthentication no

6)host key的位置
主机的私钥文件路径:
HostKey /usr/local/openssh/etc/ssh_host_rsa_key
缺省情况下,此路径位于编译 openssh 时所给定的 --prefix 目录下的 etc 目录中

7)端口
缺省是 22
Port 22

8)监听地址
缺省监听所有地址:
ListenAddress 0.0.0.0

7 启动 sshd 服务并登录

配置好之后,就可以启动 sshd 服务,sshd 所使用的配置文件,也就是 sshd_config 文件,缺省位置位于 于编译 openssh 时所给定的 --prefix 目录下的 etc 目录中,例如本例编译 openssh 时给定 --prefix=/usr/local/openssh,则缺省配置文件路径为:
/usr/local/openssh/etc/sshd_config,
也可以在启动 sshd 命令时用参数 -f 指定。
执行命令启动服务:
/usr/local/openssh/sbin/sshd
此命令开启守护进程,客户端就可以登录了。

后台日志输出,可以用 -ddd 输出3级服务日志:
/usr/local/openssh/sbin/sshd -ddd

常见错误:
1) 无法登录 refused
服务日志显示:
Authentication refused: bad ownership or modes for directory /home/root
原因:/home/root 权限太过宽松
解决:修改 /home/root 权限:
chmod go-w /home/root
chmod 700 /home/root/.ssh
chmod 600 /home/root/.ssh/authorized_keys
曾经遇到改完权限仍然不行,经检查,发现 root 目录owner有问题:
drw------- 4 1000 1000 728 Mar 16 16:59 root
修改 root owner 为root 可解决问题:
chown root:root /home/root

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值