SSH 7.2p2 移植到fl2440记录



SSH简介:

ssh:Secure SHell,个人理解就是一种安全的网络传输服务程序 ,由客户端和服务器组成,两者间数据传输的不再是明文,而是加密后的暗文,安全性高。安全登录验证方式有两种:基于口令的安全验证,基于密钥的安全验证。具体的网上介绍的太杂,感觉前后矛盾点大就是那个将公钥传给服务端,可明明都是将私钥放到服务端,让我费解好半天。
http://skypegnu1.blog.51cto.com/8991766/1641064
https://wiki.archlinux.org/index.php/Secure_Shell_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html
http://erik-2-blog.logdown.com/posts/74081-ssh-principle
http://blog.chinaunix.net/uid-16728139-id-3265394.html

SSH的移植

编译条件:

SSH的编译需要 Zlib 和 libcrypto (LibreSSL /
OpenSSL),请见安装说明,所以先编译这两个库。

1.下载

  • openSSH
  • openSSL
  • Zlib
    如果要制作ubuntu下使用的ssh,openssl可以直接用下面两句下载安装

    sudo apt-get install openssl 
    sudo apt-get install libssl-dev

2.配置安装

为方便管理,新建一个安装目录,将上述三个包的安装目录指定到此位置。

1. zlib的编译与安装

cd zlib-1.2.8/
./configure --prefix=安装目录/zlib

在生成的Makefile文件中修改
AR=arm-none-linux-gnueabi-ar
CC=arm-none-linux-gnueabi-gcc
CPP =arm-none-linux-gnueabi-gcc -E
RANLIB=arm-linux-ar-ranlib
LDSHARED=arm-none-linux-gnueabi-gcc

make
make install

2. openssl的编译与安装

```
cd openssl-1.0.2h/
./Configure --prefix=安装目录/openssl os/compiler:arm-none-linux-gnueabi-gcc
make
make install
```

3.openssh的编译安装

  • configure opt介绍:

    1. –prefix= install architecture-independent files in PREFIX[ /usr/local ] (将体系无关文件安装到目录PREFIX里,默认是/usr/local),这里的有:

      PREFIX/etc,PREFIX/com,PREFIX/var,PREFIX/include,PREFIX/share

    2. –exec-prefix=install architecture-dependent files in EPREFIX[PREFIX](将体系相关文件安装到目录EPREFIX里)
      这里的有:

      EPREFIX/bin, EPREFIX/sbin, EPREFIX/libexec, EPREFIX/lib,

    3. –with-zlib=刚才编译出来的zlib安装路径

    4. –with-ssl-dir=刚才编译出来openssl安装路径
    5. –host=交叉编译出来的程序运行的平台
    6. –with-privsep-path=“/var/empty”的目录 (Path for privilege separation chroot)默认使用的是privsep模式,可查看READ.privsep
    7. –sysconfdir= 配置文件安装路径,此目录会影响sshd和ssh的配置寻找,如果没有使用此选项,在编译安装后,当你直接运行sshd时,它会直接去PREFIX/etc下找sshd_config,找不到就报错,只能用参数-f指明sshd_config路径。
  • 配置./configure
    配置脚本myconf.sh如下,制作好后直接运行./myconf.sh:

    anzyelay@ubuntu:openssh-7.2p2$ cat myconf.sh
    #!/bin/sh
    ./configure \
    –prefix=/usr/local/openssh \
    –host=arm-none-linux-gnueabi \
    –with-libs \
    –with-zlib=/home/anzyelay/Downloads/openssh/install/zlib \
    –with-ssl-dir=/home/anzyelay/Downloads/openssh/install/openssl \
    –disable-etc-default-login \
    CC=arm-linux-gcc \
    AR=arm-none-linux-gnueabi-ar \
    exit

    配置完后在生成的Makefile中做些修改,下面黑体就是要修改的地方

    22 DESTDIR=/home/anzyelay/Desktop/arm/myrootfs
    #我的根文件系统目录,此用来设置安装根目录,真实的安装目录为DESTDIR/PREFIX/..或 DESTDIR/EPREFIX/..
    31 STRIP_OPT=-s –strip-program=arm-none-linux-gnueabi-strip

    之所以修改DESTDIR是为了后面的安装不会错误的安到PC机上去。如果不修改也可以在安装时指明此定义。

  • 编译安装

    make & make install-nokeys

    DESTDIR修改后就可以直接用make install-nokeys而不用手动去拷贝文件了,网上的文章都是叫你手动拷贝,麻烦的要死,成功安装后多出的文件如下:

    anzyelay@ubuntu:myrootfs$ tree usr/local/openssh/
    usr/local/openssh/
    ├── bin
    │   ├── scp
    │   ├── sftp
    │   ├── ssh
    │   ├── ssh-add
    │   ├── ssh-agent
    │   ├── ssh-keygen
    │   └── ssh-keyscan
    ├── etc
    │   ├── moduli
    │   ├── ssh_config
    │   └── sshd_config
    ├── libexec
    │   ├── sftp-server
    │   ├── ssh-keysign
    │   └── ssh-pkcs11-helper
    ├── sbin
    │   └── sshd
    └── share
        └── man
            ├── man1
            │   ├── scp.1
            │   ├── sftp.1
            │   ├── ssh.1
            │   ├── ssh-add.1
            │   ├── ssh-agent.1
            │   ├── ssh-keygen.1
            │   └── ssh-keyscan.1
            ├── man5
            │   ├── moduli.5
            │   ├── ssh_config.5
            │   └── sshd_config.5
            └── man8
                ├── sftp-server.8
                ├── sshd.8
                ├── ssh-keysign.8
                └── ssh-pkcs11-helper.8
    9 directories, 28 files
    
    anzyelay@ubuntu:myrootfs$ tree var/
    var/
    └── empty
    
    1 directory, 0 files
    
    

    如果不执行make install-nokeys这一步,就需要手动移动上述文件,其中└── share和etc/moduli这两个不必需要。

