Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过JSCH使用sftp连接时出现安全异常_Java_Security_Exception_Cryptography_Jsch - Fatal编程技术网

Java 通过JSCH使用sftp连接时出现安全异常

Java 通过JSCH使用sftp连接时出现安全异常,java,security,exception,cryptography,jsch,Java,Security,Exception,Cryptography,Jsch,我在使用JSCH创建SFTP时遇到此错误。 我试图通过sftp连接到远程服务器以传输文件,但在调用下面的connect方法时发生错误 java.lang.ExceptionInInitializerError at javax.crypto.Cipher.getInstance(DashoA13*..) at com.jcraft.jsch.jce.AES256CTR.init(AES256CTR.java:56) at com.jcraft.jsch.Session.checkCipher(S

我在使用JSCH创建SFTP时遇到此错误。 我试图通过sftp连接到远程服务器以传输文件,但在调用下面的connect方法时发生错误

java.lang.ExceptionInInitializerError
at javax.crypto.Cipher.getInstance(DashoA13*..)
at com.jcraft.jsch.jce.AES256CTR.init(AES256CTR.java:56)
at com.jcraft.jsch.Session.checkCipher(Session.java:2072)
at com.jcraft.jsch.Session.checkCiphers(Session.java:2049)
at com.jcraft.jsch.Session.send_kexinit(Session.java:592)
at com.jcraft.jsch.Session.connect(Session.java:286)
at com.jcraft.jsch.Session.connect(Session.java:162)
at scb.frame.runner.ServerSetup.contactServer(ServerSetup.java:56)

Caused by: java.lang.SecurityException: Cannot set up certs for trusted CAs
at javax.crypto.SunJCE_b.<clinit>(DashoA13*..)
... 34 more
Caused by: java.lang.SecurityException: Cannot locate policy or framework files!
at javax.crypto.SunJCE_b.i(DashoA13*..)
at javax.crypto.SunJCE_b.g(DashoA13*..)
at javax.crypto.SunJCE_b$1.run(DashoA13*..)
at java.security.AccessController.doPrivileged(Native Method)
... 35 more
命令行版本的相同的程序,我能够运行没有任何例外!
Jcraft[link]网站上的SFTP示例也运行得很好。

这与Java的安全限制有关。默认情况下,有一个128位的受限密钥大小。从stacktrace中,我看到您正在尝试使用AES 256位加密

要解决您的问题,请访问Java的网站并下载Java加密扩展(JCE)无限强度管辖权策略文件:

(可在底部找到)


将它们安装到您的JRE中,您就可以开始了:)这一切都要感谢美国政府…

这与Java的安全限制有关。默认情况下,有一个128位的受限密钥大小。从stacktrace中,我看到您正在尝试使用AES 256位加密

要解决您的问题,请访问Java的网站并下载Java加密扩展(JCE)无限强度管辖权策略文件:

(可在底部找到)



将它们安装到您的JRE中,您就可以开始了:)多亏了美国政府…

一个已知的工作程序可以通过SFTP连接到您的服务器吗?已知的工作程序能否通过FTP连接?您可以修改您的程序以使用FTP吗。(我不是说放弃安全性,我只是说先测试类似的任务)@supersam654 FTP与这个问题没有关系(根本没有-这是一个完全不同的协议)。@supersam654你知道一个名为WINSCP的软件吗。这个软件使用sftp,scp连接到服务器来传输文件。我也想做同样的事情。还有很多可用的软件可以让您通过sftp连接。@好的,您能用WINSCP成功连接到相关服务器吗?他想排除问题出在服务器而不是代码上的可能性。您可以发布您的连接代码吗?请编辑您的答案以添加代码,而不是将其作为注释发布。已知的工作程序是否可以通过SFTP连接到您的服务器?已知的工作程序能否通过FTP连接?您可以修改您的程序以使用FTP吗。(我不是说放弃安全性,我只是说先测试类似的任务)@supersam654 FTP与这个问题没有关系(根本没有-这是一个完全不同的协议)。@supersam654你知道一个名为WINSCP的软件吗。这个软件使用sftp,scp连接到服务器来传输文件。我也想做同样的事情。还有很多可用的软件可以让您通过sftp连接。@好的,您能用WINSCP成功连接到相关服务器吗?他想排除问题出在服务器而不是代码上的可能性。你能发布你的连接代码是什么样子的吗?请编辑你的答案来添加代码,而不是以注释的形式发布。哈格:我正在开发一个可以在任何系统上运行的应用程序。我是否需要在每个系统上安装这些策略文件(这是不可能的),或者是否有任何方法可以包含在应用程序中,以便它能够顺利运行?恐怕是这样。或者你可以减少安全性,使用更小的密钥(@verhage,奇怪的是,截至2009年,有迹象表明,尽管你真的不应该让部署问题决定密钥大小。如果你没有其他选择,我会考虑使用URLClassLoader和反射在第一次运行时使用完整版本的JCE动态地获得签名JAR。@MikeSamuel:我能够运行同一个p的控制台版本rogram,也是JSCHJCraft网站上的sftp示例[link]@WitValue,那么你很幸运。从两次运行中转储环境变量,找出哪些不同,哪些不同会影响你的程序。最坏的情况是,你必须编写一个java包装器,使用
Runtime.exec
CommandBuilder
使用不同的环境变量运行主java类。ver黑格:我正在开发一个可以在任何系统上运行的应用程序。我是否需要在每个系统上安装这些策略文件(这是不可能的),或者是否有任何方法可以包含在应用程序中,以便它能够顺利运行?恐怕是这样。或者你可以降低安全性,使用较小的密钥(@verhage,奇怪的是,截至2009年,有迹象表明,尽管你真的不应该让部署问题决定密钥大小。如果你没有其他选择,我会考虑使用URLClassLoader和反射在第一次运行时使用完整版本的JCE动态地获得签名JAR。@MikeSamuel:我能够运行同一个p的控制台版本rogram,也是JSCHJCraft网站上的sftp示例[link]@WitValue,那么你就很幸运了。转储两次运行中的环境变量,找出哪些不同以及哪些不同会影响你的程序。最坏的情况是,你必须编写一个java包装器,使用
Runtime.exec
CommandBuilder
使用不同的环境变量运行主java类。
    String host = serverProperties.getProperty("Host");
    String username = serverProperties.getProperty("Username");
    String password = serverProperties.getProperty("Password");
        JSch jsch = new JSch();
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
        Session session;
        try {
            session = jsch.getSession(username, host, 22);

        session.setPassword(password);

        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();
        ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
        sftpChannel.connect();
        sftpChannel.get(sourceFile,destFile);