我见过很多人都问过这个问题并且也回答了。对不起,但我是java的新手,我真的不明白这个概念和解决这个错误的方法。请提供一种方法来解决这个问题。
我用
java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)
javac 1.8.0_77
我使用以下代码检查了JCE强度:
package automation;
import java.io.IOException;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class Mainjava {
public static void main(String[] args) {
String cryptoAlg = "AES";
try{
SecretKeySpec keyspec = new SecretKeySpec(new byte[32], cryptoAlg);
Cipher c = Cipher.getInstance(cryptoAlg + "/CBC/NoPadding");
c.init(Cipher.ENCRYPT_MODE, keyspec, new IvParameterSpec(new byte[16]));
System.out.println("Success");
}
catch(Exception e){
System.err.println("************ The Java Virtual Machine can't handle strong cryptography.\n************ This will lead to problems with some services and subsystems!");
}
} }
在上面的代码中,我没有收到错误消息。
你能告诉我我的错误在哪里吗?这是我尝试与unix服务器连接的代码。
package automation;
import java.io.*;
import com.jcraft.jsch.*;
public class unixConnect {
public static void main(String[] args) {
try{
System.out.println("Inside ConnectEC2");
JSch jsch=new JSch();
System.out.println("setting pem file");
System.out.println("added key");
JSch.setConfig("StrictHostKeyChecking", "no");
String password = "Star3009";
System.out.println("giving userid");
Session session=jsch.getSession("mon387", "jackets", 22 );
session.setPassword(password);
System.out.println("trying to connect");
int port1 = session.getPort();
System.out.println("port1:"+ port1);
session.connect(3000);
System.out.println("connected");
String command = "cat Mon_Non_Mon_No_Diff.dat;";
Channel channel = session.openChannel("exec");
channel.setInputStream(null);
channel.setOutputStream(System.out);
( (ChannelExec) channel ).setCommand( command );
channel.connect();
InputStream input = channel.getInputStream();
byte[] tmp = new byte[1024];
while (true) {
while (input.available() > 0) {
int i = input.read(tmp, 0, 1024);
if (i < 0) break;
System.out.print(new String(tmp, 0, i));
}
if (channel.isClosed()){
System.out.println("exit-status: " + channel.getExitStatus());
break;
}
}
Thread.sleep(1000);
channel.disconnect();
session.disconnect();
}
catch(Exception e){
System.out.println(e);
}
}
}
更新: 输出上述代码:
Inside ConnectEC2
setting pem file
added key
giving userid
trying to connect
port1:22
com.jcraft.jsch.JSchException: Session.connect: java.security.InvalidKeyException: Key is too long for this algorithm
答案 0 :(得分:0)
从我现在研究的内容中,我可以看到许多其他人遇到与您相同的问题,问题不在您的代码上,这是JDK的一个错误,它被填充并修复,因为他们说这样更新到Java SE 8u45(或更高)应解决问题。同时将jsch更新为0.1.50版本。
虽然,你有第二个例外.. JSchException,好像你没有使用正确的端口连接服务器。问题是,它无限期地等待谈判完成。这是墨西哥的对峙,双方都没有放弃。在session.connect()之前调用session.setTimeout(),或调用session.connect(timeout),使用一些合适的值(3-5秒)。我相信超时是以毫秒为单位。同时将jsch更新为0.1.50 +版本。
此外,如果您正在使用公钥验证,则JSch期望公共密钥文件位于同一目录中(并且添加了.pub的同名)。
原因是在SSH公钥认证协议中,客户端首先向服务器发送可用公钥的列表,然后服务器中的服务器选择一个合适的公钥 - 只需要私钥(并且将需要私钥)如有必要,可以解密)。虽然它(取决于算法和键表示)可能可以从私有计算公钥,但JSch本身不会这样做,所以你必须提供两个键。