Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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 使用JKS密钥库进行Ganymed SSH公钥身份验证_Java_Ssh_Keystore_Private Key_Public Key - Fatal编程技术网

Java 使用JKS密钥库进行Ganymed SSH公钥身份验证

Java 使用JKS密钥库进行Ganymed SSH公钥身份验证,java,ssh,keystore,private-key,public-key,Java,Ssh,Keystore,Private Key,Public Key,我试图从java密钥库中提取一个私钥,然后将其提供给Ganymed SSH,以便建立与公钥身份验证的连接。然而,它拒绝连接 我可以通过Cygwin(ssh-I)成功连接到以下程序生成的文件,但程序本身无法通过同一台机器上的身份验证。我做错了什么 我没有得到异常,只是返回false,所以这不应该是格式问题。如果我不加密私钥,结果是一样的。此外,我还可以使用putty gen和ssh keygen生成的文件连接类似的程序 编译(bouncycastle和ganymed)时需要以下内容: 使

我试图从java密钥库中提取一个私钥,然后将其提供给Ganymed SSH,以便建立与公钥身份验证的连接。然而,它拒绝连接

我可以通过Cygwin(
ssh-I
)成功连接到以下程序生成的文件,但程序本身无法通过同一台机器上的身份验证。我做错了什么

我没有得到异常,只是返回false,所以这不应该是格式问题。如果我不加密私钥,结果是一样的。此外,我还可以使用putty gen和ssh keygen生成的文件连接类似的程序

编译(bouncycastle和ganymed)时需要以下内容:

使用以下内容生成密钥库:

keytool -genkeypair -keystore keystore.jks -alias myalias -storepass password -keypass password -keyalg RSA -dname CN=myalias,O=example.com -storetype JKS -validity 365 -v
代码(主机和端口应为args,工作目录中应为上述密钥库):

