不使用 ssh-keygen 创建 authorized_keys 条目

不使用 ssh-keygen 创建 authorized_keys 条目

我正在使用一个已openssl安装但尚未安装的系统ssh-keygen。我无法安装新软件。我可以使用以下方式生成 SSH 密钥对openssl

sh-4.2$ openssl genrsa -out key.pem 2048
Generating RSA private key, 2048 bit long modulus
....................................................................................+++
...............................+++
unable to write 'random state'
e is 65537 (0x10001)
sh-4.2$ openssl rsa -in key.pem -outform PEM -pubout -out key.pub
writing RSA key
sh-4.2$ cat key.pub
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvGwJnfrGGvHyEigIdSg1
rZFhe+5412j4+bCdtmArUuBna6hXLs5CqJ+cmnUK8hHV7Z9t81vINAWqbNTEQfc6
PU9meCnk1RRQPqm8MeE+G5EDkyZUIanoWhT2yN46sMKEq3ChCW7Ubw+Q42BIrUIE
7pChkG0SH4TlgimkJHmV2ydE6gVlRw+EWbZzqK+IF8xjyDs7xCEmH04AoEV8mwcP
+JziGPiijArgf9M53DEYldVJFPXpti0CqDuW33ZQoiuwV1xnrEgu6kU0M/Ct6WTA
A2dgG8b17SSsL3AYxQy6YWQzD6bZ99U0sj9dW7BM3UPa/wlkgF0hHkFzPb1CBeoY
twIDAQAB
-----END PUBLIC KEY-----
sh-4.2$ 

通常我会使用它ssh-keygen来生成文件所需的 OpenSSH 格式authorized_keys

sh-4.2$ ssh-keygen -f key.pub -i -mPKCS8
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8bAmd+sYa8fISKAh1KDWtkWF77njXaPj5sJ22YCtS4GdrqFcuzkKon5yadQryEdXtn23zW8g0Baps1MRB9zo9T2Z4KeTVFFA+qbwx4T4bkQOTJlQhqehaFPbI3jqwwoSrcKEJbtRvD5DjYEitQgTukKGQbRIfhOWCKaQkeZXbJ0TqBWVHD4RZtnOor4gXzGPIOzvEISYfTgCgRXybBw/4nOIY+KKMCuB/0zncMRiV1UkU9em2LQKoO5bfdlCiK7BXXGesSC7qRTQz8K3pZMADZ2AbxvXtJKwvcBjFDLphZDMPptn31TSyP11bsEzdQ9r/CWSAXSEeQXM9vUIF6hi3
sh-4.2$ 

然而我没有ssh-keygen这个系统. 如何仅使用openssl基本实用程序来生成所需的输出?

答案1

在其他地方生成密钥对,使用本地工具进行转换,然后复制你的目标机器。


SSHv2 RSA 公钥(即长 Base64 编码的 blob)的二进制结构为:

  string    "ssh-rsa"
  mpint     e
  mpint     n

其中每个字段前面都有一个 4 字节的长度值。

您的示例显示系统上可以使用 Bash 4.2,并且大概您还拥有标准文本实用程序(例如“sed”),因此您可以使用:

#!/bin/bash

wr_string() {
        local str=$1
        local lenfmt=$(printf %08x "${#str}" | sed 's/../\\x&/g')
        printf "$lenfmt%s" "$str"
}

wr_mpint() {
        local str=$1
        if [[ $str == [89ABCDEFabcdef]* ]]; then str=0$str; fi
        if (( ${#str} % 2 )); then str=0$str; fi
        local strfmt=$(printf %s "$str" | sed 's/../\\x&/g')
        local lenfmt=$(printf %08x "$[${#str}/2]" | sed 's/../\\x&/g')
        printf "$lenfmt$strfmt"
}

e=$(openssl rsa -in "$1" -pubin -noout -text | sed -n 's/Exponent: .* (0x\([0-9a-f]*\))/\1/ip')
n=$(openssl rsa -in "$1" -pubin -noout -modulus | sed 's/^Modulus=//')

data=$({ wr_string ssh-rsa; wr_mpint "$e"; wr_mpint "$n"; } | openssl base64)
data=${data//$'\n'}

echo "ssh-rsa $data"

以 身份调用脚本bash convert.sh key.pub。这将接受仅限 RSA 密钥。

答案2

如何在另一台机器上生成 ssh 密钥对并传输它?(通过 usb 或只是将其上传到私人网络空间,然后通过 wget(甚至 curl)等方式将其下载到目标上)?

我不知道在您的特定情况下这是否是一种选择。

我只是不确定您使用 openssl 创建的密钥是否有效(如果格式正确)。ssh-keygen 有重新格式化公钥和私钥的选项(但正如您所说的那样,您本地没有它)。

相关内容