阻止 Karaf 在启动时生成新的 SSH 密钥

Stop Karaf from generating new SSH keys on startup

我注意到 Karaf 在每次启动时都会生成新的 SSH 密钥。它使通过 ssh 连接的自动脚本变得无用,因为每次都必须手动接受新密钥。

是否可以停止该行为并在每次新安装时只生成一次新密钥?

更多调试信息:我注意到,'etc/host.key' 没有改变。但是,在停止并启动 karaf 后,我收到消息:

ssh -p 8101 localhost -oHostKeyAlgorithms=+ssh-dss

Offending DSA key in ~/.ssh/known_hosts:5
  remove with:
  ssh-keygen -f "~/.ssh/known_hosts" -R [localhost]:8101
DSA host key for [localhost]:8101 has changed and you have requested strict checking.
Host key verification failed.

生成 DSA 密钥的事实也与 karaf.log 中的日志消息不匹配:

INFO | sshd-SshServer[20056f77]-nio2-thread-2 | SimpleGeneratorHostKeyProvider | 48 - org.apache.sshd.core - 1.2.0 | generateKeyPair(RSA) generating host key - size=4096

我的etc/org.apache.karaf.shell.cfg:

sshPort=8101
sshHost=0.0.0.0
sshRealm=karaf
hostKey=${karaf.etc}/host.key
algorithm=RSA
keySize=4096

在挖掘日志后我发现,host.key 文件没有正确加载:

2017-03-29T13:44:58,977 | WARN | sshd-SshServer[18c17f90]-nio2-thread-1 | SimpleGeneratorHostKeyProvider | 48 - org.apache.sshd.core - 1.2.0 | resolveKeyPair(~/karaf-docker/apache-karaf-4.1.0/etc/host.key) Failed (InvalidKeySpecException) to load: Missing classes: org.bouncycastle.jcajce.provider.asymmetric.rsa.BCRSAPrivateCrtKey 2017-03-29T13:45:00,340 | ERROR | sshd-SshServer[18c17f90]-nio2-thread-1 | SimpleGeneratorHostKeyProvider | 48 - org.apache.sshd.core - 1.2.0 | Overwriting key (~/karaf-docker/apache-karaf-4.1.0/etc/host.key) is disabled: using throwaway ssh-dss: SHA256:3yWwxdzoymMvEBYIWMIguQ8G3J7kfapd+avCMoue2R4 2017-03-29T13:45:00,342 | WARN | sshd-SshServer[18c17f90]-nio2-thread-1 | ServerSessionImpl

Apache SSHD reads/writes host.key 使用 Java 序列化,这可能会导致 OSGi 出现问题(而且,可能更糟糕的是,重新部署功能可能会使文件变得无用)。

Karaf 会在您首次使用 ssh 连接时创建服务器密钥。然后它会将密钥放在 karaf home etc/host.key 中。所以密钥应该只为每个 karaf 服务器创建一次。

您也可以在那里提供自己的密钥以避免创建开销。

密钥由org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider生成。当它创建密钥时,您应该会在日志中看到此消息:

generateKeyPair(RSA) generating host key - size=4096

我决定回答我自己的问题,因为我找到了一个不需要参与有关 karaf 实施等讨论的解决方案。

问题的原因是因为 Karaf 模块 org.apache.karaf.shell.ssh 无法持久化或无法从 host.key 读取生成的密钥,我想它仅针对以下场景进行了测试:

  1. 通过添加行

    使用 PEM 格式的密钥

    hostKeyFormat=PEM

    归档etc/org.apache.karaf.shell.cfg

  2. 使用 openssl 工具生成密钥:

    openssl genrsa -out etc/host.key 4096

Karaf启动后会使用openssl生成的key,不会尝试自己生成。针对 karaf 4 进行了测试。1.x