阻止 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
读取生成的密钥,我想它仅针对以下场景进行了测试:
通过添加行
使用 PEM 格式的密钥
hostKeyFormat=PEM
归档etc/org.apache.karaf.shell.cfg
- 使用
openssl
工具生成密钥:
openssl genrsa -out etc/host.key 4096
Karaf启动后会使用openssl生成的key,不会尝试自己生成。针对 karaf 4 进行了测试。1.x
我注意到 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
读取生成的密钥,我想它仅针对以下场景进行了测试:
通过添加行
使用 PEM 格式的密钥hostKeyFormat=PEM
归档
etc/org.apache.karaf.shell.cfg
- 使用
openssl
工具生成密钥:openssl genrsa -out etc/host.key 4096
Karaf启动后会使用openssl生成的key,不会尝试自己生成。针对 karaf 4 进行了测试。1.x