Supongamos que nuestra Javaaplicación está alojada en la plataforma Heroku y necesita conectarse a un servidor HTTP que requiere la provisión de un Certificado de Cliente.
En este artículo, abordaremos los problemas de almacenamiento seguro de almacenes de claves del cliente en , utilizando .
- Mantener contraseñas y otros datos confidenciales
es una práctica común para las aplicaciones alojadas en .
Por lo general, está contenido en archivos protegidos con contraseña: contenedores de claves, como .p12o jksen el sistema de archivos.
Pero el problema se vuelve obvio tan pronto como sea necesario colocar una aplicación similar en :
Incluso los protegidos con contraseña no se pueden colocar en el repositorio junto con el código fuente.
Lo mismo ocurre con las imágenes de Docker y cualquier otro artefacto similar disponible para varias personas.
Afortunadamente, ¡esto es fácil de arreglar en aplicaciones Java!
Considere el proceso propuesto en términos de teoría de seguridad:
- El oficial de seguridad (OB) exporta
como cadena codificadaBase64 - ..
( Heroku Dashboard) - ..
Base64 - ,
:
- :
Java - :
Heroku - :
Gradle - :
PKCS12
.p12
, , :
Heroku
HerokuSettings- "Reveal the config vars"
- :
keyStoreFileName — , "private_key.p12"keyStoreBase64 — Base64, " .p12"keyStorePassword — , .p12keyStoreType — pkcs12trustStoreType — jks
.p12 Gradle
guild.gradle stage:
task initKeyStore() {
doLast {
println("Creating keystore file from environment variables.")
String keyStoreFileName = System.getenv("keyStoreFileName")
if (keyStoreFileName != null) {
String keyStoreBase64 = System.getenv("keyStoreBase64")
new File(keyStoreFileName).withOutputStream {
it.write(Base64.decoder.decode(keyStoreBase64))
}
}
}
}
stage.dependsOn(initKeyStore)
"procfile" Heroku
"procfile" Heroku .
, shell — runApp.sh.
runApp.sh:
java \
-Dserver.port=$PORT \
...
-Djavax.net.ssl.keyStoreType=$keyStoreType \
-Djavax.net.ssl.trustStoreType=$trustStoreType \
-Djavax.net.ssl.keyStore=$keyStoreFileName \
-Djavax.net.ssl.keyStorePassword=$keyStorePassword \
$JAVA_OPTS \
...
git (push) (commit):
git update-index --chmod=+x runApp.sh
git commit -m ' runApp.sh'
git push origin master
Heroku 32 .
, .
- ,
Heroku, Gradle P12 . - ,
procfile, Heroku . , .p12 Java- .
!