如何生成 SSHFP 记录?

Mik*_*der 45 ssh dns openssl

我需要在 DNS 中为我​​的主机设置 SSHFP 记录。我已经做了一些搜索,但我还没有找到任何好的例子。

  • 什么是 SSHFP 记录?
  • SSHFP 记录是什么样的?
  • 如何创建 SSHFP 记录?

Mik*_*der 58

什么是 SSHFP 记录?

SSHFP 记录是包含用于 SSH 的公钥指纹的 DNS 记录。它们主要用于启用 DNSSEC 的域。当 SSH 客户端连接到服务器时,它会检查相应的 SSHFP 记录。如果记录指纹与服务器匹配,则服务器是合法的并且可以安全连接。

SSHFP 记录是什么样的?

SSHFP 记录由三部分组成:

  1. 公钥算法
  2. 指纹类型
  3. 指纹(十六进制)

公钥算法

截至 2021 年,SSHFP 中定义了五种不同的算法。每个算法由一个整数表示。算法是:

  • 1 - RSA
  • 2 - 动态搜索广告
  • 3 - ECDSA
  • 4 - Ed25519
  • 6 - Ed448

指纹类型

截至 2012 年,SSHFP 中定义了两种指纹类型。每个指纹类型由一个整数表示。这些是:

  • 1 - SHA-1
  • 2 - SHA-256

如何生成 SSHFP 记录?

您可以使用ssh-keygen使用-r参数生成记录,后跟主机名(这不会影响指纹,因此您可以指定任何您喜欢的内容)

例子

使用ssh-keygen和 CentOS:

[root@localhost ~]# ssh-keygen -r my.domain.com
my.domain.com IN SSHFP 1 1 450c7d19d5da9a3a5b7c19992d1fbde15d8dad34
my.domain.com IN SSHFP 2 1 72d30d211ce8c464de2811e534de23b9be9b4dc4
Run Code Online (Sandbox Code Playgroud)

笔记

有时ssh-keygen会询问公共证书的位置。如果它询问,您将不得不ssh-keygen多次运行并且每次都指定不同的证书以确保您生成所有必要的 SSHFP 记录。您的公钥通常位于/etc/ssh.

  • 服务器是合法的,*或* DNS 服务器已被破坏。 (4认同)

小智 9

我不确定是否ssh-keygen适用于现有密钥。如果没有,您仍然可以轻松地将它们组装到您的外壳中(我更喜欢),而无需花哨的软件或远程接口。

上面提到的记录...

my.domain.com IN SSHFP 2 1 72d30d211ce8c464de2811e534de23b9be9b4dc4
Run Code Online (Sandbox Code Playgroud)

...存在 6 个部分:

part 1: hostname
part 2: Usually "IN" for internet
part 3: "SSHFP", the RR name for type 44
part 4: RSA keys     = "1"
        DSA keys     = "2"
        ECDSA keys   = "3"
        Ed25519 keys = "4"
        Ed448 keys   = "6"
part 5: The algorithm type:
        SHA-1        = "1"
        SHA-256      = "2"
part 6: You can generate, for example:

        $ awk '{print $2}' /etc/ssh/ssh_host_dsa_key.pub | \
            openssl base64 -d -A | openssl sha1
Run Code Online (Sandbox Code Playgroud)

要使用它,请放入VerifyHostKeyDNS askSSH 客户端的配置,通常是~/.ssh/config.

  • 作为记录,`ssh-keygen -r` * 确实* 为现有密钥生成 SSHFP 记录,尽管该命令的名称表明它仅用于 GENerating。 (7认同)

小智 5

旧版本的 ssh-keygen 不会生成所有可用的密钥(例如,不支持 ecdsa 和 sha256)。此脚本确实为 中的所有可用键创建了所有记录/etc/ssh/:

#!/bin/bash
#
# Creates SSHFP Records for all available keys
#

HOST="${1-$(hostname -f)}"

if [[ "$1" == "-h" || "$1" == "--help" ]]
then
  echo "Usage: sshfpgen <hostname>"
fi

if which openssl >/dev/null 2>&1
then
  if ! which sha1sum >/dev/null 2>&1
  then
    sha1sum() {
      openssl dgst -sha1 | grep -E -o "[0-9a-f]{40}"
    }
  fi
  if ! which sha256sum >/dev/null 2>&1
  then
    sha256sum() {
      openssl dgst -sha256 | grep -E -o "[0-9a-f]{64}"
    }
  fi
fi

for pubkey in /etc/ssh/ssh_host_*_key.pub /etc/ssh_host_*_key.pub
do
  case "$(cut -d _ -f3 <<< "$pubkey")"
  in
    rsa)
      echo "$HOST IN SSHFP 1 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum  | cut -f 1 -d ' ')"
      echo "$HOST IN SSHFP 1 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum  | cut -f 1 -d ' ')"
    ;;
    dsa)
      echo "$HOST IN SSHFP 2 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum  | cut -f 1 -d ' ')"
      echo "$HOST IN SSHFP 2 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum  | cut -f 1 -d ' ')"
    ;;
    ecdsa)
      echo "$HOST IN SSHFP 3 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum  | cut -f 1 -d ' ')"
      echo "$HOST IN SSHFP 3 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum  | cut -f 1 -d ' ')"
    ;;
    ed25519)
      echo "$HOST IN SSHFP 4 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum  | cut -f 1 -d ' ')"
      echo "$HOST IN SSHFP 4 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum  | cut -f 1 -d ' ')"
    ;;
    ed448)
      echo "$HOST IN SSHFP 6 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum  | cut -f 1 -d ' ')"
      echo "$HOST IN SSHFP 6 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum  | cut -f 1 -d ' ')"
    ;;
  esac
done
Run Code Online (Sandbox Code Playgroud)

编辑:来自 alex-dupuy 的带有 * BSD 支持的 PR 的新版本。

https://github.com/mindfuckup/Scr​​ipts/blob/master/sshfpgen