我的客户使用自签名证书来运行应用程序。为了能够运行,我必须安装他们用于签署证书的根证书。
是否可以配置根证书以便它仅针对一个域进行验证?
答案1
根据经验:
不,信任客户的 CA 证书意味着信任该 CA 签名的每个证书。
我不知道有哪个应用程序/库有一个简单的选项,允许您作为最终用户选择您只信任您的客户或任何其他 CA 证书(仅针对某些(子)域,即仅适用于 *.example.com 和 *.example.org 而不支持其他任何证书)。
Mozilla 对目前受信任的政府资助 CA 也有类似的担忧,因为开放注意点例如铬合金在访问 Google 网站时内置了额外的检查,这就是恶意 *.google.com 证书和 Diginotar CA 的泄露被公开的原因。
但即使您不信任 CA,您仍然可以导入/信任由该 CA 签名的特定服务器证书,这将阻止该证书中的主机名出现 SSL 警告。这应该会使您的应用程序正常运行而不会出现错误或投诉。
例外情况:
X.509v3 PKI 标准中一个很少使用的选项是名称约束扩展,允许 CA 证书包含其被授权颁发证书的域名模式的白名单和黑名单。
您可能很幸运,您的客户在设置 PKI 基础设施时已经克制住了自己,并在 CA 证书中包含了该名称约束。然后,您可以直接导入他们的 CA 证书,并知道它只能验证有限范围的域名。
答案2
@CryptoGuy 在这里给出了一个很好的答案,但我想对其进行扩展。
换句话说:
您可以限制第三方 CA 信任颁发给您希望的名称列表的证书(来自该 CA)。即使第三方 CA 没有名称约束扩展,也可以通过交叉认证使用您自己的内部 CA 服务器来应用它们。诀窍是您使用内部 CA 签署第三方 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"
创建一个中间 CA…
创建带有名称约束的中间 CA 请求。
openssl req -new -days 3650 -newkey rsa:2048 -out domain-ca.req -sha256 -keyout domain-ca.key -config ossl_domain_com.cfg
文件中有以下内容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
然后,使用您的 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
或者使用你的根 CA 重新签名
如果您跳过了创建中间证书,请使用您的根 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
您可能需要使用它openssl x509 -x509toreq
来创建一个请求,您将以与上面的中间完全相同的方式对其进行签名。
现在,将您的根 CA、中间 CA 和跨域 CA 添加到您的浏览器的信任数据库。