适用于CA的新的开源ACME代理/前端 EJBCA

2020-12-24 21:23:46

Serles是一个很小的ACME-CA实施,用于增强您现有的CertificateAuthority基础结构。最初开发该软件是为了使用PrimeKey的EJBCA的开放源代码版本支持ACME(ACME支持仅在企业版本中可用),该软件旨在轻松适应其他PKI软件/ CA,后者提供了用于颁发证书的API 。

我们有时称它为代理,因为它将证书颁发委托给您现有的PKI。从用户的角度来看,可以将serles-acme与EJBCAinstance结合使用,就像是您自己的私有letencrypt。

如果要使用另一个PKI项目,请随时实现自己的后端。非常欢迎捐款。

Serles旨在自动从您现有的CA颁发证书。它将验证证书申请的合法性,并将证书申请(如果有)传递给插件/后端。

+ -------- + + --------- + + --------- + | | (1)--- {authentication}-> | | |后端||网页| (2)--- {order cert} ------> |塞勒斯| | (例如||服务器|< ----- {验证} -----(3)| ACME | | EJBCA)|| | (4)--- {CSR} -------------> | | (5)--- {CSR} ---------> | | + -------- +< ----- {证书} ---(7)+ --------- +<-{证书}-(6) + --------- +

威胁模型是在(受信任的)企业网络内部执行的。但是,在接受任何用户数据时要格外小心。虽然没有用户身份验证(即,任何可以访问Serles的用户都可以要求提供证书),但可以指定所请求域必须解析到哪个IP子网才能获得证书。

可以使用CONFIG环境变量来设置配置文件。如果不存在,则从/etc/serles.ini加载它。包含广泛注释的示例配置文件包含在config.ini.example中。您可以将其复制(并重命名)到上述位置。 Serles与任何WSGI服务器兼容;请查阅您的服务器手册进行配置。

该软件附带一个预定义的后端,但是很容易编写其他后端。如果这样做,请发送补丁!

subjectDN:CSR的专有名称,是字符串,如果不存在,则是从配置文件中的模板字符串创建的。

subjectAltNames:要在证书的SAN扩展属性中写入的域名(作为字符串)的列表。

电子邮件:存储在请求帐户中的电子邮件(或无),旨在传递到后端以通知客户端。

如果出错,则为元组(无,error_msg),其中error_msg是一个字符串(可能从后端转发),该字符串描述了为什么拒绝了CSR。这将在badCSR问题文档中转发给客户端。

class SomeBackend:def __init __(self,config):self。 config = config def sign(self,csr,subjectDN,subjectAltNames,email):返回None,"未实现"

您所需要的只是一个有权颁发证书的用户。设置证书颁发机构(例如testca),最终实体配置文件(例如acmeendentity)和证书配置文件(例如acmeserverprofile)。使用客户端证书设置和注册用户,该证书将用于与API进行对话。

颁发证书时,将从模板生成用户名和注册码。可以在config中配置此模板。您可以通过将其包装在花括号中来使用“专有名称”(来自CSR)中的参数。

如果客户设置了联系电子邮件,我们将在转发CSR时将其传递给EJBCA。然后可以将EJBCA配置为发送EndEntityProfile的通知。

依赖关系在setup.py中说明。如果可用的python-cryptographyversion小于3.1,则需要openssl命令行实用程序(在$ PATH中的某个位置)。

该数据库用于保存两次请求之间的状态,但是一旦满足(或拒绝)了订单,就不再使用与该订单有关的所有数据(在订单到期后的7天之内,实际上将其删除)。因此,将该数据库存储在内存中就足够了。但是,此内存数据库不是线程安全的。根据您的要求,可以将config.ini中的数据库设置为磁盘上的数据库,或者(当使用gunicorn时)将辅助进程和线程的数量限制为1。

请注意,certbot会尝试重新使用帐户ID,因此,在使用内存DBpass时-钩前rm -rf / etc / letsencrypt / accounts'避免这种行为。

请注意,在使用EJBCA后端时,由于EJBCA软件中存在并发问题,因此一次仅应允许一个连接(即单线程)。