docker安装openssh-server启动报“Unable to load host key: /etc/ssh/ssh_host_rsa_key”
故障现象
在CentOS的镜像基础上安装了 openssh-server。 启动时候却报错
Unable to load host key: /etc/ssh/ssh_host_rsa_key
Unable to load host key: /etc/ssh/ssh_host_ecdsa_key
Unable to load host key: /etc/ssh/ssh_host_ed25519_key
故障原因分析
- 从提示信息看是sshd守护进程不能加载主机密钥文件,因为找不到这些密钥文件(配置文件/etc/ssh/sshd_config中已定义密钥文件名与路径);
# The RSA private key for version SSH2
HostKey /etc/ssh/ssh_host_rsa_key
# The ECDSA private key used by the sshd daemon
HostKey /etc/ssh/ssh_host_ecdsa_key
# The ED25519 private key used by the sshd daemon
HostKey /etc/ssh/ssh_host_ed25519_key
- 一般openssh服务正常安装后,主机会自动生成相应的主机密钥文件,但这里因未知原因并没有完成这一步动作,导致无法远程ssh连接。
故障解决方法
运行
/usr/bin/ssh-keygen -A
命令含义:
ssh-keygen -A
For each of the key types (rsa, dsa, ecdsa and ed25519) for which host keys do not exist, generate the host keys with the default key file path, an empty passphrase, default bits for the key type, and default comment. If -f has also been specified, its argument is used as a prefix to the default path for the resulting host key files. This is used by /etc/rc to generate new host keys.
对于每种尚不存在主机密钥的密钥类型(rsa、dsa、ecdsa和ed25519),使用默认的密钥文件路径、空的密码短语、密钥类型的默认位数和默认注释生成主机密钥。如果也指定了 -f,则其参数将用作生成的主机密钥文件的默认路径的前缀。这在 /etc/rc 中用于生成新的主机密钥。
扩展:HostKey 的功能
HostKey 是ssh-server这边的密钥文件,用于从客户端获取“会话密钥”以便后续数据传输, 工作流程:
1、 客户端需要使用适当的客户端程序来请求连接服务器,服务器将服务器的公钥(例如:ssh_host_rsa_key.pub )发送给客户端。(服务器的公钥产生过程:服务器每次启动sshd服务时,该服务会主动去找/etc/ssh/ssh_host*文件,若系统刚装完,由于没有这些公钥文件,因此sshd会主动去计算出这些需要的公钥文件,同时也会计算出服务器自己所需要的私钥文件。)
2、 服务器生成会话ID,并将会话ID发给客户端。
3、 若客户端第一次连接到此服务器,则会将服务器的公钥数据记录到客户端的用户主目录内的~/.ssh/known_hosts。若是已经记录过该服务器的公钥数据,则客户端会去比对此次接收到的与之前的记录是否有差异。客户端生成会话密钥,并用服务器的公钥加密后,发送给服务器。
4、服务器用自己的私钥将收到的数据解密,获得会话密钥。
5、 服务器和客户端都知道了会话密钥,以后的传输都将被会话密钥加密。