为 Intranet 创建我自己的 CA

信息安全 tls 公钥基础设施 openssl
2021-08-16 02:14:20

我需要为 Intranet 创建自己的 CA,不幸的是,Security.SE 上似乎没有很好的答案。

网上有很多关于此的资源,但它们都是不同的,有些使用过时的默认值(MD5/SHA1 等),这似乎不值得信赖。也有数百种不同的变体openssl.cnf,从 10 行文件到我的发行版默认附带的巨大文件。

我想要一个关于设置一个简单的CA 来颁发服务器证书和客户端证书的规范答案。

显然,有些人似乎仍然不明白,我不是一家大型公司,CA 妥协会导致数十亿美元的损失并且无法轻易减轻,所以让我更好地解释一下为什么我需要 CA:

  • 通过不安全的链接(互联网)连接的多个服务器需要安全通信。

  • 我需要一种方法来向这些服务器表明自己的身份,以便执行管理任务,而无需每 10 秒来回访问我的密码管理器。

  • 除了我的以外,没有其他 CA应该能够模拟任何服务器,无论这多么不可能(但可能)。

那里。我自己的 PKI 和安装在每台机器上的证书似乎完美地满足了需求。我使用的其中一个软件也需要使用 PKI,因此不能只使用自签名证书。

为了破坏 PKI,有人需要破坏我的工作机器,如果这样做了,那么攻击者甚至可以在不接触 PKI 的情况下造成相当大的破坏(因为无论如何我都会通过 SSH 从这台机器登录到服务器) . 这是我愿意承担的风险,而且这个 PKI 不会比已经存在的风险增加任何风险。

4个回答

如果您的基础设施很小,运行 CA 的许多细节(例如 CRL 等)可能会被忽略。相反,您真正需要担心的是签署证书。

有许多工具可以为您管理此过程。我什至在很多年前写过一篇。但是,如果您想要一些非常简单的东西,我推荐的是OpenVPN 项目中的easy-rsa它是 OpenSSL 命令行工具的一个非常薄的包装器。如果您要管理大量证书并实际处理吊销等问题,您将需要一个更复杂且功能完整的实用程序。已经提供了足够多的建议,所以我只会坚持你想要完成的基础知识。

但这是基本程序。我将用 OpenSSL 来解释它,但任何系统都可以。

首先创建您的“根”CA——它将是一个自签名证书。做这件事有很多种方法; 这是一。我们将使用 2048 位密钥制作 10 年证书。适当调整数字。你提到你担心散列算法,所以我添加-sha256以确保它是用可接受的东西签名的。我正在使用 AES-256 加密密钥,但这是可选的。您将被要求填写证书名称等;这些细节对于根 CA 并不是特别重要。

# First create the key (use 4096-bits if that's what floats your boat)
openssl genrsa -aes256 -out root.key 2048

# Then use that key to generate a self-signed cert
openssl req -new -x509 -key root.key -out root.cer -days 3652 -sha256

如果您在第一步中加密了密钥,则必须提供密码才能在第二步中使用它。检查您生成的证书以确保在“基本约束”下您看到“CA:TRUE”。这确实是您需要担心的唯一重要的一点:

openssl x509 -text < root.cer

凉爽的。好的,现在让我们签署一个证书。我们需要另一个密钥,这次是一个请求。系统会再次询问您的姓名和地址。您填写的字段和提供的内容取决于您和您的应用程序,但最重要的字段是“通用名称”。这就是您提供主机名或登录名或该证书将证明的任何内容的地方。

# Create new key
openssl genrsa -aes256 -out client1.key 2048

# Use that key to generate a request
openssl req -new -key client1.key -out client1.req

# Sign that request to generate a new cert
openssl x509 -req -in client1.req -out client1.cer -CA root.cer -CAkey root.key  -sha256 -CAcreateserial

请注意,这会创建一个名为 root.srl 的文件,以保持我们的序列号正确。-CAcreateserial标志告诉 openssl 创建此文件,因此您为您签署的第一个请求提供它,然后再也不提供。再一次,您可以看到在哪里添加-sha256参数。

这种方法——手动做所有事情——在我看来不是最好的主意。如果您正在运行一个相当大的操作,那么您可能需要一个可以为您跟踪所有证书的工具。

相反,我的意思是向您展示您想要的输出(证书以您想要的方式签名)并不取决于您使用的工具,而是您为这些工具提供的选项。大多数工具可以输出各种各样的配置,无论强弱,您可以提供您认为合适的数字。过时的默认设置与课程相同。

