我在网上看到的每个教程都向我展示了如何通过简单地在 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/