在PHP5.3.3中(在CentOS和apache2上)我试图通过php脚本连接到SFTP。代码从构造函数
中获取密钥和服务器详细信息function __construct(){
$this->host = 'servername.loc';
$this->port = SFTP_PORT;
$this->auth_user = 'username';
$this->auth_pub = '/data/home/username/.ssh/id_rsa.pub';
$this->auth_priv = '/data/home/username/.ssh/id_rsa';
$this->auth_pass = null;
$this->connection = null;
}
并使用这些详细信息来创建连接。
private function connect(){
if (!($this->connection = ssh2_connect($this->host, $this->port))) {
$this->response = array('code' => "20",
"message" => "Error connecting to SFTP server.");
return false;
}
if (!ssh2_auth_pubkey_file($this->connection, $this->auth_user, $this->auth_pub,
$this->auth_priv, $this->auth_pass)) {
$this->response = array('code' => "40",
"message" => "Error authenticating to SFTP server with key.");
$this->disconnect();
return false;
}
}
我得到的结果是对ssh2_auth_pubkey_file()
的调用错误。
错误是:
“ ssh2_auth_pubkey_file():使用公钥对USERNAME进行身份验证失败:密钥数据无效,而不是base64编码 ”
密钥上没有密码,我可以通过CLI ssh使用这些密钥手动连接到服务器。
我很难过。我需要以某种方式对密钥进行编码吗?建议?
答案 0 :(得分:5)
你提到的先决条件,即pubkey文件没有任何评论,甚至没有尾随的换行符是不正确的(当你想到它时,换行符很荒谬)。
如果你的脚本失败了,你就有了问题。很快就发现了ssh2错误,当ssh2编译为wuth libgcrypt而不是openssl时会导致ssh2失败。解决方法是使用openssl:
以PEM格式创建PEM格式的私钥文件副本~/.ssh> openssl rsa -in id_rsa -out id_rsa.pem
然后,在PHP脚本的ssh2_auth_pubkey_file()中,使用id_rsa.pem作为privkey文件而不是id_rsa,并使用省略密码。 这应该有效。
答案 1 :(得分:4)
嗯,这是数字,我在公开提问后找到答案。在另一个有dev评论的网站上找到了这个。
d23d23 at gmail dot com 说: “公钥必须在一行上,以密钥类型,1个空格开头,后跟keydata(没有换行符),后面没有注释。这是libssh2的限制,因此从文件中删除任何多余的数据用密钥生成工具创建它之后。“
因此即使我使用openssl创建私钥和公钥,我也必须编辑它以将其全部放在一行上,其密钥类型如上所述。感谢。