![不使用 ssh-keygen 创建 authorized_keys 条目](https://linux22.com/image/1626822/%E4%B8%8D%E4%BD%BF%E7%94%A8%20ssh-keygen%20%E5%88%9B%E5%BB%BA%20authorized_keys%20%E6%9D%A1%E7%9B%AE.png)
我正在使用一个已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 有重新格式化公钥和私钥的选项(但正如您所说的那样,您本地没有它)。