Rest 证书发现服务

Rest 证书发现服务,rest,ssl,ssl-certificate,microservices,keystore,Rest,Ssl,Ssl Certificate,Microservices,Keystore,我正在设计一个微服务体系结构,并且已经通过使用生成的SSL证书设置了https保护 提供的证书会定期重新生成,然后我必须将新证书重新导入到我所有服务的密钥库中 为了避免这种情况,我尝试实现一组RESTAPI,这些API可能允许服务以编程方式自动检索新证书,并将它们导入到它们自己的密钥库中,或者只是以编程方式使用它 正如标题所说:一种证书发现服务,或者,如果您愿意,也可以是远程证书存储库 我知道有java.security.*包允许我处理这类事情,但我有两个问题要问大家: 您是否认为,从架构的角度

我正在设计一个微服务体系结构,并且已经通过使用生成的SSL证书设置了https保护

提供的证书会定期重新生成,然后我必须将新证书重新导入到我所有服务的密钥库中

为了避免这种情况,我尝试实现一组RESTAPI,这些API可能允许服务以编程方式自动检索新证书,并将它们导入到它们自己的密钥库中,或者只是以编程方式使用它

正如标题所说:一种证书发现服务,或者,如果您愿意,也可以是远程证书存储库

我知道有java.security.*包允许我处理这类事情,但我有两个问题要问大家:

您是否认为,从架构的角度来看,这是解决我的问题的最佳方法? 您推荐哪种序列化/反序列化过程?是否已经有任何库/框架/工具可以进行类似的开发? 多谢各位。
再见

仅供参考,这是一个意见问题,有些人对StackOverflow不屑一顾,但我不是那种人,所以我给你2美分

集成解决方案与复合解决方案 您描述的场景是我创建ACME/Let's Encrypt client library、cli和web服务器套件的原因之一

我想要一个完全集成的解决方案,可以在没有手动干预的情况下自动提供证书,当时certbot很难安装,并且使用了太多RAM,以至于我无法在正在使用的IoT设备上使用它

在我的例子中,我创建了一个插件系统,允许使用不同的存储机制fs、redis、sql、aws s3、azure存储等,然后其他作者提供了其中的大部分机制

听起来certbot可能会作为一个复合解决方案来包装它,但是如果您要经历创建证书存储之类的麻烦,您可能还想通过与Java ACME库集成来确保它支持ACME draft 11/让我们加密v02

另一种想法是使用像Greenlock这样的东西作为https前端,反向代理您的应用程序,尽管Greenlock可能无法满足您的需求—java或go解决方案(如果存在的话)从声音上看可能更适合您

对我来说,围绕Greenlock创建一些REST API以使其能够作为分发证书的微服务器,这听起来也很有趣,而且不需要做太多工作,但我必须了解更多关于您的项目的信息才能更好地理解

概述:

在每个服务上使用wrap certbot编写,并将文件作为微服务同步到远程存储 集成本机ACME/Let's Encrypt解决方案并与存储插件同步,以允许各种类型的现有存储服务 创建一个单独的服务来处理证书颁发,在每个服务上使用RESTAPI 它们都是有效的,并且取决于哪些代码已经可用,它们都非常容易实现

在每个实例上运行certbot的唯一问题是,可能很难连接到它用来检查证书的系统,让它使用远程服务

最佳选择? 我个人认为,第二种选择是将ACME代码集成到服务中,并拥有用于存储的插件体系结构,这是最好的,因为在处理ACME证书的微服务失败的情况下,您的其他服务仍然能够获得自己的服务,而查找失败,他们获得证书,而不是使用现有的证书。这是一个渐进的增强。这也是Greenlock的插件架构非常好地支持的

格式和捆绑包 有人可能会说,您希望使用P12拥有一个带有密码短语等的密钥库,我认为这是有效的

然而,这将在传输过程中被加密,并且几乎可以肯定,如果您的Web服务器被泄露,密码短语也会被泄露,因此我倾向于使用简单的PEM和JWK

在您的用例中,听起来您可能不需要JWK,所以这意味着只需要PEM

PEM只需要去除空白和注释,然后从标准Base64解码,如果出于任何原因,您需要手动将其解码到DER。同样,可以通过删除注释和空格,然后将-替换为u和/替换为+,将其转换为Base64URLSafe

此外,我非常喜欢存储和分发这些作品的模式:

证书 链 privkey.pem 因为很容易将它们以您需要的任何方式组合起来,以便将它们交付给任何类型的Web服务器

Apache、Nginx、Node等的fullchain.pem cert.pem+chain.pem bundle.pem fullchain.pem+privkey.pem用于HAProxy 所以我要说发送一个JS 在具有PEM的对象上:

{ "cert": "..."
, "chain": "..."
, "privkey": "..."
}
然后让客户端执行response.cert+'\\r\\n'+response.chain等操作,根据需要构造fullchain.pem或bundle.pem

最佳选择?
最简单、最可移植的格式——可能是PEM,然后是JWK,接下来可能是Base64URLSafe,但不是任何特定Java库的自定义格式。将来您可能会扩展到支持非Java服务。

我不会把这个基础设施的责任交给微服务。相反,我将创建一个专用服务来更新证书,并在必要时重新启动微服务。谢谢康斯坦丁。我猜服务就是指系统服务。好的,我明白你的意思,但是如果我的微服务分布在多个虚拟机上呢?这取决于。例如,如果您使用Docker Swarm,您可以将证书放入Docker secrets中,Swarm负责复制。您还可以使用rsync或scp复制证书。在mi特定情况下,docker secret是最佳解决方案。非常感谢。