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的编译需要 Zlib 和 libcrypto (LibreSSL /
OpenSSL),请见安装说明,所以先编译这两个库。
Zlib
如果要制作ubuntu下使用的ssh,openssl可以直接用下面两句下载安装
sudo apt-get install openssl
sudo apt-get install libssl-dev
为方便管理,新建一个安装目录,将上述三个包的安装目录指定到此位置。
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
```
cd openssl-1.0.2h/
./Configure --prefix=安装目录/openssl os/compiler:arm-none-linux-gnueabi-gcc
make
make install
```
configure opt介绍:
–prefix= install architecture-independent files in PREFIX[ /usr/local ] (将体系无关文件安装到目录PREFIX里,默认是/usr/local),这里的有:
PREFIX/etc,PREFIX/com,PREFIX/var,PREFIX/include,PREFIX/share
–exec-prefix=install architecture-dependent files in EPREFIX[PREFIX](将体系相关文件安装到目录EPREFIX里)
这里的有:
EPREFIX/bin, EPREFIX/sbin, EPREFIX/libexec, EPREFIX/lib,
–with-zlib=刚才编译出来的zlib安装路径
配置./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这两个不必需要。
如果是在电脑上的安装使用的是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小节中的总结,那里有较细的说明
[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,成功了
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数值设置大些,这样总能成功的。
具体错误信息:
[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'
具体错误信息:
[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未指定也能成功运行。。。
具体错误信息:
/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
具体错误信息:
在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这两步,手动到运行开发板设置下。
具体错误信息:
[root@bst:/]# ./usr/local/openssh/sbin/sshd
sshd re-exec requires execution with an absolute path
原因及解决方式:
使用绝对路径启动
/usr/local/openssh/sbin/sshd
具体错误信息:
[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:::
具体错误信息:
运行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
具体错误信息:
从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
具体错误信息:
执行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.
[email protected]'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
具体错误信息:
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: [email protected]
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: kex: server->client cipher: [email protected] MAC: compression: none
debug1: kex: client->server cipher: [email protected] 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
出现的几种不同原因及解决方法:
原因是我的/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/
ssh localhost
)也出现上述问题,发现需要把.ssh/id_rsa.pub
这个公钥添加到自己的认证列表后就应该删除它才行,否则总是无法登录。认证的用户目录的上级目录拥有者出错,比如使用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)。
touch ~/.ssh/authorized_keys
cat **.pub >> authorized_keys
具体错误信息:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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$