在Heroku管理客户证书

假设我们的Java应用程序托管在Heroku平台上,并且需要连接到需要提供客户端证书的HTTP服务器。


在本文中,我们将解决使用将客户端密钥库安全存储在中的问题


  • 保留密码和其他敏感数据 是在上托管的应用程序的常见做法

通常 包含在受密码保护的文件中-密钥容器,例如.p12jks在文件系统上。


但问题明显,一旦成为因为它成为必要把一个类似的应用在


  • 即使是受密码保护的密码, 也无法与源代码一起放在存储库中。


  • Docker映像和可供其他人使用的任何其他类似工件也是如此。


  • 幸运的是,这很容易在的应用程序中修复Java



从安全理论的角度考虑提议的过程:


  1. 安全员(OB)导出 为编码字符串Base64
  2. 关于。进入 (在我们的示例中是Heroku信息中心)
  3. 关于。将编码的字符串Base64导入
  4. 作为自动应用程序托管过程的一部分,将其 转换为二进制数据并写入物理文件。
  5. 该文件的路径在启动时传递给应用程序

  • 现在,只有一圈人可以 访问

让我们将这种方法付诸实践:


  • 舌: Java
  • 平台: Heroku
  • 构建系统: Gradle
  • 密钥存储格式: PKCS12

导出.p12文件


按照说明使用操作系统内置的工具:



导入到Heroku


  • Heroku
  • 转到Settings您的应用程序部分
  • "Reveal the config vars"
  • :
    • keyStoreFileName — , "private_key.p12"
    • keyStoreBase64Base64, " .p12"
    • keyStorePassword — , .p12
    • keyStoreTypepkcs12
    • trustStoreTypejks

.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 .


, shellrunApp.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
  • .

!


All Articles