如果您真的希望成为 CA,请注意这样做的安全隐患。

  1. 用于为您的 Intranet 生成根 CA 的私钥实际上应该被锁定在保险箱中。并且应该对对所述保险箱的访问进行物理监控。
  2. 使用自签名根 CA 会迫使您的用户不仅相信您正在通过安全保护密钥执行尽职调查,而且还将最初不受信任的根插入到他们的证书链中。
  3. 这也破坏了关于证书链外部验证的 OSCP 装订功能,这是身份管理服务首先存在的原因。

相当多的人会争论管理自己的 CA 背后的原因,例如:它适用于公司内部网,其中我们的部分桌面版本包含根 ca,或者适用于少数用户。

虽然这样做不一定是错误的,并且可能会带来一些好处,但它确实否定了基于证书的身份管理所构建的验证链。

如果您决定实现自己的根 ca,请确保遵循与任何其他根 ca 使用的相同的安全实践。作为一家公司,您最不希望发生的事情是有人泄露用于您的根 ca 的私钥并开始签署针对您客户的网络钓鱼活动的证书。

有大量可用的最佳实践指南,NIST(国家标准和技术研究所)是一个协作小组,协助制定各种计算机安全主题标准。

推荐阅读:
审计 (PDF)
灾难恢复 (PDF)
公钥系统 (PDF)
Sans 关于小型 PKI 部署的研究所

好的,我看到您将问题更新为更具体。

用于配置您的 openssl.cnf 文件以了解 CA 细节的两个文档:

https://www.openssl.org/docs/apps/ca.html

https://www.openssl.org/docs/apps/config.html

我意识到这可能不是您想要的答案,但是因为每个人的环境和要求都不同,您将不得不为您的 CA 实现定义一个范围,以获得一个好的示例配置。

没有办法简单地做到这一点。有一些工具可以帮助您轻松入门。

喜欢:

除了可能的 EJBCA 之外,它们都不是完整的 PKI,但设置起来并非易事。

  • XCA 是一个小型前端工具,用于获取图形界面来生成、签署和撤销证书。
  • EJBCA 或 Enterprise Java Beans Certificate Authority 是一个 JBOSS / Jetty Webapp,可以为企业执行完整的 PKI 基础设施。
  • openssl 是基本的命令行工具。它可以完成 CA 的所有离线位,但不能进行验证(开箱即用)。您可以使用它制作自己的 OCSP 验证器,但您必须自己制作“在线”代码。

如果您所寻求的只是正确的 openssl 配置。XCA 可以帮助您生成它们。(它有一个 openssl 配置导出功能

有关一些好的背景,请参阅我的演示如何建立和运营您自己的平庸证书管理中心演示文稿的要点是,最需要的不是要运行的命令列表,而是深入了解运行商业 CA 的所有各种控制、它们如何相互作用、删除的确切影响其中任何一个,删除其中几个的累积影响,以及弥补安全性降低所必需的缓解控制。

这就是为什么没有“关于设置简单 CA 的规范答案”的原因。要么走整个 ISO 路线,从密钥签名方开始、气隙和保管的重复根证书、多个中间签名者、撤销服务器等,要么必须根据独特的成本/收益和企业愿意接受的风险状况。任何有足够技能和经验来根据定义进行评估的人都不需要备忘单。他们可以基于对要完成的业务功能和用于实现该要求的安全原语的深刻理解来解析正确的命令语法。

演示文稿中的故事来自商店的真实参与,这些商店沿着这条路走下去并且犯了可怕的错误。在某些情况下,我的评估报告说,我对您的中间件安全所做的任何事情都无法克服内部 CA 的固有弱点。美国的任何人都应该意识到,他们可能至少从演示文稿提到的供应商之一购买服务。这些是银行、信用合作社、健康保险公司、零售商等等。

由于要使建议“正确”,需要回答者对您可接受的风险状况做出重大假设,并且您需要对您和他们的风险观念一致和同步的程度做出重大假设,因此建议是表面上很冒险。在大多数此类情况下,评估所提供教程的适用性更多地与演示文稿有关,而不是与遵循其程序所产生的有效安全级别有关。如果它组织良好且表达清晰,那么这比它是否有效更重要。我们选择最适合我们的规范备忘

由于这些原因,我不相信可信的专家会提供“正确和最新的openssl.cnf文件”,而是最多可能提供一个评估过程来更全面地评估需求和可接受的风险。由于您将业务赌在结果上,因此没有可靠的专家会在合同保护之外这样做。几乎按照定义,您得到的任何建议都必须来自可靠的专家祝你好运。