【问题标题】:phpseclib OpenSSH or PuTTYgen key generationphpseclib OpenSSH 或 PuTTYgen 密钥生成
【发布时间】:2016-07-07 15:01:48
【问题描述】:

我正在尝试生成私有和公共 RSA 密钥,因此我可以将其传递给供应商并连接到他们的 SFTP 服务器。 我为此使用 phpseclib,但无论我创建什么密钥,供应商都会收到错误消息,指出输入的 SSH 密钥无效且不受支持。请输入有效的密钥(OpenSSH 或 PuTTYgen)

我试过了:

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();

$rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PUTTY);
$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_OPENSSH);

//define('CRYPT_RSA_EXPONENT', 65537);
//define('CRYPT_RSA_SMALLEST_PRIME', 982451653); // makes it so multi-prime RSA is used
extract($rsa->createKey()); // == $rsa->createKey(1024) where 1024 is the key size

echo $privatekey;
echo "\n\n\n";
echo $publickey;
?>

这是生成密钥的示例:

PuTTY-User-Key-File-2: ssh-rsa
Encryption: none
Comment: phpseclib-generated-key
Public-Lines: 4
AAAAB3NzaC1yc2EAAAADAQABAAAAgQDFkOp+otBkW4gkiNZ9xbWrWjzAok+iD+gc
GESAyE3FLMFteQtJbpHlsix2eeBTCTjgPXiaRHABtzeqyr6nuO44uXLotJ4WVHOJ
5G75QFWZL0j61LLWZmHB7oxF2Vdt7BFAINu/UbGAhBVRdBaNDRxKSW/10KToOC+b
1yhEAR9MXw==
Private-Lines: 8
AAAAgEZ1qXvieynfjw1glAalFWZ4N0SIXpgwzhn++adoSHwyuwVc7w6QVY4y3jKe
wsc6ecNXiQSTtdKW0k6iIh7VEHggCwMjVIi752jYhiV2wc2gSaP5PnjYyrRpsVb8
JjXZToYeRvWNvNPh4aS4x3CTSpB4BLcZ+7V451bNUy84XIM5AAAAQQDm+1RLu5o3
NmUazpJT3a/KpEtfO5Fg4RuBgFu0dXM6+lfueFUMxpVJ1JY1eWRtCD7gr0EqYC3U
HtNxuOoBk1pdAAAAQQDa9wkbrpQparL9GAoqWU4rP2bjBZ9Nd6fVozswgzGU4cUx
nuxvirPdQfwBAKk8czSH1bY64NVfNF8nhNXCTS3rAAAAQC3Sse80v03IRDg/gT29
VDeCj0P7chs7A0yQ3i4O/jf+s76hBGmpnif1bkkXENfue3Rswxsbq7CVy6Tww7W1
BFk=
Private-MAC: 89412f0a7977af0b8bd29bb67522628b4ab49ca8



ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDFkOp+otBkW4gkiNZ9xbWrWjzAok+iD+gcGESAyE3FLMFteQtJbpHlsix2eeBTCTjgPXiaRHABtzeqyr6nuO44uXLotJ4WVHOJ5G75QFWZL0j61LLWZmHB7oxF2Vdt7BFAINu/UbGAhBVRdBaNDRxKSW/10KToOC+b1yhEAR9MXw== phpseclib-generated-key

我做错了什么?

【问题讨论】:

  • 这确实不是与编程相关的问题,但您要发送给他们哪个部分?
  • 我将连接到他们服务器的公钥。我应该向他们发送私钥吗?
  • 不,公钥是正确的,只是没有说明。
  • 我能够使用您的公钥/私钥对登录 SSH 服务器。我的猜测:您的供应商不知道他们在做什么。如果他们使用 OpenSSH 服务器,则公钥需要在 /home/user/.ssh/authorized_keys 文件中。

标签: php rsa sftp phpseclib


【解决方案1】:

PuTTY 键的底部有一个 Private-MAC 部分,而您的则没有。 phpseclib 生成的 PuTTY 密钥中包含此部分。我的代码:

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PUTTY);

extract($rsa->createKey());

echo $privatekey;

输出:

PuTTY-User-Key-File-2: ssh-rsa
Encryption: none
Comment: phpseclib-generated-key
Public-Lines: 4
AAAAB3NzaC1yc2EAAAADAQABAAAAgQC61/qDBnv1Fhz7QUe5Bq9gBrUlS/sJZxiv
CR5/a1ZlaTbb+V9ayK/f/7YvF/m9OnLE8qVQPdrGQ511xdk9WSO5LABNLReOIT/t
ylbtM17Cl3If5BHm1jXK5Edxi5GPdOTfI3UJ2puoGsOxunKtDKflbbkIvPyoV/BJ
W5+bZE6Jgw==
Private-Lines: 8
AAAAgELxiS8SzqzkTGP1YrY3X/R+0r5XN82Jo71q/gNXOPBCv0YXVgPX7bPLEcJT
y8XxwBcyfOqADveEWFFPHuOtIW/lSui1WxXxxyhP3L+0Utt9SzhW8PKeciAAJjLg
EzvQT/njSsPL9dFkfci6Ayc6cilvodCWhuJO74b8FPpqHQ15AAAAQQDcsrV3p5Du
mFJ9fNvu3yer8poBaAU5QqsKgyMl7rnEnExEfIbo0utVUh2GYHeHRFJbTpErm8ia
+IgV3Mo50OCVAAAAQQDYuvoI7jbRltk/YvwjS1+nE+BaHlArnF5wQwZiKvxJxSzo
lF8nn+HTRBo9eGflCCBN5ZX4liq3VUFN1Eb/m0O3AAAAQQCNlBIwB1SorqE/7M8G
VfJaJZScayO8HUSFGDk6ufXV0HquvaRIUGKEuezoTZU/tru+Q9CRMomSH3gFLrUj
f7s8
Private-MAC: e00a2fc04cf1d1acfa0f148d606f0d590e90f844

那个键在 puttygen 中打开得很好。

我的猜测:您要么对密钥进行了错误的复制/粘贴,不小心遗漏了一部分密钥,这会妨碍我们为您提供帮助,要么...您使用的是经过修改的 phpseclib 版本删除 Private-MAC 行。

我的意思是,我什至不认为 phpseclib 的过时版本会解释该行的省略,因为我认为每个版本的 phpseclib 都包含该行。

【讨论】:

  • 嗨,抱歉,我在帖子中跳过了 Private-MAC(现已编辑)。但是,它是被拒绝的公钥,因为我只是将那个发送给供应商。
  • 我现在可以在 puttygen 中打开您的密钥。我把你的公钥放到了我的 authorized_keys 文件中,就可以用你的私钥通过 SSH 连接到机器上了。您说“供应商收到错误消息”。你的供应商是什么?如果我能够使用您发布的密钥使用 PuTTY 登录,那么在我看来,您的供应商有误。 PuTTY 是 PuTTY 格式的事实上的权威,如果 PuTTY 喜欢密钥而您的供应商不喜欢……那么您的供应商可能不像 PuTTY 那样权威。甚至是 OpenSSH,因为 OpenSSH 也喜欢公钥。