嵌入式平台ssh开发环境搭建

版权声明:本文为转载文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
原文链接: https://blog.csdn.net/wanvan/article/details/87779150

为了传输文件和远程控制的方便,目前要给fsl imx6开发板移植SSH环境。

OpenSSL 可以为 OpenSSH 提供加密传输支持,是 OpenSSH 的一个中间件)版本和 Zlib (提供压缩传输支持)版本

SSH协议族可以用来进行远程控制, 附加的SFTP协议可轻松实现在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是极为不安全的,因为它们使用明文传送密码。
OpenSSH常常被误认以为与OpenSSL有关联,但实际上这两个计划的有不同的目的,不同的发展团队,名称相近只是因为两者有同样的软件发展目标──提供开放源代码的加密通讯软件。

可直接下载使用我编译好的SSH环境,避免自己去编译:

下载链接:

下载之后使用方式:

下载压缩包后解压得到:

   

在这里插入图片描述
拷贝上述目录拷贝至开发板/usr目录下,然后参照本文后面‘移植至嵌入式板子过程’配置下环境即可。

一、下载源码

Zlib源码下载链接
https://nchc.dl.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz

OpenSSL源码下载链接
https://www.openssl.org/source/openssl-1.0.2q.tar.gz

OpenSSH源码下载链接
ftp://mirror.internode.on.net/pub/OpenBSD/OpenSSH/portable/openssh-7.9p1.tar.gz

因为它们之间没有版本所谓的版本冲突,所以都下载最新版的即可。我搭建imx6可以用的ssh环境使用的如下源码:zlib-1.2.11.tar.gz、openssl-1.0.2q.tar.gz、openssh-7.9p1.tar.gz,其他版本过程一样。

二、部署

1、创建工作目录:
mkdir -p /home/eric/SelfCompile/SSH
2、在/work目下面创建安装、解压目录

cd /home/eric/SelfCompile/SSH
mkdir decompressed install
//install 软件安装目录 【tag:最终make出来的ssh并不是在install目录,而是在openssh源码目录。但是未了管理的一致性,还是创建次install目录】
//decompressed 源码包解压目录

3、解压安装包:
tar zxvf zlib-1.2.11.tar.gz –C …/decompressed
tar zxvf openssl-1.0.2q.tar.gz –C …/decompressed
tar zxvf openssh-7.9p1.tar.gz –C …/decompressed

三、配置&编译Zlib

./configure --prefix=/opt/ssh_arm32/ssh 【前面有CC、AR之类的配置反而configure会出错】

按如上配置后,会生成Makefile

生成的Makefile中已经是交叉编译工具链对应的编译器,故不需要再修改。然后:

make
sudo make install

最终生成的如下

第2次编译——修改路径至eric路径,避免使用root账号

./configure --prefix=/home/eric/SelfCompile/SSH/install

四、配置&编译OpenSSL

./Configure --prefix=/home/eric/SelfCompile/SSH/install os/compiler:arm-poky-linux-gnueabi-gcc
OpenSSL虽然源码中解压后自带有Makefile,但是CC等不是交叉编译的。故需要导入交叉编译的配置。导入配置指令如上,跟Zlib核OpenSSH导入配置不一样;

导入完之后的Makefile如下:下面的CC要去掉arm-poky-linux-gnueabi-,因为重复了,导致编译出错。

之后make成功,但是sudo make install时报找不到arm-poky-linux-gnueabi-ranlib。原因就是:sudo切换到root账户下去make install时,root账户下面的arm-poky-linux-gnueabi-ranlib环境变量没有配好(看PATH变量可以发现没有arm-poky-linux-gnueabi-ranlib对应的路径)。所以干脆–prefix=/home/eric/SelfCompile/SSH/install,这样就不需要sudo make install了。

最终make install成功

五、配置&编译OpenSSH

不依赖ZLib和OpenSSL时编译
AR=arm-poky-linux-gnueabi-ar LD=arm-poky-linux-gnueabi-ld AS=arm-poky-linux-gnueabi-as CC=arm-poky-linux-gnueabi-gcc ./configure -cache-file=cache0 --host=arm-poky-linux --prefix=/opt/ssh_arm32/ssh CFLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a9 --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi"

LDFLAGS=-L/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi/usr/lib 【加上此LDFLAGS,后面还是报找不到部分库和.o文件】

按上述进行配置生成makefike没有报错;

Make编译

编译报上述错误,但是实际上交叉编译工具链的某些目录下存在上述文件,不知道为啥还报错。
原因:上述文件的链接路径没有指向正确。如果将上述.o和.so拷贝到当前编译的工程目录下。则不会报上述错误。所以,解决的方式是,将上述.o和so文件的路径指定正确。

