使用java生成SSH密钥
我尝试使用以下代码生成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)
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-----");