4.sshd在开发板上的配置

如果是在电脑上的安装使用的是make install,从上面使用的make install-nokey可看出区别,电脑上还执行了两步check-config和host-key,因此我们在开发板上补足这两步。

  • 启动开发板
  • 添加SSHD账户
    上步的安装完成后会有一个sshd的家目录/var/empty,如果没有就自己mkdir,该文件必须是空的,具体查看 erorr.6小节的错误,也可以自行查看README.privsep文件。

    adduser -h /var/empty -g 'sshd privsep' -s /bin/false sshd sshd 
  • 手动制作sshd的私钥key
    用处:用来在通信协议建立期间验证服务器身份防止连接到伪服务器。key有公钥和私钥,无论你是用PC版的ssh-keygen还是arm版的ssh-keygen,无非是制作key的平台工具不同,实质都是一样的,但PC上生成的速度快些,所以在PC机上制作好KEY,将私钥发送到开发板上做为服务器的私钥也行(网上好多这里都说将公钥弄过来,这是错误的说法。我想这里的私钥是用在服务端认证阶段中的,而网上说的公钥是用在客户端认证时的登录验证的,两者不是一个东西,登录验证我可以使用密码验证的方式,压根就不需要客户端公钥,但如果这里服务器没有自己的私钥那无论哪 种验证方式都用不了,因为无法证明你连接的服务器是不是被伪照的,所以直接连接中断。),ed25519和ecdsa这两种类型在开发板上制作也很快,其它类型要10来分钟才能生成。
    制作key的命令:ssh-keygen
    命令格式:

    ssh-keygen -t type [-N new_passphrase] [-f output_keyfile]
    -type : 有rsa1,dsa,rsa,ecdsa,ed25519 这几种类型

    各种类型的密钥制作如下,只需要选则一种加密方式就好,推荐ecdsa,ed25519,快速高效:

    ssh-keygen -t rsa1 -f ./ssh_host_key -N ""
    ssh-keygen -t dsa -f ./ssh_host_dsa_key -N ""
    ssh-keygen -t rsa -f ./ssh_host_rsa_key -N ""
    ssh-keygen -t ecdsa -f ./ssh_host_ecdsa_key -N ""
    ssh-keygen -t ed25519 -f ./ssh_host_ed25519_key -N ""
    
    ssh_host_key    ssh_host_key.pub
    ssh_host_dsa_key  ssh_host_dsa_key.pub     
    ssh_host_rsa_key   ssh_host_rsa_key.pub
    ssh_host_ecdsa_key   ssh_host_ecdsa_key.pub 
    ssh_host_ed25519_key ssh_host_ed25519_key.pub
    

    -f 指的是保存的目录文件,执行完后会生成ssh_host_**_key和ssh_host_**_key.pub,一个是私钥,一个是公钥。
    ed25519类型可能你PC上的版本太低不支持,将做好的私钥拖到开发板上去(我们这里放到/usr/local/openssh/etc/下),在etc/sshd_config中指定譔私钥的位置,如我使用的是ecdsa类型,修改sshd_config如下。

      9 Protocol 2
     10 # HostKeys for protocol version 2
     11 #HostKey /etc/ssh/ssh_host_rsa_key
     12 #HostKey /etc/ssh/ssh_host_dsa_key
     13 HostKey /usr/local/openssh/etc/ssh_host_ecdsa_key

    同时修改使用密码登录的功能配置如下:

     45 PermitRootLogin yes
     73 PasswordAuthentication yes
     74 PermitEmptyPasswords yes

    如果想使用密钥验证可看 密钥登录使用步骤详情,有错误看error里的10小节中的总结,那里有较细的说明

