假设我们的Java应用程序托管在Heroku平台上,并且需要连接到需要提供客户端证书的HTTP服务器。
在本文中,我们将解决使用将客户端密钥库安全存储在中的问题 。
- 保留密码和其他敏感数据
是在上托管的应用程序的常见做法。
通常 包含在受密码保护的文件中-密钥容器,例如.p12或jks在文件系统上。
但问题明显,一旦成为因为它成为必要把一个类似的应用在:
从安全理论的角度考虑提议的过程:
- 安全员(OB)导出
为编码字符串Base64 - 关于。进入
(在我们的示例中是Heroku信息中心) - 关于。将编码的字符串
Base64导入 - 作为自动应用程序托管过程的一部分,将其
转换为二进制数据并写入物理文件。 - 该文件的路径在启动时传递给应用程序
让我们将这种方法付诸实践:
- 舌:
Java - 平台:
Heroku - 构建系统:
Gradle - 密钥存储格式:
PKCS12
导出.p12文件
按照说明使用操作系统内置的工具:
导入到Heroku
- 去
Heroku - 转到
Settings您的应用程序部分 - "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- .
!