Java 在spring boot中存储证书的最佳实践是什么?

Java 在spring boot中存储证书的最佳实践是什么?,java,spring-boot,https,pki,Java,Spring Boot,Https,Pki,我在网上看到的每一个教程都向我展示了如何通过在application.conf文件中指定密钥库路径和密码来在spring boot中设置HTTPS,例如中的1.4。我可以做到这一点,并设置好HTTPS 然而,这在我看来是肮脏的。这意味着密钥库和密码都存储在源代码中,我不想这样做。到目前为止,我所做的是创建了自己的密码,并从环境变量中提供了密码。这是很好的第一步,但我仍然需要在源代码中保留密钥库。这是否足够?还有什么我能做的吗? 和其他指南一样,他们说“不要在源代码中保留密钥库”,但没有提供任何关

我在网上看到的每一个教程都向我展示了如何通过在application.conf文件中指定密钥库路径和密码来在spring boot中设置HTTPS,例如中的1.4。我可以做到这一点,并设置好HTTPS

然而,这在我看来是肮脏的。这意味着密钥库和密码都存储在源代码中,我不想这样做。到目前为止,我所做的是创建了自己的密码,并从环境变量中提供了密码。这是很好的第一步,但我仍然需要在源代码中保留密钥库。这是否足够?还有什么我能做的吗?

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

无论如何,这里有一些重要的东西(如果有人能为简短的建议提供解决方案,那就太好了):


保护您的密钥库和密钥密码(我已经这样做了) 通常,密钥库密码存储在各种配置文件中的开放文本中

例如,以下是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"
    />
仅保留活动密钥/证书(我已经这样做了) 确保密钥库仅包含活动密钥、证书和CA链。已过期的证书、未使用的CA必须删除

这需要实现一个定期清理密钥库的过程,或者作为每个应用程序版本的一部分

不要将密钥存储打包到Jar文件/应用程序归档文件中 开发人员通常会将密钥库文件与所有其他应用程序资源捆绑在一起,这样它们最终会出现在应用程序类路径上,然后自动选择我的Maven/Gradle构建工具并添加到Jar文件中

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

即使有一个真正连续的交付过程,并且应用程序代码更新非常频繁,从打包的角度来看,从应用程序中分离密钥存储库仍然是值得的,以便在出现漏洞时可以快速更新密钥存储库

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

不要将密钥存储打包到Docker容器中 密钥存储库和PEM文件应放在外部docker卷上,以便在不修改docker映像的情况下进行更新。这允许在出现安全漏洞或定期密钥/证书轮换/刷新时,独立于docker映像更新密钥库

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

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

不要在应用程序Git Repo中存储密钥库 所有密钥和机密必须与源代码分离并单独存储。 不同环境的独立密钥库

生产环境必须始终具有自己的专用密钥库文件。 密钥库使用PKCS12格式


PKCS12与其他工具(如openSSL)兼容。这是Java 9及以上版本的默认设置,但必须为以前的Java版本显式设置。

应用程序中的密码.conf”的哪一方面意味着“密码存储在源代码中”?Michael well在spring boot教程中,如我链接的教程中,您必须在application.conf中为git跟踪的密钥库提供密码。因此,它将出现在gitlab/github/任何源代码中。无论如何,我能够将密码作为环境变量处理。我只是想知道密钥库通常做什么。它们通常留在代码中吗?请将您的密码保存在不同的文件中,例如
应用程序机密.properties
,该文件不在源代码管理中
chown account_id keystore_file_name
chmod 400 keystore_file_name