5. 现在可以启动sshd了,使用全路径

  • [root@bst:/ssh]# /usr/local/openssh/sbin/sshd 
    [root@bst:/ssh]# ps |grep sshd
     1473 root       0:00 /usr/local/openssh/sbin/sshd
     1501 root       0:00 grep sshd

上面说明正常启动服务器了,每次更改配置后都要重启一次才生效。可以在PC端使用ssh命令远程登录试试,

  • anzyelay@ubuntu:etc$ ssh root@192.168.10.110
     Processing  /etc/profile... 
    Done
    [root@bst:/~]# 
    

OK,成功了


密钥登录使用步骤详情

  • 1 配置好相关文件(sshd_config)
  • 2 制作开发板上(服务端)的密钥对,使服务端能正常与外部客户端建立通信。
    命令如下:(类型也可以是其它的,自己尝试)

    ssh-keygen -t ecdsa -f ./ssh_host_ecdsa_key -N ""

    密钥对的制作也可以在其它机上进行,重点是要把该密钥对放置在sshd_config 的hostkey指定的位置
    比如我的是:HostKey /etc/ssh/ssh_host_ecdsa_key则就要将这对密钥拷贝到/etc/ssh/下,且名字要一致哦。

    PC机在登录的前期,开发板会将这个公钥分发给PC机,PC机会将这个公钥与自己的~/.ssh/known_hosts里面的保存的服务器公钥对比,如果不对就停止。这是确保不会登录到假服务器。所以,如果你的开发板上的密钥对更改了,你PC机就要删除原来旧的开发板的公钥,这样才能正常。

  • 3 在PC机上(客户端)制作密钥对,用于给服务端验证身份登录。
    命令如下:

    
    #ssh-keygen -t ecdsa
    
    
    #ls ~/.ssh/
    
    id_ecdsa  id_ecdsa.pub  known_hosts  qtc_id  qtc_id.pub
    

    不用指明地址,它会自动保存在~/.ssh/目录下 (qtc_id这对是我用QT创建的),这个私钥用于PC机加密登录信息,公钥分发给开发板,开发板用其来解密加密过的登录信息这样就完成了登录验证。

  • 4 将PC机的公钥(即id_ecdsa.pub) 添加到开发板的认证列表里,这样就可以允许该PC机登录。
    认证列表由sshd_config里的AuthorizedKeysFile %h/.ssh/authorized_keys 指定,%h是指当前用户根目录,即~/,手动将id_ecdsa.pub弄到开发板目录上,然后使用如下命令添加进去:

    [root@bst:/]# cat root/.ssh/authorized_keys cat qtc_id.pub >> root/.ssh/authorized_keys
    [root@bst:/]# cat root/.ssh/authorized_keys 
    ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCswoZR7ZK3MMtwQ/exkVd/dloZu
    ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJI5f3AQEpVLfSUw7mKV9I6GFyUu
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC4JFTrDe92BNZ8F1lqbThtstfaen0NUACsMZjm9Fjdwt8amRT5XwvlMNsKUQy
    

    上面有3条公钥了,
    或者(前提下是如果能使用空密码登录)

    ssh-copy-id -i/.ssh/制作出来的公钥.pub usr@IP地址 

    如果是使用qt的话,可以使用create new…创建一个密钥对(同第3步),然后会生成一对 qtc_id,点击deploy public key分发公钥给开发板,如果不行就如上手动添加。

  • 5 登录

    ssh root@192.168.10.110

    如果这样可以登录了但在qt里还是出错

    Connecting to host...
    SSH connection failure: Timeout waiting for reply from server.
    
    Device test failed.

    可以按上面说的用qt尝试生成不丗类型的密钥对,分发公钥给开发板,将timeout数值设置大些,这样总能成功的。

