java - 在 Spring Boot 中存储证书的最佳做法是什么?

标签 java spring-boot https pki

我在网上看到的每个教程都向我展示了如何通过简单地在 application.conf 文件中指定 keystore 路径和密码来在 Spring Boot 中设置 HTTPS,例如 this link 中的 1.4| .我可以做到这一点并很好地设置 HTTPS。

然而,这对我来说似乎很脏。这意味着 keystore 和密码都存储在源代码中,我不想这样做。到目前为止,我所做的是创建了自己的 custom tomcat configuration like this one并提供了来自环境变量的密码。这是一个很好的第一步,但我仍然需要在源代码中保留 keystore 。这足够了吗?或者还有什么我可以做的吗?

最佳答案

So I have managed to find a good resource explaining what should be done

像其他所有指南一样,他们说“不要在源代码中保留 keystore ”,但没有提供任何关于如何这样做的建议。我知道我不应该将 keystore 保存在 git、docker、jars 中……但是我如何将它们分开?我应该使用什么工具?

无论如何,这是重要的东西(如果有人可以扩展简短建议的解决方案,那就太好了):

保护您的 keystore 和 key 密码(我已经这样做了)

通常, keystore 密码存储在各种配置文件中的开放文本中。

例如,这是 Tomcat 连接器的典型配置:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
    keystoreFile="${catalina.home}/conf/keystore.p12"
    keystorePass="mypass" keyPass="mypass"
    keyAlias="main-key"
    maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS"
    />

从安全的角度来看,这显然是完全不能接受的。

将敏感 secret 保存在别处,最好使用 secret 管理器,例如 Hashicorp 保险库。至少,主密码可以存储在一个环境变量中,以供适当保护的帐户使用。
保持私钥分开

将私钥保存在单独的 keystore 文件中,不要对信任证书和 key 使用相同的 keystore 。必须使用文件系统权限保护带有 key 的 keystore 。它还必须使用复杂的密码进行保护。带有 key 的 keystore 必须只包含 key /证书对和 CA(如果需要),没有别的。

为 keystore 设置限制性文件权限(我已经这样做了)

将 keystore 文件的权限设置为只读。用于运行应用程序的帐户应该是文件的所有者。
chown account_id keystore_file_name
chmod 400 keystore_file_name

只保留 Activity key /证书(我已经这样做了)

确保 keystore 仅包含 Activity key 、证书和 CA 链。过期的证书、未使用的 CAS 必须删除。

这需要定期或作为每个应用程序版本的一部分来实现清理 keystore 的过程。

不要在 Jar 文件/应用程序存档文件中打包 keystore

开发人员经常将 keystore 文件与所有其他应用程序资源捆绑在一起,因此它们最终位于应用程序类路径中,然后自动获取我的 Maven/Gradle 构建工具并添加到 Jar 文件中。

这使得在需要时更新 key /证书变得困难。 key /证书可以(并且应该)在不同于应用程序生命周期的生命周期内更新。因此,将它们保留在应用程序文件之外是一个好主意——这允许完全独立于应用程序本身更新 keystore 。

即使存在真正的持续交付流程并且应用程序代码更新非常频繁,从打包的角度将 keystore 与应用程序分离仍然是值得的,以便 keystore 可以在发生违规时快速更新。

这也意味着 keystore 的部署工具链应该与常规应用程序部署工具链分开。换句话说, keystore 应该被视为一个完全独立的部署工件,独立于应用程序。

不要在 Docker 容器中打包 keystore

keystore 和 PEM 文件应放置在外部 docker 卷上,以便可以在不修改 docker 镜像的情况下更新它们。这允许在安全漏洞或常规 key /证书轮换/刷新的情况下独立于 docker 镜像更新 keystore 。

外部卷上的文件可以简单地在主机上替换,然后可以重新启动 docker 容器(或多个容器)。

如果在同一主机上运行多个 docker 容器,它们都可以与 keystore 共享同一个卷。

不要在应用程序 Git 存储库中存储 keystore

所有 key 和 secret 都必须与源代码分离并单独存储。
不同环境的单独 keystore

生产环境必须始终拥有自己的专用 keystore 文件。
对 keystore 使用 PKCS12 格式

PKCS12 与其他工具兼容,例如 openSSL。它是 Java 9 及更高版本的默认设置,但必须为以前的 Java 版本显式设置。

关于java - 在 Spring Boot 中存储证书的最佳做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59662165/

相关文章:

rest - 使用一次性密码来保护 REST 应用程序是个好主意吗?

java - 我如何在 WildFly 8 中获得更多可用的密码套件

pdf - 使用基于 ssl/https 的 iframe 显示 pdf

java - 在网格中寻找最优路径

java - 为项目分发 Eclipse 设置的最佳实践?

java - 我如何对 GC 进行单元测试?

url - Spring Boot 和 Angular 2 的 URL 处理问题

java ProcessBuilder 不起作用

spring-boot - Spring Boot + Thymeleaf 应用程序中的缓存清除

spring-boot - 了解 Elixir