arm-poky-linux-gnueabi-ld -o ssh ssh.o readconf.o clientloop.o sshtty.o sshconnect.o sshconnect2.o mux.o -L. -Lopenbsd-compat/ -Wl,-O1 -Wl,–hash-style=gnu -Wl,–as-needed -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack -pie -lssh -lopenbsd-compat -lcrypto -ldl -lutil -lz -lcrypt -lresolv

arm-poky-linux-gnueabi-gcc -o ssh ssh.o readconf.o clientloop.o sshtty.o sshconnect.o sshconnect2.o mux.o -L /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi/usr/lib:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi/usr/lib/arm-poky-linux-gnueabi/5.3.0 -Lopenbsd-compat/ -Wl,-O1 -Wl,–hash-style=gnu -Wl,–as-needed -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack -pie -lssh -lopenbsd-compat -lcrypto -ldl -lutil -lz -lcrypt -lresolv

但弄了好久还是出现找不到一些库和.o文件。尤其是-lgcc,交叉编译环境下没有此库。

依赖Zlib和OpenSSL之后重新编译
之前编译OpenSSH,不依赖依赖Zlib和OpenSSL库,编译报上述错误。现在尝试依赖这2个工程编译出的库。后来编译通过,说明编译OpenSSH是必须依赖Zlib和OpenSSL库才行。

配置:
AR=arm-poky-linux-gnueabi-ar LD=arm-poky-linux-gnueabi-ld AS=arm-poky-linux-gnueabi-as CC=arm-poky-linux-gnueabi-gcc ./configure --host=arm-poky-linux --prefix=/home/eric/SelfCompile/SSH/install --with-libs --with-zlib=/opt/ssh_arm32/ssh/zlib --with-ssl-dir=/home/eric/SelfCompile/SSH/install/openssl --disable-etc-default-login

【后来发现:按上述–prefix=/home/eric/SelfCompile/SSH/install 导致最终板子上运行sshd时跑去上述路径去找依赖,而板子上肯定是没有这个eric账号路径的。实际上是不需要配置–prefix。默认/usr路径即可】

故用imx6交叉编译环境最终可行的配置是:
AR=arm-poky-linux-gnueabi-ar LD=arm-poky-linux-gnueabi-ld AS=arm-poky-linux-gnueabi-as CC=arm-poky-linux-gnueabi-gcc ./configure --host=arm-poky-linux --with-libs --with-zlib=home/eric/SelfCompile/SSH/install/zlib --with-ssl-dir=/home/eric/SelfCompile/SSH/install/openssl --disable-etc-default-login

Make编译:
出现如下错误

对应Makefile中出错位置如下:

原因及解决方式:
由于我们是交叉编译的文件,而在make install时使用的strip不是交叉编译版的,所以不能正解执行。网上找了一圈也是只能注释掉Makefile中的STRIP_OPT=-s这一选项。后来自己man install时看到有个”–strip-program”的选项,尝试了下将STRIP_OPT=改为如下,再make install时此错误就消息了。

STRIP_OPT=-s --strip-program=arm-none-linux-gnueabi-strip 【有效】

https://blog.csdn.net/flfihpv259/article/details/51601403

之后接着make install【不需要这一步】

实际上不需要make install。 如上,ssh-keygen等文件是arm32的,直接拷贝到嵌入式板子上即可。不需要make install

六、移植至嵌入式板子过程

移植时不需要另外移植Zlib、OpenSSL编译出的内容。只需要拷贝OpenSSH编译出的东西即可。移植OpenSSH的过程如下:

创建目录
确保开发板上有以下目录,若没有,则新建:
/usr/local/bin
/usr/local/etc
/usr/libexec
/var/run
/var/empty/sshd

拷贝生成的文件至开发板

将 openssh目录下文件拷贝到开发板系统中,具体为:
scp、sftp、ssh 、ssh-add、ssh-agent、ssh-keygen、ssh-keyscan共7个文件拷贝到开发板/usr/local/bin

moduli、ssh_config、sshd_config共3个文件拷贝到开发板 /usr/local/etc

sftp-server、ssh-keysign 共2个文件拷贝到开发板 /usr/libexec

sshd 拷贝到/usr/sbin

【前面openssh configure时不要带–prefix时,则ssh make之后默认到板子/usr路径】

生成key

在虚拟机/home/eric/SelfCompile/SSH/decompress/openssh-7.9p1路径下执行一下操作:

ssh-keygen -t rsa -f ssh_host_rsa_key -N “”
ssh-keygen -t dsa -f ssh_host_dsa_key -N “”
ssh-keygen -t ecdsa -f ssh_host_ecdsa_key -N “”
ssh-keygen -t dsa -f ssh_host_ed25519_key -N “”

