Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.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生成SSH密钥_Java_Ssh_Putty - Fatal编程技术网

使用java生成SSH密钥

使用java生成SSH密钥,java,ssh,putty,Java,Ssh,Putty,我尝试使用以下代码生成SSH密钥 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); KeyPair keyPair=keyPairGenerator.generateKeyPair(); RSAPublicKey publicKey=(RSAPublicKey)

我尝试使用以下代码生成SSH密钥

        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
         keyPairGenerator.initialize(2048);
         KeyPair keyPair=keyPairGenerator.generateKeyPair();

         RSAPublicKey publicKey=(RSAPublicKey)keyPair.getPublic();
         RSAPrivateKey privateKey=(RSAPrivateKey)keyPair.getPrivate();

         String base64PubKey = Base64.encodeBase64String(publicKey.getEncoded());
         ByteArrayOutputStream byteOs = new ByteArrayOutputStream();
         DataOutputStream dos = new DataOutputStream(byteOs);
         dos.writeInt("ssh-rsa".getBytes().length);
         dos.write("ssh-rsa".getBytes());
         dos.writeInt(publicKey.getPublicExponent().toByteArray().length);
         dos.write(publicKey.getPublicExponent().toByteArray());
         dos.writeInt(publicKey.getModulus().toByteArray().length);
         dos.write(publicKey.getModulus().toByteArray());
         String publicKeyEncoded = new String(
                                    Base64.encodeBase64(byteOs.toByteArray()));
         String key =  "ssh-rsa " + publicKeyEncoded + " ";
         System.out.println("Public Key ------");
         System.out.println(key);


         System.out.println("------------------------------");
         System.out.println("Private key");
         System.out.println(Base64.encodeBase64(privateKey.getEncoded()));
现在,当我将私钥的内容存储在一个文件中,并试图用putty验证它时,它表示私钥的格式无效


你们能帮我解决一下这个问题吗,我怎么会错过了私钥格式,所以putty无法识别它。

putty无法识别OpenSSH格式的密钥——它们必须首先使用Puttygen转换为putty样式

此转换有一个Debian/Ubuntu包:

您可以对此进行研究,找出密钥是如何转换的,或者从代码内部以进程的形式运行该命令


在Windows上,Puttygen GUI可用于以下用途:

下载链接:


如果您想使用直接生成的密钥,我建议您使用类似MINGW32/MINGW64、Cygwin、,如前所述,putty只使用自己的“PPK”格式,可以通过puttygen进行转换,但只能从“commercial”ssh.com格式(此处不适用)和OpenSSH使用的格式(6.5之前)进行转换哪些是最初由OpenSSL使用的“传统”格式,不是自2000年以来由OpenSSL使用并由Java crypto使用的格式

(1) 如果您拥有或可以获得BouncyCastle,请参阅创建一个可读入puttygen的文件

(2) 否则,如果您拥有或能够获得openssl命令行,请使用正确的“PEM”从Java编写PKCS8,该命令行是base64,换行符为19组(76个字符)或更少,标题和尾部为
私钥类型(不是
RSA私钥
,也不是
加密私钥
),然后通过
openssl RSA
运行该命令行(而不是
opensslpkey
)转换为遗留版本,并将其读入puttygen

(3) 否则,您的选择就不那么好了。最好的方法可能是解压缩PKCS8格式,以获得类似以下内容的“遗留”格式:

byte[] pk8 = privateKey.getEncoded();
if( pk8[0]!=0x30 || pk8[1]!=(byte)0x82 ) error;
if( 4 + (pk8[2]<<8 | (pk8[3]&0xFF)) != pk8.length ) error;
if( pk8[4]!=2 || pk8[5]!=1 || pk8[6]!= 0 ) error;
if( pk8[7] != 0x30 || pk8[8]==0 || pk8[8]>127 ) error;
// could also check contents of the AlgId but that's more work
int i = 4 + 3 + 2 + pk8[8];
if( i + 4 > pk8.length || pk8[i]!=4 || pk8[i+1]!=(byte)0x82 ) error;
byte[] old = Arrays.copyOfRange (pk8, i+4, pk8.length);
String b64 = /*** encode old to base64, linebreaks optional for puttygen *****/
System.out.println ("-----BEGIN RSA PRIVATE KEY-----");
System.out.println (b64); // or print if (final) EOL already added
System.out.println ("-----END RSA PRIVATE KEY-----");
byte[]pk8=privateKey.getEncoded();
如果(pk8[0]!=0x30 | | pk8[1]!=(字节)0x82)错误;

如果(4+(pk8[2]使用puttygen生成一个键并检查差异。Putty使用自己的格式。(注释已删除,我将其扩展为另一个答案)
byte[] pk8 = privateKey.getEncoded();
if( pk8[0]!=0x30 || pk8[1]!=(byte)0x82 ) error;
if( 4 + (pk8[2]<<8 | (pk8[3]&0xFF)) != pk8.length ) error;
if( pk8[4]!=2 || pk8[5]!=1 || pk8[6]!= 0 ) error;
if( pk8[7] != 0x30 || pk8[8]==0 || pk8[8]>127 ) error;
// could also check contents of the AlgId but that's more work
int i = 4 + 3 + 2 + pk8[8];
if( i + 4 > pk8.length || pk8[i]!=4 || pk8[i+1]!=(byte)0x82 ) error;
byte[] old = Arrays.copyOfRange (pk8, i+4, pk8.length);
String b64 = /*** encode old to base64, linebreaks optional for puttygen *****/
System.out.println ("-----BEGIN RSA PRIVATE KEY-----");
System.out.println (b64); // or print if (final) EOL already added
System.out.println ("-----END RSA PRIVATE KEY-----");