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 证书,并且知道它只能验证有限范围的域名。
小智 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 添加到浏览器的信任数据库中。