我有一个简单的Java程序,它使用Jsch连接到一个SFTP服务器。
该连接在Java1.4.2上以“auth fail”异常失败,但在Java1.7上连接完美无缺。
try {
JSch jsch = new JSch();
jsch.setKnownHosts(KNOWN_HOSTS_PATH);
jsch.addIdentity(PRIVATE_KEY_PATH, PASSPHRASE);
Session session = jsch.getSession(USERNAME, HOSTNAME, 22);
session.connect(2500);
Channel channel = session.openChannel("shell");
channel.setInputStream(System. in );
channel.setOutputStream(System.out);
channel.connect();
} catch (Exception e) {
e.printStackTrace(System.err);
}
我使用的密钥是ssh-rsa4096
位密钥。.pub
密钥文件与私钥位于同一目录中。
连接记录器时,我在异常(发生在channel.connect();
)之前看到以下消息:
INFO: Connecting to <redacted> port 22 INFO: Connection established INFO: Remote version string: SSH-2.0-OpenSSH_5.1p1 Debian-5 INFO: Local version string: SSH-2.0-JSCH-0.1.42 INFO: CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256 INFO: arcfour is not available. INFO: arcfour128 is not available. INFO: arcfour256 is not available. INFO: SSH_MSG_KEXINIT sent INFO: SSH_MSG_KEXINIT received INFO: kex: server->client aes128-ctr hmac-md5 none INFO: kex: client->server aes128-ctr hmac-md5 none INFO: SSH_MSG_KEXDH_INIT sent INFO: expecting SSH_MSG_KEXDH_REPLY INFO: ssh_rsa_verify: signature true INFO: Host '<redacted>' is known and mathces the RSA host key INFO: SSH_MSG_NEWKEYS sent INFO: SSH_MSG_NEWKEYS received INFO: SSH_MSG_SERVICE_REQUEST sent INFO: SSH_MSG_SERVICE_ACCEPT received INFO: Authentications that can continue: publickey,keyboard-interactive,password INFO: Next authentication method: publickey INFO: Authentications that can continue: password INFO: Next authentication method: password INFO: Disconnecting from <redacted> port 22 com.jcraft.jsch.JSchException: Auth fail at com.jcraft.jsch.Session.connect(Session.java:452) at TestJsch.main(TestJsch.java:19)
当我用Java1.7运行相同的程序时,它说
INFO: Connecting to <redacted> port 22 INFO: Connection established INFO: Remote version string: SSH-2.0-OpenSSH_5.1p1 Debian-5 INFO: Local version string: SSH-2.0-JSCH-0.1.42 INFO: CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256 INFO: SSH_MSG_KEXINIT sent INFO: SSH_MSG_KEXINIT received INFO: kex: server->client aes128-ctr hmac-md5 none INFO: kex: client->server aes128-ctr hmac-md5 none INFO: SSH_MSG_KEXDH_INIT sent INFO: expecting SSH_MSG_KEXDH_REPLY INFO: ssh_rsa_verify: signature true INFO: Host '<redacted>' is known and mathces the RSA host key INFO: SSH_MSG_NEWKEYS sent INFO: SSH_MSG_NEWKEYS received INFO: SSH_MSG_SERVICE_REQUEST sent INFO: SSH_MSG_SERVICE_ACCEPT receivedINFO: Authentications that can continue: publickey,keyboard-interactive,password INFO: Next authentication method: publickey INFO: Authentication succeeded (publickey). Linux <redacted> 2.6.26-2-amd64 #1 SMP Mon Jun 13 16:29:33 UTC 2011 x86_64 <server welcome message follows>
我已经为1.4VM安装了Java加密扩展(JCE)。
这个问题的根源是什么?
Java在使用强加密算法方面有一个限制。检查$jre_home/lib/security/us_export_policy.jar
和$jre_home/lib/security/local_policy.jar
的内容。如果你发现这样的东西:
// File: default_local.policy
// Some countries have import limits on crypto strength.
// This policy file is worldwide importable.
grant {
permission javax.crypto.CryptoPermission "DES", 64;
permission javax.crypto.CryptoPermission "DESede", *;
permission javax.crypto.CryptoPermission "RC2", 128,
"javax.crypto.spec.RC2ParameterSpec", 128;
permission javax.crypto.CryptoPermission "RC4", 128;
permission javax.crypto.CryptoPermission "RC5", 128,
"javax.crypto.spec.RC5ParameterSpec", *, 12, *;
permission javax.crypto.CryptoPermission "RSA", 2048;
permission javax.crypto.CryptoPermission *, 128;
};
决定是下载并安装JCE无限强度管辖策略。此前,它位于孙某的站点上,现在不知道能在哪里找到。
您可以在本文中阅读更多内容
Java 1.4不支持长度超过2048字节的RSA密钥错误4524097
JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。你可以将它的功能集成到你自己的 程序中。同时该项目也提供一个J2ME版本用来在手机上直连SSHD服务器。
问题内容: 我希望能够将Java应用程序中以字符串表示的许多连续命令发送到SSH服务器以执行。我应该使用: -要么- 问题答案: 使用shell通道启动外壳(在Unix上为sh或bash或类似的东西,在Windows上通常为cmd.exe)并创建控制台(如果在本地运行它们,则在屏幕上看到的内容)。您有一个提示,您可以将其解析或用于检测命令是否完成。 使用命令通道,将为每个命令启动一个shell实例
在apache commons net ftpclient中,有ftpclient.printWorkingDirectory()来获取当前目录的字符串。 如何使用jsch sftp客户机实现同样的功能?有一个名为realpath(String)的方法,但它似乎不对,我无法使其工作。
问题内容: 我正在使用netbeans 7.2运行JDK 1.7和Windows 7,我已经使用putty- keygen生成了SSH私钥和公钥对(SSH2-2048位)。我没有私钥密码。我现在正在尝试使用SFTP连接到主机之一。但是,当我通过私钥(ppk)设置身份时,代码将返回无效的私钥错误。我在WinSCP中使用了相同的私钥来连接到相同的主机,并且工作正常。请帮助我解决错误。这是我的代码: 问
问题内容: 我需要解决我目前遇到的Unix-Windows文件格式(LF到CRLF)问题。我正在使用的ftp客户端是Jcraft的Jsch。 尽管我遇到了可以设置的标志,但在线文档非常空白 启用ASCII模式,但是我看不到应该在代码本身中设置的位置,也看不到这些Javadocs中提到的内容 以下是我自己的解决方法。“新添加的”行显示了如何获取文件并将其转换为ASCII编码的字符串,然后使用chan
问题内容: 我正在使用JSCH进行sftp文件上传。在当前状态下,每个线程都会在需要时打开和关闭连接。 是否可以在JSCH中使用连接池,以避免由于大量打开和关闭连接而导致的开销? 这是从线程内部调用的函数的示例 问题答案: 为此,我希望使用commons-pool。;)