导入ch.ethz.ssh2.Connection;
导入java.io.ByteArrayOutputStream;
导入java.io.CharArrayWriter;
导入java.io.DataOutputStream;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.OutputStreamWriter;
导入java.io.Writer;
导入java.security.GeneralSecurityException;
导入java.security.Key;
导入java.security.KeyStore;
导入java.security.PublicKey;
导入java.security.SecureRandom;
导入java.security.cert.Certificate;
导入java.security.interfaces.DSAParams;
导入java.security.interfaces.DSAPublicKey;
导入java.security.interfaces.RSAPublicKey;
导入javax.xml.bind.DatatypeConverter;
导入org.bouncycastle.openssl.PEMEncryptor;
导入org.bouncycastle.openssl.jcajce.JcaPEMWriter;
导入org.bouncycastle.openssl.jcajce.JcePEMEncryptorBuilder;
公共类keystoregnymedssh{
公共静态void main(字符串[]args)
抛出异常{
字符串keystorePath=“keystore.jks”;
char[]password=“password”.toCharArray();
字符串alias=“myalias”;
字符串host=args[0];
int port=Integer.parseInt(args[1]);
//密钥库初始化
KeyStore KeyStore=KeyStore.getInstance(“JKS”);
输入流输入;
试一试{
in=新文件输入流(keystorePath);
}捕获(FileNotFoundException ex){
System.out.println(“使用此命令生成密钥库:”);
System.out.println(“keytool-genkeypair-keystore-keystore.jks”
+“-alias myalias-storepass密码-keypass密码”
+-keyalg RSA-dname CN=myalias,O=example.com-storetype
+“JKS-有效期365-v”);
掷骰子;
}
试一试{
加载(输入,密码);
}最后{
in.close();
}
//获取OpenSSH格式的公钥
字符串authorizedKeysEntry=genAuthorizedKeysEntry(密钥库,别名);
if(authorizedKeysEntry==null){
抛出新异常(“无法生成授权的_密钥条目”);
}
System.out.println(“用于粘贴到OpenSSH授权密钥文件中的公钥(始终相同):”;
System.out.println(授权EySentry);
System.out.println();
作家;
//写入文件
writer=新的OutputStreamWriter(
新文件输出流(新文件(“授权密钥”),“UTF-8”);
试一试{
写作(授权哨兵);
}最后{
writer.close();
}
//获取PEM加密字符[]
Key=keystore.getKey(别名、密码);
writer=新字符编写器();
JcaPEMWriter pw=新的JcaPEMWriter(编写器);
SecureRandom=SecureRandom.getInstance(“SHA1PRNG”);
PEMNCRYPTOR encryptor=新JcePEMEncryptorBuilder(“DES-EDE3-CBC”)
.setSecureRandom(随机).build(密码);
pw.writeObject(密钥、加密机);
pw.flush();
char[]privateKey=((CharArrayWriter)writer.toCharArray();
System.out.println(“加密私钥(每次运行时的更改):”;
System.out.println(新字符串(privateKey));
字符串name=“RSA”.equals(key.getAlgorithm())?“id\u RSA”:“id\u dsa”;
writer=新的OutputStreamWriter(
新文件输出流(新文件(名称)),“UTF-8”);
试一试{
writer.write(私钥);
}最后{
writer.close();
}
//尝试木卫三连接
连接=空;
试一试{
System.out.println(“连接到“+主机+”:“+端口”);
连接=新连接(主机、端口);
connection.connect();//没有已知的主机
如果(!connection.isAuthMethodAvailable(别名,“publickey”)){
System.out.println(“公钥身份验证不可用”);
返回;
}
布尔结果=connection.authenticateWithPublicKey(
别名、私钥、新字符串(密码));
System.out.println(结果?“验证成功”。:“验证失败”);
}最后{
if(连接!=null){
connection.close();
}
}
}
私有静态字符串genAuthorizedKeysEntry(
KeyStore KeyStore,字符串别名)引发GeneralSecurityException,IOException{
证书[]链=keystore.getCertificateChain(别名);

如果(chain==null | | chain.length我发布的代码没有任何错误。这只是我的一个巨大失败

我使用密钥库别名作为用户名,该用户名在远程linux设备上不作为用户帐户存在。创建帐户后,一切正常。我编辑了错误的
授权密钥
Public key for pasting into OpenSSH authorized_keys file (always same):
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCJLXgRaVdbZNuCsTgUsw2UPGdEA4La8ggQZWkevgAEMrgF+YYT2uN6BYDgD7hzs3ZTLXz2KUQLkMe7xLvimAsg6YXUi46IGEkTSOBFR0yYj+12O2BNbAxOXLIDIMBK5bsDwnuOsFedbeILFU4DaV+igJKO1zHWNbmbmd4RlfrIgH7Blfce8zSVkEdLkqEmydbg4xmj6r+MlzA5HSNZJILivb1XYNnoLjRH1SwUC8Rj6bjgBdNEXLOH0FNpCatHk9R00GaSZjcDZRKNAKnBSEIpw01TKaJlyQUTGqYGjK7UIbbafwMuYKR1rIzkyh4Usxvd3FvMdmKQSUeCnZU296YF myalias

Encrypted private key (changes on each run):
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,86DF7B50D4E319F6

QGngqwq+NXQGee7pEVROnwvIX6cyzo9QjdKtlherLCIYQjD4zagCvCd4vOUmwe0S
g/KaPeq8tanU0KB6m/WfAsgfOAkR+ujIod0hkUoCZp/Jg9LO2Me7ZFDNW/cBqbW0
CifaqDmOVgJ+HnZHJouMZyPf+To8SDdMSJZQ/3Wc2ZQn6BIhEjLzdz0hSVXGz2Gs
wmVYy4oedjB2f+dQliEnwFXBOusRMfqgiPqkdQj38voipqYBmPHUYSity0HGsRlo
KgovSeQhEDPT8GyYVJcKZLV3BUipvNvKJBP613wBZsuCtvhUNNNOfVFeTkD8+7PG
q2YzF3nasOM471EHyj18zPZ+DdPQMDPHtpVFQXJCFlf7xlGVAesPPUFJICXFE5OZ
JRAJC8+7WuT8O974uT9zDLeV5XLJRJK6o8dYXtZBK0YMpZy91b9axYDeVQh+Sfd+
V/T5RQ2osXg72lDBtz6vzeyMGj+Y9PQwZb97tdRW1X/ON4Eiiz/+1SVeDbWilo29
gMSPl4wb379Dvi7Z+b5OTGoF+F1p7Cp48sUEgIP8vPXinoOhBLdy1zq8oNVbo7PS
M5+41PKL4ao8pL9BCOALZpzP2R9LxoHjjL1auaWMzKLECtiEDvgu4GJeTVXvg7sO
yptecswVCF8fY+pV8dTtYU3vUs4UsdC9PG9IhqeRbML9dX7htsgkBmHdYAq5WOS/
RREuU+jyrCnc6kpOhIK/1wMOoIMOBnJ8EJXpMJaZtNwOQr05bOfFvozOEe35JwnP
NElP7CYBIvQrTyfrRxtJE+ntQO+uJbIvxFDY0EoQJX6YPFr0V7rnWy4W1yH0Yv6E
pmwERGYr1lbBIpxjTzTwZ3r845EUEwiwEt3+xfepBh3HUXg/mZYUw4cEz3HbzZDT
tWRPFpsBaicfatzbqvL7Teq1V8baUj1CW0wrANZbHc0FvSzuHMygub2ARgM3QAMj
L5yaITjH8/Tnbew7jPi5kSTXdNUnAJf3M/m6DC7svJtx+1Xwd0tfzp3GHYLaT+Mm
vOu8R5g/JJvBVMTzP8gyI32jDViRuHHwyFOlyJ35IrRCkW8i+aBmG1iT2WANWRai
2ujX4Gc+M2VncUdFR9MoCxUOy/7qKDcGNMpk8sgIi6Pc8SLiodueiWP3W6AXJKvs
u5akyk7jj8zq9+fe85T/cZ8lYe81hd3oA/9b/9cs8sdlhTmYjfUr1FgFHNyFPwdV
QnyayxeAy3xvoYXBBr7JrmWXLDTHghhMBHGHW7imoLNN8QZtTF+pGWzsxNcAVbEz
kmLll9ki0CUIbfufszp/b05OBC2M0EHn9uW61bwbiZfWxhfTlC2zHNHpig6zQhHu
q8n//KgHB5LDctGHoeqlUwoLbt78wd0bAD23GeZ2q1CdB6FYxoMYL8FuVOnxoUh3
fquXzH0wjv3Qm4Rwit+8zSdbD/+QbtJ2c/ZguUy4T3phI5BGzhLh2IDO8T9B6y5B
MmTyFjfZjVj+zU4F0BAIzzLlYTl332ecMj87StoNazqIF5Dj2ZqjUtF46MDeMZjO
tRvpIi8bWBm78rFNC51TZSBcfw714yOxHsPU0PqUMQMCgXawcDkTt2645/+ZZQtk
-----END RSA PRIVATE KEY-----

Connecting to 10.0.3.138:22
Authentication failure.