error

1. error while loading shared libraries: libz.so.1

  • 具体错误信息:

    [root@bst:/bin]# ./ssh-keygen -t rsa -f ssh_host_rsa_key -N “”
    ./ssh-keygen: error while loading shared libraries: libz.so.1: cannot
    open shary..

    [root@bst:/]# /usr/local/sbin/sshd
    /usr/local/sbin/sshd: error while loading shared libraries: libz.so.1: cannot oy
    [root@bst:/]#

  • 原因及解决办法 :
    缺少libz.so库,到libz安装目录,将lib里的三个库拷贝到文件系统根目录

    anzyelay@ubuntu:install$ cd install/zlib/
    anzyelay@ubuntu:zlib$ cp -av ./lib/*.so* ~/Desktop/arm/myrootfs/lib/
    `./lib/libz.so' -> `/home/anzyelay/Desktop/arm/myrootfs/lib/libz.so'
    `./lib/libz.so.1' -> `/home/anzyelay/Desktop/arm/myrootfs/lib/libz.so.1'
    `./lib/libz.so.1.2.8' -> `/home/anzyelay/Desktop/arm/myrootfs/lib/libz.so.1.2.8'
    

2. sshd_config: No such file or directory

  • 具体错误信息:

     [root@bst:/]# /usr/local/sbin/sshd 
    /home/anzyelay/Downloads/openssh/install/openssh/etc/sshd_config: No such file or directory
  • 原因及解决方式:
    sshd_config配置文件路径不对,使用如下命令指定sshd_config文件位置

    /usr/local/sbin/sshd -t -f 目录/sshd_config

    注:但我后来在做了上面第4步:sshd在开发板上的配置 后直接/usr/local/sbin/sshd未指定也能成功运行。。。

3. strip process terminated abnormally

  • 具体错误信息:

    /usr/bin/install -c -m 0755 -s ssh /home/anzyelay/Desktop/arm/myrootfs/usr/local/openssh/bin/ssh
    strip: Unable to recognise the format of the input file `/home/anzyelay/Desktop/arm/myrootfs/usr/local/openssh/bin/ssh'
    /usr/bin/install: strip process terminated abnormally
    
  • 原因及解决方式:
    由于我们是交叉编译的文件,而在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

4.make: [check-config] Error 2 (ignored)

  • 具体错误信息:
    在make install时出错如下

    /home/anzyelay/Desktop/arm/myrootfs/usr/local/openssh/sbin/sshd -t -f /home/anzyelay/Desktop/arm/myrootfs/usr/local/openssh/etc/sshd_config
    /home/anzyelay/Desktop/arm/myrootfs/usr/local/openssh/sbin/sshd: 1: /home/anzyelay/Desktop/arm/myrootfs/usr/local/openssh/sbin/sshd: Syntax error: word unexpected (expecting ")")
    make: [check-config] Error 2 (ignored) 
  • 原因及解决方式:
    查看Makefile中相关信息,在安装时会自动运行ssh-keygen和sshd,而此处运行程序是ARM版的,在PC平台是不可能运行成功,因此要跳过此步。使用如下命令

    make install-nokeys

    这样就没有做host-key和check-config这两步,手动到运行开发板设置下。

5. sshd re-exec requires execution with an absolute path

  • 具体错误信息:

    [root@bst:/]# ./usr/local/openssh/sbin/sshd 
    sshd re-exec requires execution with an absolute path
  • 原因及解决方式:
    使用绝对路径启动

    /usr/local/openssh/sbin/sshd

6. Privilege separation user sshd does not exist

  • 具体错误信息:

    [root@bst:/]# /usr/local/openssh/sbin/sshd 
    Privilege separation user sshd does not exist
  • 原因及解决方式:
    sshd账户不存在,需要增加该账户。sshd默认是使能Privilege separation,可以阅读README.privsep文档。

    21 You should do something like the following to prepare the privsep
    22 preauth environment:
    23
    24 # mkdir /var/empty
    25 # chown root:sys /var/empty
    26 # chmod 755 /var/empty
    27 # groupadd sshd
    28 # useradd -g sshd -c ‘sshd privsep’ -d /var/empty -s /bin/false sshd
    29
    30 /var/empty should not contain any files.

    其中groupadd,useradd命令在我的开发板上是addgroup,adduser,但分开弄没弄好,我直接使用adduser一块把分组和账户都建立了,如下sshd那行就是多出来的:

    [root@bst:/]# adduser -h /var/empty -g 'sshd privsep' -s /bin/false sshd sshd 
    [root@bst:/]# cat etc/passwd 
    root:x:0:0:root:/root:/bin/sh                                                   
    sshd:x:1001:1001:sshd privsep:/var/empty:/bin/false 
    [root@bst:/]# cat etc/group 
    root:x:1000:                                                                    
    sshd:x:1001:    
    [root@bst:/]# cat etc/shadow 
    root:!:16884:0:99999:7:::     
    sshd:!:24271:0:99999:7::: 

7.Could not load host key或/var/empty must be owned by root

  • 具体错误信息:
    运行sshd出如下错误

    [root@bst:/]# /usr/local/openssh/sbin/sshd                                      
    Could not load host key: /usr/local/openssh/etc/ssh_host_ed25519_key /var/empty must be owned by root and not group or world-writable. 
  • 原因及解决方式:
    ed25519加密类型是新版本有的,我们移植的版本是最新版,在PC上可能版本没有这么新,无法生成这种类型的密钥。那就要升级了,看了下好麻烦,直接在开发板上试试ssh-keygen,结果还挺快的!!!,不过没有这个无所谓,主要客户端和服务器端有共同的加密方式可用就可以,在其中选一种加密方式通信就行,如果不想看到这个错误可以在配置上注释掉这种host_key。

    [root@bst:/etc]# /usr/local/openssh/bin/ssh-keygen -t ed25519 -f /usr/local/open
    ssh/etc/ssh_host_ED25519_key -N ""                                              
    Generating public/private ed25519 key pair.                                     
    Your identification has been saved in /usr/local/openssh/etc/ssh_host_ED25519_k.
    Your public key has been saved in /usr/local/openssh/etc/ssh_host_ED25519_key.p.
    The key fingerprint is:                                                         
    SHA256:ju+goS7itu3p61c66xBSo2iku46pmom9zsIJj/YuBh0 root@bst                     
    The key's randomart image is: 
    +--[ED25519 256]--+                                                             
    |                 |                                                             
    |                 |                                                             
    | . o             |                                                             
    |+ E .            |                                                             
    |o= o    S        |                                                             
    |+.o .  +         |                                                             
    |=o... = .        |                                                             
    |B#o.o* o | 
    |^O/@=oo.o        |                                                             
    +----[SHA256]-----+                                                             
    [root@bst:/etc]# 
    

    第二个错误直接更改用户组就OK

    chown root:root /var/empty

8. ssh_exchange_identification: Connection closed by remote host

  • 具体错误信息:
    从PC客户端远程登录出现如下错误

    anzyelay@ubuntu:etc$ ssh root@192.168.10.110 -v
    OpenSSH_5.9p1 Debian-5ubuntu1.9, OpenSSL 1.0.1 14 Mar 2012
    debug1: Reading configuration data /etc/ssh/ssh_config
    debug1: /etc/ssh/ssh_config line 19: Applying options for *
    debug1: Connecting to 192.168.10.110 [192.168.10.110] port 22.
    debug1: Connection established.
    debug1: identity file /home/anzyelay/.ssh/id_rsa type -1
    debug1: identity file /home/anzyelay/.ssh/id_rsa-cert type -1
    debug1: identity file /home/anzyelay/.ssh/id_dsa type -1
    debug1: identity file /home/anzyelay/.ssh/id_dsa-cert type -1
    debug1: identity file /home/anzyelay/.ssh/id_ecdsa type -1
    debug1: identity file /home/anzyelay/.ssh/id_ecdsa-cert type -1
    ssh_exchange_identification: Connection closed by remote host
    
  • 原因及解决方式:
    身份交换验证时出错:查看远程服务器端的配置文件里指明的host_key位置处有没有相应的私钥,如果一个都没有就无法验证身份,所以通信关闭。制作一个私钥放到配置文件指定处就行。

9. ssh:Permission denied, please try again.

  • 具体错误信息:
    执行ssh 用户名@IP。

    anzyelay@ubuntu:etc$ ssh root@192.168.10.110 -v
    ...
    debug1: Next authentication method: publickey
    debug1: Trying private key: /home/anzyelay/.ssh/id_rsa
    debug1: Trying private key: /home/anzyelay/.ssh/id_dsa
    debug1: Trying private key: /home/anzyelay/.ssh/id_ecdsa
    debug1: Next authentication method: keyboard-interactive
    debug1: Authentications that can continue: publickey,password,keyboard-interactive
    debug1: Next authentication method: password
    root@192.168.10.110's password: debug1: Authentications that can continue: publickey,password,keyboard-interactive Permission denied, please try again. root@192.168.10.110's password: 
    debug1: Authentications that can continue: publickey,password,keyboard-interactive
    Permission denied, please try again.
    root@192.168.10.110's password: debug1: Authentications that can continue: publickey,password,keyboard-interactive debug1: No more authentication methods to try. Permission denied (publickey,password,keyboard-interactive). 
  • 原因及解决方式:
    确认过开发板上root的密码是正确的,但就是Permission denied,改为空密码也不对,连接时加上-v 查看错误信息如上。那一般就是配置sshd_config不对了。如下将PermitRootLogin修改成YES:

     44 #PermitRootLogin prohibit-password
     45 PermitRootLogin yes

    如果想不想输入密码,使能空密码就行。修改如下几个配置:

     45 PermitRootLogin yes
    
     72 # To disable tunneled clear text passwords, change to no here!
     73 PasswordAuthentication yes
     74 PermitEmptyPasswords yes
    

10. 可以SSH远程用密码验证登录开发板,但无法使用秘钥对验证登录。

  • 具体错误信息:

    anzyelay@ubuntu:zlib$ ssh root@192.168.10.110 -v
    OpenSSH_7.2p2, OpenSSL 1.0.1 14 Mar 2012
    debug1: Reading configuration data /etc/ssh/ssh_config
    debug1: Connecting to 192.168.10.110 [192.168.10.110] port 22.
    debug1: Connection established.
    debug1: identity file /home/anzyelay/.ssh/id_rsa type 1
    debug1: key_load_public: No such file or directory
    debug1: identity file /home/anzyelay/.ssh/id_rsa-cert type -1
    debug1: identity file /home/anzyelay/.ssh/id_dsa type 2
    debug1: key_load_public: No such file or directory
    debug1: identity file /home/anzyelay/.ssh/id_dsa-cert type -1
    debug1: identity file /home/anzyelay/.ssh/id_ecdsa type 3
    debug1: key_load_public: No such file or directory
    debug1: identity file /home/anzyelay/.ssh/id_ecdsa-cert type -1
    debug1: identity file /home/anzyelay/.ssh/id_ed25519 type 4
    debug1: key_load_public: No such file or directory
    debug1: identity file /home/anzyelay/.ssh/id_ed25519-cert type -1
    debug1: Enabling compatibility mode for protocol 2.0
    debug1: Local version string SSH-2.0-OpenSSH_7.2
    debug1: Remote protocol version 2.0, remote software version OpenSSH_7.2
    debug1: match: OpenSSH_7.2 pat OpenSSH* compat 0x04000000
    debug1: Authenticating to 192.168.10.110:22 as 'root'
    debug1: SSH2_MSG_KEXINIT sent
    debug1: SSH2_MSG_KEXINIT received
    debug1: kex: algorithm: curve25519-sha256@libssh.org
    debug1: kex: host key algorithm: ecdsa-sha2-nistp256
    debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC:  compression: none
    debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC:  compression: none
    debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
    debug1: Server host key: ecdsa-sha2-nistp256 SHA256:4QwH0ADqUb2zwenxAd/bV4xh6l9ESjIsMzrDcQOxeEw
    debug1: Host '192.168.10.110' is known and matches the ECDSA host key.
    debug1: Found key in /home/anzyelay/.ssh/known_hosts:1
    debug1: rekey after 134217728 blocks
    debug1: SSH2_MSG_NEWKEYS sent
    debug1: expecting SSH2_MSG_NEWKEYS
    debug1: rekey after 134217728 blocks
    debug1: SSH2_MSG_NEWKEYS received
    debug1: Skipping ssh-dss key /home/anzyelay/.ssh/id_dsa - not in PubkeyAcceptedKeyTypes
    debug1: SSH2_MSG_EXT_INFO received
    debug1: kex_input_ext_info: server-sig-algs=256,rsa-sha2-512>
    debug1: SSH2_MSG_SERVICE_ACCEPT received
    debug1: Authentications that can continue: publickey,password
    debug1: Next authentication method: publickey
    debug1: Offering RSA public key: /home/anzyelay/.ssh/id_rsa
    debug1: Authentications that can continue: publickey,password
    debug1: Offering ECDSA public key: /home/anzyelay/.ssh/id_ecdsa
    debug1: Authentications that can continue: publickey,password
    debug1: Offering ED25519 public key: /home/anzyelay/.ssh/id_ed25519
    debug1: Authentications that can continue: publickey,password
    debug1: Next authentication method: password
    root@192.168.10.110's password: 

    上面如果输入密码是可以登录的,但先前尝试的public key却怎么都无法登录。我的sshd配置是正确的:

    
    # Authentication:
    
    
    LoginGraceTime 2m
    PermitRootLogin yes 
    StrictModes yes
    MaxAuthTries 6
    MaxSessions 10
    
    RSAAuthentication yes
    PubkeyAuthentication yes
    
    
    # The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
    
    
    # but this is overridden so installations will only check .ssh/authorized_keys
    
    
    #AuthorizedKeysFile %h/.ssh/authorized_keys
    
    
  • 出现的几种不同原因及解决方法:

    1. 原因是我的/root目录的拥有者是未知的如下:

      [root@bst:/]# ls -l
      total 28
      drwxrwxr-x    2 1000     root          4096 May 25  2016 bin
      drwxrwxrwt    5 root     0            13080 Jun 17 09:53 dev
      drwxrwxr-x    5 1000     root          4096 Jun 17  2016 etc
      drwxrwxr-x    3 1000     root          4096 Jun 17  2016 lib
      lrwxrwxrwx    1 root     root            11 May 20  2016 linuxrc -> bin/busybox
      dr-xr-xr-x   39 root     0                0 Jan  1  1970 proc
      drwx------    3 1000     root          4096 Jun 15  2016 root
      drwxrwxr-x    2 1000     root          4096 May 20  2016 sbin
      drwxr-xr-x   12 root     0                0 Jun 17 09:53 sys
      drwxrwxrwt    2 root     0               40 Jun 17 09:53 tmp
      drwxrwxr-x    6 1000     root          4096 Jun 12  2016 usr
      drwxrwxr-x    3 1000     root          4096 Jun 13  2016 var
      [root@bst:/]# 
      

      更改拥有者后OK。

      [root@bst:/]# chown root:root root/
    2. 在做本地回环测试时(ssh localhost)也出现上述问题,发现需要把.ssh/id_rsa.pub这个公钥添加到自己的认证列表后就应该删除它才行,否则总是无法登录。
    3. 认证的用户目录的上级目录拥有者出错,比如使用SSH登录git账户时,在git目录下有.ssh/authorized_keys,并且权限拥有者都是对的,也无法使用密钥登录。后来发现是 ../这个目录的拥有者是anzye(如下),我试着改为git,就OK了,

      root@ubuntu:/home/git# ll
      total 44
      drwxr-xr-x 4 git git 4096 Jun 26 18:03 ./
      drwx------ 5 anzye anzye 4096 Jun 26 17:46 ../
      -rw------- 1 git git    5 Jun 26 18:03 .bash_history
      -rw-r--r-- 1 git git  220 Jun 26 17:46 .bash_logout
      -rw-r--r-- 1 git git 3486 Jun 26 17:46 .bashrc
      -rw-r--r-- 1 git git 8445 Jun 26 17:46 examples.desktop
      -rw-r--r-- 1 git git  675 Jun 26 17:46 .profile
      drwxrwxr-x 7 git git 4096 Jun 26 17:57 repo.git/
      drwxr--r-- 2 git git 4096 Jun 26 18:03 .ssh/

    总结下使用密钥对登录验证的过程及要求:

    • 登录客户端身份验证的过程:
      先说明下登录验证是在ssh客户端与服务端通信协议建立后并且服务端验证通过了才开始的(这阶段需要服务器有自己的私钥,通过sshd_config的HostKey指明,这个私钥之所以网上方法都是在PC端做好移动过来,是因为PC做的快,开发板制作太慢了,这网上一片大抄,只懂抄抄也不说明原因,搞的莫名其妙越说越乱居然变成公钥了!!)。它的连接阶段具体可参看我上面提供的连接博文,
      而登录客户验证需要客户端将自己的公钥添加到服务端的authorized_keys文件列表里面(该文件位置在sshd_config中由AuthorizedKeysFile指明,否则默认为服务器的~/.ssh/下),客户端在提出登录请求后,服务端到authorized_keys寻找公钥并利用它加密认证信息发送回给客户端,客户端通过对应的私钥(该文件位置在ssh_config中由IdentityFile指定,默认在~/.ssh/下)解密后发回信息给服务器通过认证。

    • 根据上述简要说明可知要求如下

      • 服务器端(开发板)sshd配置及文件权限要求,使能下面两选项,指定公钥列表文件

        RSAAuthentication yes
        PubkeyAuthentication yes
        
        #AuthorizedKeysFile %h/.ssh/authorized_keys
        

        此处注释是使用默认的家目录/.ssh/authorized_keys,你可以通过cat /etc/passwd查看当前用户的家目录比如:

        [root@bst:/.ssh]# cat /etc/passwd
        root:x:0:0:root:/root:/bin/sh
        sshd:x:1001:1001:sshd privsep:/var/empty:/bin/false
        

        我开发板的root的家目录是/root,如果没有请自己更改指明,重点要注意的是家目录的权限是700(其它地方测试只要限制写权限就行)及拥有者是自己,而authorized_keys的权限也要求是600,任何一处有问题都将导致无法验证,这个很好理解,客户端也是一样的,这样才使得安全性得以保证,任何一个用户只能使用自己的私钥和公钥列表而不会让其它用户登录。因此如果你想登录你开发板的其它用户(比如anzyelay)上而不是root,那么必须在/home/anzyelay/.ssh/的authorized_keys添加你的公钥。

      • 配置好后,客户要登录服务器,必须在制作密钥对,指定私钥,添加公钥到服务器,默认私钥在~/.ssh/下(查看ssh_config)。

        1. ssh-keygen -t rsa/dsa/ecdsa/ed25519
          类型自己选一类就可,这样会在默认的~/.ssh/下出现一对密钥,如果你 -f指定了生成位置,则要将这生成的一对密钥(只私钥不行)全拷贝到~/.ssh/下
        2. ssh-copy-id -i ~/.ssh/制作出来的公钥.pub usr@IP地址
          这样会自动将公钥加到开发板用户sshd服务默认的~/.ssh/authorized_keys里,这个需要能先使用密码验证.
          也可手动拷贝添加:将公钥复制到开发板目录上,使用下面命令添加 :
          touch ~/.ssh/authorized_keys
          cat **.pub >> authorized_keys

11.Host key verification failed

  • 具体错误信息:

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
    Someone could be eavesdropping on you right now (man-in-the-middle attack)!
    It is also possible that a host key has just been changed.
    The fingerprint for the ED25519 key sent by the remote host is
    SHA256:n0vBJ8X2zFGZAve8Aik1Yh+OGWPxVwEK+xg8R5RACbs.
    Please contact your system administrator.
    Add correct host key in /home/anzyelay/.ssh/known_hosts to get rid of this message.
    Offending ECDSA key in /home/anzyelay/.ssh/known_hosts:1
    ED25519 host key for 192.168.10.110 has changed and you have requested strict checking.
    Host key verification failed.
    
  • 原因及解决方法:
    服务端的host_key改变了,与客户端的known_hosts第一行记录的有差,删除记录后重登

    anzyelay@ubuntu:openssh-7.2p2$ ssh-keygen -R 192.168.10.110
    
    # Host 192.168.10.110 found: line 1
    
    /home/anzyelay/.ssh/known_hosts updated.
    Original contents retained as /home/anzyelay/.ssh/known_hosts.old
    anzyelay@ubuntu:openssh-7.2p2$