【问题标题】:InvalidKeySpecException while doing ssh with sshj using ppk使用 ppk 对 sshj 进行 ssh 时出现 InvalidKeySpecException
【发布时间】:2018-12-13 10:53:15
【问题描述】:

我正在尝试使用 sshj java 库 ssh 到带有 ppk 文件的 ec2 redhat 实例,我得到 InvalidKeySpecException 。我能够成功地通过 ssh 连接到具有相同 ppk 的其他机器。 我想我在 ec2 实例中缺少一些配置,任何帮助将不胜感激。

注意:我可以通过 putty 对相关机器执行 ssh。

下面是我在应用程序中得到的堆栈跟踪:

net.schmizz.sshj.transport.TransportException: java.security.spec.InvalidKeySpecException: key spec not recognised
        at net.schmizz.sshj.transport.TransportException$1.chain(TransportException.java:33)
        at net.schmizz.sshj.transport.TransportException$1.chain(TransportException.java:27)
        at net.schmizz.concurrent.Promise.deliverError(Promise.java:95)
        at net.schmizz.concurrent.Event.deliverError(Event.java:74)
        at net.schmizz.concurrent.ErrorDeliveryUtil.alertEvents(ErrorDeliveryUtil.java:34)
        at net.schmizz.sshj.transport.KeyExchanger.notifyError(KeyExchanger.java:386)
        at net.schmizz.sshj.transport.TransportImpl.die(TransportImpl.java:600)
        at net.schmizz.sshj.transport.Reader.run(Reader.java:67)
Caused by: net.schmizz.sshj.common.SSHException: java.security.spec.InvalidKeySpecException: key spec not recognised
        at net.schmizz.sshj.common.SSHException$1.chain(SSHException.java:36)
        at net.schmizz.sshj.common.SSHException$1.chain(SSHException.java:29)
        at net.schmizz.sshj.transport.TransportImpl.die(TransportImpl.java:595)
        ... 1 common frames omitted
Caused by: net.schmizz.sshj.common.SSHRuntimeException: java.security.spec.InvalidKeySpecException: key spec not recognised
        at net.schmizz.sshj.common.Buffer.readPublicKey(Buffer.java:466)
        at net.schmizz.sshj.transport.kex.AbstractDHG.next(AbstractDHG.java:66)
        at net.schmizz.sshj.transport.KeyExchanger.handle(KeyExchanger.java:358)
        at net.schmizz.sshj.transport.TransportImpl.handle(TransportImpl.java:503)
        at net.schmizz.sshj.transport.Decoder.decode(Decoder.java:102)
        at net.schmizz.sshj.transport.Decoder.received(Decoder.java:170)
        at net.schmizz.sshj.transport.Reader.run(Reader.java:59)
Caused by: java.security.GeneralSecurityException: java.security.spec.InvalidKeySpecException: key spec not recognised
        at net.schmizz.sshj.common.ECDSAVariationsAdapter.readPubKeyFromBuffer(ECDSAVariationsAdapter.java:92)
        at net.schmizz.sshj.common.KeyType$3.readPubKeyFromBuffer(KeyType.java:113)
        at net.schmizz.sshj.common.Buffer.readPublicKey(Buffer.java:464)
        ... 6 common frames omitted
Caused by: java.security.spec.InvalidKeySpecException: key spec not recognised
        at org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi.engineGeneratePublic(Unknown Source)
        at org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi.engineGeneratePublic(Unknown Source)
        at java.security.KeyFactory.generatePublic(KeyFactory.java:334)
        at net.schmizz.sshj.common.ECDSAVariationsAdapter.readPubKeyFromBuffer(ECDSAVariationsAdapter.java:90)
    ... 8 common frames omitted

【问题讨论】:

    标签: amazon-ec2 sshj


    【解决方案1】:

    ppk 文件是 Putty 私钥文件,与 SSHJ 支持的 OpenSSH 格式不兼容。您可以使用以下命令将 ppk 文件转换为 SSHJ 使用:puttygen <keyfile>.ppk -O private-openssh -o <outfile>

    【讨论】:

    • 我试图听从您的建议,但它只是打开了 Putty 密钥生成器 UI。这是预期的吗?我假设不是,但如果是这样,我应该如何处理对话框,因为我没有尝试生成密钥?
    【解决方案2】:

    这个非常棘手,sshj 库使用 ssh-rsa 算法。 所以我们需要在 ec2 实例中添加 ssh-rsa 算法。 步骤:

    1. 编辑文件 /etc/ssh/sshd_config。
    2. 添加条目 HostKeyAlgorithms ssh-rsa

    之后就开始工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 2020-03-31
      相关资源
      最近更新 更多