java format openssl rsa pem

Formateo de claves RSA para OpenSSL en Java



pem (1)

Fondo

Generación de claves RSA con OpenSSL en Linux usando el comando,

openssl genrsa -out mykey.pem 1024

Creó lo siguiente:

"-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQChs9Fepy5FgeL0gNJ8GHcKRHsYnM2Kkw19zwydDQNyh2hrHWV2 B11wpLFp8d0imcl2Wjb0oV/AxOhb3unQgNzs66LVuXJwS8icp3oIJZtExs6tkxzE s5mnU68wMeCYtJqHIZOmNblVWvpJMLNAwAVi3oLfnzDDbzjnDapm8M21nQIDAQAB AoGAZ11P1+acUHgvwMXcRtFIvvp5iYkqZouL00EYOghIjNx75gTbh7A7jbbpZeTi y6xsuMgAWy4QzGPSeG+tHMhS7+dYQNPuKSv5KtK3V7ubXz/I3ZN1etRVecA56QNw 7HKv6b7srolt08kogGIwpbbfl/mhfJHnv4Jeqd5lNMnK4e0CQQDWFZo4h22OlSaH ZGd3i4rwLrA0Ux5bkdh7YH0uEeE/nGzpVs1DPhsN8UCyq9LAiKYLlXeeCvwurKwo OgKlUCkzAkEAwVy2KignoRInFTAaYH8PQRfD835q+oC0Iu21BF68ne06U6wu+wWk bWiYxTOOb+TGZfA1vA6OAvGVGoXs1bHF7wJBAItGiop0MKYuCl7Sxy1SrxUKir+/ w2Q3QesiHs41+6Byl7hGLEuuv9MWPM0AU5/GRqAKoUNESkPjOi0BcG8z81kCQGGn OvCreugjzM0skAWv5bpQEExGyixdF5yURFlCpytzBYQAb3Gi9dmze4QMd6EW/wO4 fsrM5vehnlXY0TVTJM0CQQCMPVhub8LSo7T/lCzypvb/cgxJfyITRKcM2asrXud5 r27kbzsXqYum4huHqyFkb3pZammsYA/z89HchylfrD4U -----END RSA PRIVATE KEY-----"

El siguiente código bajo Java 6,

KeyPairGenerator keyGen = null; try { keyGen = KeyPairGenerator.getInstance("RSA"); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } KeyPair pair = keyGen.generateKeyPair(); privateKey = new Base64Encoder().encode(pair.getPrivate().getEncoded()); publicKey = new Base64Encoder().encode(pair.getPublic().getEncoded());`

salida lo siguiente:

"MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIsJlqFOP+jPyYvrGwh+dff30a3p uHysMfHYi1MyNSFCsT/2QbOc/k9U/X28WRCMeFwEEnReLULXA9Ywox8GycI/ApMX+DjKBrrLDbpr ATLiu9+NMK4VSytKFI87P07HAni3RkiO4rFNEINVQ7t38ZmHavuXHjMkLEAK4dyLQO9NAgMBAAEC gYBN/jv0EmwBUgYSKflJI39TcT263B+0N/fwXXOSYNiy5rF9WstyUP/LSrbEAJLJmLKvk00y391t 4CVz0ma+sdUdAPlS7Nmx9f3BThGOGcDmpjVo1y4e1afWtyu66ba/XDeuf7q5Y/h/pr20/gXl9Gz2 yefQrzU9xXGKZhE/lxJ2IQJBAMELpeAal+Fa+u0InGrowVmV+lge8RZqKRfCDzPPna465E5Qcekb J0ShsarP5lnUfrNH5g8GLaDGQwYE/UoIpPkCQQC4YRfck5uMlI1K3F9YC3XvmFAJnf9YexoPfNSu dznOD4rxlwzW/5daPOR0jjlyIRDH/QuUoPIIEn1mt3dnz7X1AkBZciozgl7pPhySA7FmH96mwcUz W3LdrebIaVRd707iUctDNibxmXFCbaFCwf27laf3LdM9FuHBYtvfSCSMTyERAkEAlNAQsUAVmKZB T72D2o0Nd/7oAosaD7DzvLJU+idSaWUUEJ+IhnKuFu/0t7oe1WWopLEwypoIHsnFmsTTQ99ajQJA Scwh3P3RTN4F6Jz1SxRSe6L729xI8xkbco5EsMq5v5BZeoGynqdPUUZdAPcaO2k5UagaSejvzgna 8xIqR7elVQ==" "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLCZahTj/oz8mL6xsIfnX399Gt6bh8rDHx2ItT MjUhQrE/9kGznP5PVP19vFkQjHhcBBJ0Xi1C1wPWMKMfBsnCPwKTF/g4yga6yw26awEy4rvfjTCu FUsrShSPOz9OxwJ4t0ZIjuKxTRCDVUO7d/GZh2r7lx4zJCxACuHci0DvTQIDAQAB"

Preguntas

  1. ¿Cómo coloco "armadura" alrededor de las claves públicas y privadas creadas a través del código Java?

  2. ¿Por qué cada línea de las claves generadas a través del código Java es más larga que las generadas por OpenSSL?

  3. ¿Hace alguna diferencia? Una de las herramientas, que está utilizando otro equipo, falla al firmar un mensaje con una clave privada generada por el código Java mencionado anteriormente. Sin embargo, funciona bien si la herramienta usa la clave privada generada por OpenSSL.

  4. ¿Hay alguna manera de exportar una clave compatible con Java?


La clave privada de OpenSSL está en un formato no estándar, mientras que el código Java está creando una clave privada estándar, codificada PKCS- # 8.

OpenSSL puede convertir el formato de clave estándar al formulario no estándar. Puede escribir código Java para hacer lo mismo, pero requiere algunas bibliotecas de terceros y un buen conocimiento de ASN.1 también ayuda.

Para convertir una clave PKCS # 8 a formato OpenSSL, use la utilidad pkcs8 de OpenSSL.

openssl pkcs8 -nocrypt -inform der < pvt.der > pvt.pem

Para convertir una clave RSA almacenada como un SubjectPublicKeyInfo codificado en DER a formato PEM, use la utilidad rsa de OpenSSL.

openssl rsa -pubin -inform der < pub.der > pub.pem

Esto supone que la clave privada está almacenada en formato "binario" (DER), no codificada en Base-64. El código Java para crear y almacenar claves como esta sería algo así como:

KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA"); KeyPair pair = gen.generateKeyPair(); FileOutputStream ospvt = new FileOutputStream("pvt.der"); try { ospvt.write(pair.getPrivate().getEncoded()); ospvt.flush(); } finally { ospvt.close(); } FileOutputStream ospub = new FileOutputStream("pub.der"); try { ospub.write(pair.getPublic().getEncoded()); ospub.flush(); } finally { ospub.close(); }