Tengo el problema de almacenar la clave privada de la API externa (de la cual obtengo algunos datos en mi aplicación Spring Boot) en AWS. Se almacena allí como propiedad del entorno de tallo elástico. Probé localmente el siguiente código y funciona, sin embargo, cuando uso test env (AWS), la propiedad se carga correctamente, sin embargo, aparece un error:

Illegal base64 character a at a

La clave privada es solo:

-----BEGIN PRIVATE KEY-----
(...)
-----END PRIVATE KEY-----

Siempre que cargo esto desde un archivo o como una propiedad de primavera, funciona muy bien. Pero cuando está en AWS cargado como variable env, aparece el error mencionado.

@Component
@Slf4j
public class SfKeyLoaderImpl implements SfKeyLoader {

  @Value("${access-token-params.private-key}")
  private String privateKeyString;

  @Override
  public PrivateKey loadKey() {

    PrivateKey privateKey = null;

    try {
      String formattedKey = privateKeyString
          .replaceAll("\r\n", "")
          .replace("-----BEGIN PRIVATE KEY-----", "")
          .replace("-----END PRIVATE KEY-----", "")
          .replaceAll(" ", "");
      KeyFactory factory = KeyFactory.getInstance("RSA");
      PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(formattedKey));
      privateKey = factory.generatePrivate(privSpec);

    } catch (Exception ex) {
      log.error("Error while loading key for salesforce jwt generation", ex);
    }

    return privateKey;
  }
}

La parte del código que arroja un error:

  PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(formattedKey));
0
Piotr Supel 22 feb. 2021 a las 20:14

1 respuesta

La mejor respuesta

Después de dos días, descubrimos que .replaceAll ("\ r \ n", "") era suficiente en Windows, tuvimos un problema porque en Linux también se debería agregar .replaceAll ("\ n", "") al proceso del clave privada almacenada en AWS.

0
Piotr Supel 24 feb. 2021 a las 08:20