假设我们的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
— pkcs12
trustStoreType
— 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
- .
!