修改 ssh_host_ed25519_key 权限为 600:

$ chmod 600 ssh_host_ed25519_key

其中 ssh_host_ed25519_key 是SSH第二版协议用到的key,需要修改权限,否则会提示以下错误:
Permissions 0644 for ‘/usr/local/etc/ssh_host_ed25519_key’ are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /usr/local/etc/ssh_host_ed25519_key
Could not load host key: /usr/local/etc/ssh_host_ed25519_key

将生成的 ssh_host_* 8个文件copy到目标板的 /usr/local/etc/目录下(含有.pub文件)

这里有很重要的一件事要做,在你的开发板中执行一下命令:这一步如果没做SSH移植就无法成功,该步骤困扰我很长时间。

chmod 700 /usr/local/etc/*

如果你没进行上述操作就会出现大量的如下图的错误

添加用户
修改目标板根文件系统/etc目录下【注意不是安装路径/usr/local/etc这个目录】的 passwd 和group文件,添加上sshd用户和组,步骤如下:

cd /etc
vi passwd

//在文件末尾添加一下内容并保存退出:
sshd:*:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin1

vi group
//添加
sshd:*:74:

修改sshd_config
修改sshd_config文件如下选项,其他按默认配置:

HostKey for protocol version 1
HostKey /usr/local/etc/ssh_host_key
HostKeys for protocol version 2
HostKey /usr/local/etc/ssh_host_rsa_key
HostKey /usr/local/etc/ssh_host_dsa_key

PermitRootLogin yes #――允许根用户登陆
PermitEmptyPasswords yes #――允许使用空密码,即不需要密码
UsePrivilegeSeparation no #――把安全级别降低,因为不会连接互联网

override default of no subsystems
Subsystem sftp /usr/local/libexec/sftp-server #――指定sftp服务路径,否则将不能启动sftp服务,将不能进行文件的上传和下载

注意事项(开发板上操作)
1、/打开开发板/usr/local/sshd_config,将PermitRootLogin yes前的注释“#”号去掉。
如果开发板的 root 用户还没有密码,键入以下命令然输入两次密码来修改,否其他设备无法连:
$ passwd root
密码更改失败,查询/etc/目录下是否有shadow文件夹,没有请创建

设置SSH开机自动启动

重启开发板之后,发现ssh 失败了,原因是因为sshd 服务没有启动,需要在/etc/init.d/rcS 中添加一行,设置为开机启动
/usr/sbin/sshd

SSH登录方式
注意:能远程登陆的前提是, 嵌入式板子IMX6和主机需在同一个局域网内;

Linux系统下:
ssh root@192.168.1.111 即可登录

我windows上VirtualBox下的Ubuntu 配置的网络地址转换(NAT)。可以直接用上述命令远程登陆上IMX6。

Windows系统下:
用SSH Secure Shell Client等SSH连接终端;

碰到的问题

ssh-keygen -R——板子上是ssh server修改配置后主机再次连接报如下问题:

按上面提示删掉即可:
ssh-keygen -R [服务器ip address]

登录SSH问题-Permission denied, please try again.

我们往下拖拖,找到如下行数:

我们可以看到,这几行默认不允许root登录SSH,所以我们要进行相应设置,sshd_config修改配置如下:
Authentication:
LoginGraceTime 120
#PermitRootLogin without-password
PermitRootLogin yes
StrictModes yes
OK,此时就允许root登录ssh了

https://www.cnblogs.com/yixius/articles/6971054.html

ssh client 报 algorithm negotiation failed的解决方法

https://www.kuanxu.com/server/debian/9.html

修改嵌入式板子上sshd的配置文件 /usr/local/etc/sshd_config
在sshd_config配置文件中添加:

Ciphers aes128-cbc,aes192-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr,3des-cbc,arcfour128,arcfour256,arcfour,blowfish-cbc,cast128-cbc

MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-sha1-96,hmac-md5-96

KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,curve25519-sha256@libssh.org

重启sshd服务后,即可正常连接。

参考文章

成功移植 SSH 服务到 ARM 开发板上
https://blog.csdn.net/xy010902100449/article/details/50343733 【重点】

arm开发板 移植SSH操作说明
https://blog.csdn.net/u013711616/article/details/53044918

ARM交叉编译搭建SSH-Server至目标板
https://blog.csdn.net/gubenpeiyuan/article/details/32325691

SSH 成功移植到 ARM 平台
https://blog.csdn.net/hpu11/article/details/78808142

http://www.talkwithtrend.com/Article/39407

https://blog.csdn.net/xjmbufan/article/details/83099398

https://blog.csdn.net/lell3538/article/details/51769840 【很好】

                                </div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-095d4a0b23.css" rel="stylesheet">
                </div>