嵌入式平台ssh开发环境搭建
Posted kn-zheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式平台ssh开发环境搭建相关的知识,希望对你有一定的参考价值。
为了传输文件和远程控制的方便,目前要给fsl imx6开发板移植SSH环境。
OpenSSL 可以为 OpenSSH 提供加密传输支持,是 OpenSSH 的一个中间件)版本和 Zlib (提供压缩传输支持)版本
SSH协议族可以用来进行远程控制, 附加的SFTP协议可轻松实现在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是极为不安全的,因为它们使用明文传送密码。
OpenSSH常常被误认以为与OpenSSL有关联,但实际上这两个计划的有不同的目的,不同的发展团队,名称相近只是因为两者有同样的软件发展目标──提供开放源代码的加密通讯软件。
可直接下载使用我编译好的SSH环境,避免自己去编译:
下载链接:
下载之后使用方式:
下载压缩包后解压得到:
- 1
拷贝上述目录拷贝至开发板/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
重启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 【很好】
嵌入式4412开发平台Android系统开发环境搭建以及编译
详情了解:http://topeetboard.com 更多了解:https://arm-board.taobao.com
以上是关于嵌入式平台ssh开发环境搭建的主要内容,如果未能解决你的问题,请参考以下文章