是否可以将根证书的使用限制为域

Mic*_*elD 32 certificate restrictions

我的客户使用自签名证书来运行应用程序。为了能够工作,我必须安装他们用来签署证书的根证书。

是否可以配置根证书,使其仅对一个域进行验证?

HBr*_*ijn 26

根据经验:

,信任客户的 CA 证书意味着信任该 CA 签署的每个证书。

我不知道有任何应用程序/库有一个简单的选项,允许您作为最终用户选择信任您的客户或任何其他 CA 证书仅用于某些(子)域,即仅用于 *. example.com 和 *.example.org 没有别的。

Mozilla 对当前受信任的政府赞助的 CA 也有类似的担忧,作为一个公开的关注点,例如Chrome内置了额外的检查来访问 Google 网站,这就是流氓 *.google.com 证书和 Diginotar CA 的泄露公开的原因.

但即使您不信任 CA,您仍然可以导入/信任由该 CA 签名的特定服务器证书,这将防止针对该证书中的主机名发出 SSL 警告。这应该使您的应用程序正常工作而不会出现错误或投诉。

例外:

X.509v3 PKI 标准的一个未被充分利用的选项是名称约束扩展,它允许 CA 证书包含授权为其颁发证书的域名模式的白名单和黑名单。

您可能很幸运,并且您的客户在设置其 PKI 基础结构并将该名称约束包含在其 CA 证书中时已经克制了自己。然后你可以直接导入他们的 CA 证书,并且知道它只能验证有限范围的域名。

  • 对于您编辑的帖子:即使第 3 方 CA 没有名称约束扩展,也可以通过交叉认证使用您自己的内部 CA 服务器来应用它们。在这种情况下,证书链将如下所示:叶 SSL 证书 -> 交叉证书 -> 您的 CA 证书 -> 您的内部根证书。诀窍是您使用内部 CA 签署第 3 方 CA。并且交叉证书将具有所有必需的约束。 (3认同)
  • @CryptoGuy:内部 CA 还可以为外部域颁发证书。一旦您信任您的内部 CA,就没有任何限制,即只有您自己(Active Directory 或 DNS)域 `example.com` 或 `*.ad.example.com` 的证书有效。您的内部 CA 还可以为 `*.example.bank` 颁发证书,从而允许一个很好的中间人攻击并窥探您的网上银行凭证。 (2认同)
  • CryptoGuy 表示这是可能的,但找到实现细节具有挑战性。描述如何实现这一点的答案怎么样?也许还可以讨论哪些平台支持 nameConstraints。 (2认同)

小智 20

@CryptoGuy 在这里有一个很好的答案,但我想扩展它。

转述:

您可以将第 3 方 CA 限制为信任颁发给您希望的名称列表的证书(来自该 CA)。即使第 3 方 CA 没有名称约束扩展,也可以通过交叉认证使用您自己的内部 CA 服务器来应用它们。诀窍是您使用内部 CA 签署第 3 方 CA。

叶 SSL 证书 -> 交叉证书 -> 您的 CA 证书 -> 您的内部根证书。

这是您如何使其工作(使用 OpenSSL 命令行 CA)

创建一个简单的 CA

openssl req -new -x509 -days 3650 -newkey rsa:2048 -sha256 -out root-ca.crt -keyout root-ca.key -subj "/CN=My Root CA"
Run Code Online (Sandbox Code Playgroud)

您可以跳过创建中间 CA

创建具有名称约束的中间 CA 请求。

openssl req -new -days 3650 -newkey rsa:2048 -out domain-ca.req -sha256 -keyout domain-ca.key -config ossl_domain_com.cfg
Run Code Online (Sandbox Code Playgroud)

ossl_domain_com.cfg文件中使用这个:

[ req ]
prompt=no
distinguished_name=req_distinguished_name
req_extensions=domain_ca

[ req_distinguished_name ]
CN=somedomain.com trust CA

[ domain_ca ]
basicConstraints=critical,CA:true,pathlen:1
nameConstraints=critical,permitted;DNS:.somedomain.com
Run Code Online (Sandbox Code Playgroud)

然后,使用您的 CA 签署该中间域 CA。

openssl x509 -req -in domain-ca.req -CA root-ca.crt -CAkey root-ca.key -sha256 -set_serial 1 -out domain-ca.crt -extensions domain_ca -extfile ossl_domain_com.cfg
Run Code Online (Sandbox Code Playgroud)

如果您跳过创建中间件,请使用您的根 CA 进行签名

现在使用他们的证书在您的授权下重新签署原始域的 CA。您可以在此处添加 CA 扩展。

openssl x509 -in third_party_ca.crt -CA domain-ca.crt -CAkey domain-ca.key -set_serial 47 -sha256 -extensions domain_ca -extfile ossl_domain_com.cfg -out domain-cross-ca.crt
Run Code Online (Sandbox Code Playgroud)

您可能需要使用它openssl x509 -x509toreq来创建一个请求,您将采用与上述中间体完全相同的方式对其进行签名。

现在,将您的根 CA、中间 CA 和 domain-cross-ca 添加到浏览器的信任数据库中。

  • MacOS 不支持 nameConstraints。仅适用于在名称受限的内部 CA 上工作的任何人。http://security.stackexchange.com/questions/95600/are-x-509-nameconstraints-on-certificates-supported-on-os-x https://archive.is/6Clgb (3认同)
  • 我刚刚成功使用它,谢谢。没有中间证书就可以很好地工作,使用中间证书有什么好处吗?此外,配置文件中的“basicConstraints”行似乎导致约束扩展被包含在证书中两次,这导致 Firefox 拒绝证书并显示一个神秘的错误消息。我认为它可以安全地删除。 (2认同)
  • 我在最后一步收到错误:“要认证的证书错误 - 应该是自签名”。这是什么意思以及如何解决这个问题?https://pastebin.ubuntu.com/p/QHhpQh2N6J/ (2认同)