证书发现服务

时间:2018-05-19 15:54:30

标签: rest ssl ssl-certificate microservices keystore


我正在设计一个微服务架构,并且我已经使用Let's Encrypt and certbot生成的SSL证书设置了https保护。

定期重新提供所提供的证书,然后我将新证书重新导入我所有服务的密钥库。

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

正如标题所说:某种"证书发现服务" ,或者,如果您愿意,还可以使用"远程证书存储库"

我知道有java.security。*包允许我处理这类事情,但我为你们所有人提出了两个问题:

  1. 从架构的角度来看,您是否认为这是面对我的问题的最佳方法?
  2. 您推荐哪个序列化/反序列化过程之王?已经有任何类似于我可以利用的类似的库/框架/工具吗?
  3. 谢谢。 再见

1 个答案:

答案 0 :(得分:1)

仅供参考,这是一个“意见问题”,有些人对StackOverflow不屑一顾,但我不是那些人之一所以我会给你2¢。

集成解决方案与复合解决方案

您所描述的场景是我创建Greenlock.js(ACME / Let的加密客户端库,cli和Web服务器套件)的原因之一。

我想要一个完全集成的解决方案,可以在没有人工干预的情况下自动提供证书(同时,当时certbot非常难以安装和使用如此多的RAM,我无法在我正在使用的IoT设备上使用它)

在我的情况下,我创建了一个插件系统,允许不同的存储机制(fs,redis,sql,aws s3,azure存储等),然后其他作者提供了大部分机制。

听起来certbot可能会为您提供复合解决方案(包装它),但是如果您要解决创建证书存储等问题,您可能还希望通过Java ACME进行集成库(只需确保它支持ACME草案11 /让我们加密v02)。

另一个想法是使用像Greenlock这样的东西作为反向代理你的应用程序的https前端(尽管Greenlock可能不是满足你需求的东西 - 一个java或go解决方案,如果存在,可能对你更好从它的声音)。

(对我来说,围绕Greenlock创建一些REST API以使其能够作为证书分发的微观功能,这听起来也很有意思,这样做不需要太多工作 - 但我必须学习更多关于你的项目,以便更好地理解)

回顾:

  • 在每个服务上撰写(换行)certbot,并将文件作为微服务同步到远程商店
  • 集成原生ACME / Let的加密解决方案并与插件同步以进行存储以允许各种类型的现有存储服务
  • 创建一个单独的服务来处理证书颁发,在每个服务上使用rest api

它们都是有效的,根据已有的代码,它们都很容易做到。

在每个实例上运行certbot的唯一问题是,挂钩到用于检查证书以使其使用远程服务的系统可能具有挑战性。

最佳选择?

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

格式&束

有些人可能会说你想要一个带密码的密钥库,比如使用P12,我认为这是有效的。

但是,这将在传输过程中加密,并且几乎肯定会以这样的方式暴露:如果您的网络服务器遭到破坏,密码短语也会受到影响,因此我倾向于使用简单的PEM和JWK。 / p>

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

PEM只需要剥离空格和注释,然后从标准Base64解码,如果由于某种原因,您需要手动将其解码为DER。同样,可以通过删除注释和空格,然后将-替换为_,将/替换为+,将其转换为Base64URLSafe。

另外,我非常喜欢存储和分发这些部分的模式:

  • cert.pem
  • chain.pem
  • privkey.pem

因为很容易以任何方式将它们组合在一起,以便将它们传送到任何类型的网络服务器。

    适用于Apache,Nginx,Node等的
  • fullchain.pemcert.pem + chain.pem
  • bundle.pemfullchain.pem + privkey.pem)for HAProxy

所以我说要用PEM发送一个JSON对象:

{ "cert": "..."
, "chain": "..."
, "privkey": "..."
}

然后让客户端response.cert + '\\r\\n' + response.chain等根据需要构建fullchain.pembundle.pem

最佳选择?

无论什么是最简单和最便携的 - 可能是PEM,然后是JWK,可能是Base64URLSafe,但不是任何特定Java库的自定义格式。您可以在将来扩展到支持非Java服务。