AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 603982
Accepted
Craig Ringer
Craig Ringer
Asked: 2014-06-10 20:28:22 +0800 CST2014-06-10 20:28:22 +0800 CST 2014-06-10 20:28:22 +0800 CST

为什么我的 OpenSSH 密钥指纹与 AWS EC2 控制台密钥对指纹不匹配?

  • 772

当我将我的 OpenSSH 公钥导入 AWS EC2 的密钥环时,AWS 显示的指纹与我看到的不匹配:

ssh-keygen -l -f my_key

它是不同的长度并且具有不同的字节。

为什么?我确定我上传了正确的密钥。

ssh
  • 8 8 个回答
  • 26753 Views

8 个回答

  • Voted
  1. Best Answer
    Craig Ringer
    2014-06-10T20:28:22+08:002014-06-10T20:28:22+08:00

    AWS EC2 显示的是 SSH2 指纹,而不是大家期望的 OpenSSH 指纹。用户界面中没有这样说。

    它还显示两种完全不同的指纹,具体取决于密钥是在 AWS 上生成并下载的,还是您是否上传了自己的公钥。

    生成的指纹

    ssh-keygen -l -f id_rsa
    

    与 EC2 显示的不匹配。您可以使用 AWS API 工具通过ec2-fingerprint-key命令生成指纹,也可以使用 OpenSSL 来执行此操作。

    请注意,如果您最初在 AWS 上生成了密钥,但随后再次上传(例如,到另一个区域),那么您将获得不同的指纹,因为它将采用 SSH2 RSA 指纹,而不是它为您显示的密钥的 sha1在 AWS 上生成。

    好玩,嘿?此屏幕截图中有两个具有不同指纹的相同密钥副本

    在上面,test-generated是使用 AWS EC2 生成的。是 AWS 生成、提取并再次上传test-generated-reuploaded的私钥中的公钥。ssh-keygen -y第三个密钥test-uploaded是本地生成的密钥……但本地ssh-keygen -l指纹是b2:2c:86:d6:1e:58:c0:b0:15:97:ab:9b:93:e7:4e:ea。

    $ ssh-keygen -l -f theprivatekey
    2048 b2:2c:86:d6:1e:58:c0:b0:15:97:ab:9b:93:e7:4e:ea
    $ openssl pkey -in theprivatekey -pubout -outform DER | openssl md5 -c
    Enter pass phrase for id_landp:
    (stdin)= 91:bc:58:1f:ea:5d:51:2d:83:d3:6b:d7:6d:63:06:d2
    

    上传到 AWS 的密钥

    当您将密钥上传到 AWS 时,您仅上传公钥,AWS 会显示公钥的 MD5 哈希值。

    您可以使用 OpenSSL(如Daniel 在 AWS 论坛上演示的那样)以 AWS使用的格式生成指纹,以显示上传的公钥 (SSH2 MD5) 的指纹,例如:

    7a:58:3a:a3:df:ba:a3:09:be:b5:b4:0b:f5:5b:09:a0
    

    如果您有私钥,您可以通过从私钥中提取公共部分并使用以下方法对其进行散列来生成指纹:

    openssl pkey -in id_rsa -pubout -outform DER | openssl md5 -c
    

    如果您只有公钥,并且它是 OpenSSH 格式,您需要先将其转换为 PEM,然后是 DER,然后是哈希,使用:

    ssh-keygen -f id_rsa.pub -e -m PKCS8 | openssl pkey -pubin -outform DER | openssl md5 -c
    

    在 AWS 上生成的密钥

    当您在 AWS 上生成密钥对时,AWS 会显示私钥的 SHA1 哈希,该哈希更长,例如:

    ea:47:42:52:2c:25:43:76:65:f4:67:76:b9:70:b4:64:12:00:e4:5a
    

    在这种情况下,您需要使用以下命令(也由 Daniel 在 AWS 论坛上展示)根据私钥生成 sha1 哈希:

    openssl pkcs8 -in aws_private.pem -nocrypt -topk8 -outform DER | openssl sha1 -c
    

    在下载的 AWS 生成的私钥/证书文件上。它也适用于您转换为 OpenSSH 格式的密钥。但是,这确实要求您拥有私钥,因为哈希是私钥的。如果您只有公钥,则无法在本地生成哈希。

    参考

    看:

    • AWS 开发者论坛讨论
    • https://stackoverflow.com/q/19251562/398670
    • AWS 论坛上的错误报告 - 请加入
    • 155
  2. J. Doe
    2017-02-18T05:28:47+08:002017-02-18T05:28:47+08:00

    如果您只有公钥,您可以按如下方式生成 AWS 指纹:

    ssh-keygen -e -f id_rsa.pub -m pkcs8 | openssl pkey -pubin -outform der | openssl md5 -c
    
    • 22
  3. goutham
    2017-06-21T00:27:02+08:002017-06-21T00:27:02+08:00

    AWS 文档上有一个资源http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#verify-key-pair-fingerprints

    如果您使用 AWS 创建了密钥对,则可以使用 OpenSSL 工具从私有密钥文件生成指纹:

    复制

    $ openssl pkcs8 -in path_to_private_key -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c
    

    如果您使用第三方工具创建了密钥对并将公钥上传到 AWS,则可以使用 OpenSSL 工具从本地计算机上的私钥文件生成指纹:

    复制

    $ openssl rsa -in path_to_private_key -pubout -outform DER | openssl md5 -c
    

    输出应与控制台中显示的指纹匹配。

    • 4
  4. Max Murphy
    2017-09-11T05:29:22+08:002017-09-11T05:29:22+08:00

    这就是我使用的:

    openssl rsa -RSAPublicKey_in -in <(ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PEM) -inform PEM -outform DER 2>/dev/null | openssl md5 -c | awk '{print $2}'
    

    这从公钥生成指纹,类似于上面的一些。

    • 3
  5. nbari
    2016-10-11T07:05:49+08:002016-10-11T07:05:49+08:00

    以防万一这可能有用:https ://ssh-vault.com/post/fingerprint/

    例如:

    $ ssh-vault -u bob -f
    

    将打印与 AWS 使用的格式匹配的用户 bob 的指纹。

    • 1
  6. Andy
    2017-02-09T14:37:59+08:002017-02-09T14:37:59+08:00

    对于我们这些使用 Python 的人

    from Crypto.PublicKey import RSA
    import hashlib
    import base64
    
    #Load your key from disk, or a string, or generate.
    my_key = RSA.importKey(open(my_rsa_private_key, 'r').read())
    
    # Normal md5 fingerprint
    fp_plain = hashlib.md5(base64.b64decode(my_key.exportKey('OpenSSH').strip().split()[1].encode('ascii'))).hexdigest()
    print ':'.join(a+b for a,b in zip(fp_plain[::2], fp_plain[1::2]))
    
    #AWS' EC2 fingerprint
    public_only_key = RSA.importKey(my_key.exportKey('OpenSSH'))
    fp_plain = hashlib.md5(public_only_key.exportKey('DER')).hexdigest()
    print ':'.join(a+b for a,b in zip(fp_plain[::2], fp_plain[1::2]))
    
    • 1
  7. Sandjaie Ravi
    2018-06-25T22:59:08+08:002018-06-25T22:59:08+08:00
    #!/bin/bash
    key_file=$1
    if [[ -n $key_pub_file ]]; then
        ssh-keygen -e -f $key_pub_file -m pkcs8 | openssl pkey -pubin -outform der | openssl md5 -c
    else
        echo "pass the pub file as argument"
    fi
    

    这是我使用的一个脚本,将脚本路径添加到env。感谢 J.Doe 的回答

    • 1
  8. Reto Höhener
    2019-04-28T05:39:23+08:002019-04-28T05:39:23+08:00

    Java(使用 BouncyCastle)。如果 AWS 控制台显示较短的密钥,请尝试使用 MD5。(SHA1:20 字节,MD5:16 字节)。

      /**
       * @return the SHA1 digest of the DER encoded RSA private key, e.g. 16:61:7d:1c:e7:d1:3b:93:b6:81:bf:64:7a:a0:38:fa:b6:6c:9e:e4
       */
      private String getAwsFingerprint(File rsaPrivateKeyFileFromAws) throws Exception {
        try(FileReader reader = new FileReader(rsaPrivateKeyFileFromAws)) {
          java.security.KeyPair keyPair = new JcaPEMKeyConverter().getKeyPair((PEMKeyPair) new PEMParser(reader).readObject());
          String hex = Hex.toHexString(MessageDigest.getInstance("SHA1").digest(keyPair.getPrivate().getEncoded()));
          StringBuilder sb = new StringBuilder();
          for(int i = 0; i < hex.length();) {
            sb.append(hex.charAt(i++));
            sb.append(hex.charAt(i++));
            sb.append(i % 2 == 0 && i != hex.length() ? ":" : "");
          }
          return sb.toString();
        }
      }
    
    • 0

相关问题

  • 如何最好地设置 ssh 隧道以访问远程网络 (Linux)

  • SSH 和重定向

  • 通过 SSH 会话使用 NET USER 命令拒绝访问

  • SSH 服务器零日漏洞利用 - 保护自己的建议

  • ubuntu apt-get upgrade - 如何在 shell 中单击确定?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve