2014-02-09 85 views
0

我想连接我的EC2实例与ssh2 php模块。我已经从known_hosts文件获得公钥(格式:“ssh-rsa XXXX ...”放入“public.txt”文件),我使用亚马逊keypair.pem作为私钥(“ -----开始RSA私人密钥----- XXXX ...“private.pem)。无法连接到EC2在PHP与ssh2_auth_pubkey_file

我使用这个PHP代码:

$connection = ssh2_connect('XXXX.eu-west-1.compute.amazonaws.com', 22, array('hostkey'=>'ssh-rsa'));  
if(!ssh2_auth_pubkey_file(
    $connection, 
    'ubuntu', 
    'public.txt', 
    'private.pem' 
)) 
    die("Auth error"); 
$sftp = ssh2_sftp($connection); 

我得到的错误是: ssh2_auth_pubkey_file():身份验证失败使用公钥Ubuntu的:用户名/公钥组合无效

我是什么做错了?

回答

1

known_hosts文件中的公钥不是您需要使用的公钥。相反,您需要使用authorized_keys中的公钥。

这就是说,libssh2甚至需要公钥的事实是愚蠢的。老实说,我建议你使用phpseclib, a pure PHP SSH2 implementation, over libssh2。例如。

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

$ssh = new Net_SFTP('www.domain.tld'); 
$key = new Crypt_RSA(); 
$key->loadKey(file_get_contents('private.pem')); 
if (!$ssh->login('username', $key)) { 
    exit('Login Failed'); 
} 

print_r($ssh->nlist()); 
?> 
+0

我们用这种方式解决了 – xspecial

+0

任何想法为什么ssh2_auth_pubkey_file要求公钥?为什么公钥应该采用OpenSSH格式? –

+0

@ bogdanioan.gabor - SSH的工作方式是您向其发送用户名和公钥以用于进行身份验证。如果服务器接受它,则需要使用私钥签名,以便服务器可以使用公钥对其进行验证。所以当libssh2请求公钥时,可能是因为它不能从私钥中提取公钥,也不能将格式转换为合适的公钥。 – neubert