【问题标题】:Connection with server using private key Jsch使用私钥 Jsch 与服务器连接
【发布时间】:2022-01-27 05:27:02
【问题描述】:

我可以使用 myKey.pem 连接远程服务器。现在我想将这个 pem 键的内容存储到 String privateKey 中,然后使用 Jsch 进行连接。

        JSch jsch = new JSch();
        Session session;
        session = jsch.getSession(username, host, 22);
        session.setConfig("StrictHostKeyChecking", "no");
        if (StringUtils.hasText(password)) {
            session.setPassword(password);
        } else {
            jsch.addIdentity(privateKey);
        }
        session.connect();
        return session;

myKey.pem 有如下数据

-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA3Tz2mr7SZiAMfQyuvBjM9Oi..Z1BjP5CE/Wm/Rr500P
RK+Lh9x5eJPo5CAZ3/ANBE0sTK0ZsDGMak2m1g7..3VHqIxFTz0Ta1d+NAj
wnLe4nOb7/eEJbDPkk05ShhBrJGBKKxb8n104o/..PdzbFMIyNjJzBM2o5y
5A13wiLitEO7nco2WfyYkQzaxCw0AwzlkVHiIyC..71pSzkv6sv+4IDMbT/
XpCo8L6wTarzrywnQsh+etLD6FtTjYbbrvZ8RQM..Hg2qxraAV++HNBYmNW
s0duEdjUbJK+ZarypXI9TtnS4o1Ckj7POfljiQI..IBAFyidxtqRQyv5KrD
kbJ+q+rsJxQlaipn2M4lGuQJEfIxELFDyd3XpxP..Un/82NZNXlPmRIopXs
2T91jiLZEUKQw+n73j26adTbteuEaPGSrTZxBLR..yssO0wWomUyILqVeti
6AkL0NJAuKcucHGqWVgUIa4g1haE0ilcm6dWUDo..fd+PpzdCJf1s4NdUWK
YV2GJcutGQb+jqT5DTUqAgST7N8M28rwjK6nVMI..BUpP0xpPnuYDyPOw6x
4hBt8DZQYyduzIXBXRBKNiNdv8fum68/5klHxp6..4HRkMUL958UVeljUsT
BFQlO9UCgYEA/VqzXVzlz8K36VSTMPEhB5zBATV..PRiXtYK1YpYV4/jSUj
vvT4hP8uoYNC+BlEMi98LtnxZIh0V4rqHDsScAq..VyeSLH0loKMZgpwFEm
bEIDnEOD0nKrfT/9K9sPYgvB43wsLEtUujaYw3W..Liy0WKmB8CgYEA34xn
1QlOOhHBn9Z8qYjoDYhvcj+a89tD9eMPhesfQFw..rsfGcXIonFmWdVygbe
6Doihc+GIYIq/QP4jgMksE1ADvczJSke92ZfE2i..fitBpQERNJO0BlabfP
ALs5NssKNmLkWS2U2BHCbv4DzDXwiQB37KPOL1c..kBHfF2/htIs20d1UVL
+PK+aXKwguI6bxLGZ3of0UH+mGsSl0mkp7kYZCm..OTQtfeRqP8rDSC7DgA
kHc5ajYqh04AzNFaxjRo+M3IGICUaOdKnXd0Fda..QwfoaX4QlRTgLqb7AN
ZTzM9WbmnYoXrx17kZlT3lsCgYEAm757XI3WJVj..WoLj1+v48WyoxZpcai
uv9bT4Cj+lXRS+gdKHK+SH7J3x2CRHVS+WH/SVC..DxuybvebDoT0TkKiCj
BWQaGzCaJqZa+POHK0klvS+9ln0/6k539p95tfX..X4TCzbVG6+gJiX0ysz
Yfehn5MCgYEAkMiKuWHCsVyCab3RUf6XA9gd3qY..fCTIGtS1tR5PgFIV+G
engiVoWc/hkj8SBHZz1n1xLN7KDf8ySU06MDggB..hJ+gXJKy+gf3mF5Kmj
DtkpjGHQzPF6vOe907y5NQLvVFGXUq/FIJZxB8k..fJdHEm2M4=
-----END RSA PRIVATE KEY-----

但我正面临java.io.FileNotFoundException: -----BEGIN RSA PRIVATE KEY--的异常

谁能指导我如何做到这一点?

【问题讨论】:

标签: java session jsch


【解决方案1】:

现在我想把这个 pem 密钥的内容存入一个 String privateKey...

您不必这样做,因为addIdentity(privateKey) 将“私钥文件的文件名”作为字符串参数。这就是您收到以下错误的原因:java.io.FileNotFoundException: -----BEGIN RSA PRIVATE KEY--。您传递的是文件的内容而不是文件名/路径,JSch 尝试使用您提供的字符串读取文件(即 "-----BEGIN RSA PRIVATE KEY--。 .."),但找不到这样的文件。因此,您需要传递私钥文件的路径/名称。例如,“/path-to-the-file/myKey.pem”,或者如果密钥在项目的根目录中,只需使用“myKey.pem”。如果文件使用密码加密,则使用addIdentity("myKey.pem", "passphrase")

我看到您已经拥有 JSch 支持格式的私钥。但是,如果您碰巧在新的 OpenSSH 中生成了以 "-----BEGIN OPENSSH PRIVATE KEY-----" 开头的密钥,或者由于任何原因,您得到了以下错误:invalid privatekey: [B@59c40796,然后使用ssh-keygen 将密钥转换为PEM 格式,如here 所述。

ssh-keygen -p -f <filename> -m pem

如果您使用 ssh-keygen 创建新密钥,只需添加“-m pem”即可生成密钥。

ssh-keygen -m pem

以下内容已经过测试(使用 Rebex SFTP 服务器)并按预期工作:

import com.jcraft.jsch.*;

public class JScheExample {

    public void go() throws JSchException, SftpException {
        ChannelSftp channelSftp = setupJsch("tester", "password", "id_rsa", "127.0.0.1", 2222);
        //ChannelSftp channelSftp = setupJsch("username", "password", "myKey.pem", "127.0.0.1", 22);
        channelSftp.connect();

        // transfer file from local to remote server
        channelSftp.put("clientTestFile.txt", "clientTestFile.txt");

        // download file from remote server to local
        channelSftp.get("testfile.txt", "testfile.txt");
    }

    private ChannelSftp setupJsch(String username, String password, String pvKeyPath, String hostname, int port) throws JSchException {
        JSch jsch = new JSch();
        if (!pvKeyPath.equals("") && pvKeyPath != null)
            jsch.addIdentity(pvKeyPath);

        Session jschSession = jsch.getSession(username, hostname, port);
        if (!password.equals("") && password != null)
            jschSession.setPassword(password);

        jschSession.setConfig("StrictHostKeyChecking", "no");
        jschSession.connect();
        return (ChannelSftp) jschSession.openChannel("sftp");
    }

    public static void main(String[] args)  throws JSchException, SftpException{
        new JScheExample().go();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2015-12-10
    • 2016-03-09
    • 2015-04-11
    • 1970-01-01
    • 2018-10-12
    • 2020-02-27
    相关资源
    最近更新 更多