如何使用 OS X 的 "security add-trusted-cert" 命令为证书指定策略约束?(用于 SSL 网络套接字连接)



我正在构建一个应用程序,该应用程序将通过安全的Web套接字(SSL)连接到用户的Web浏览器。我正在使用Websocketd连接到Web套接字,但这无关紧要。

简短版本:

我真的只需要使用 add-trusted-cert 命令的帮助......如果你以前没有用过这个,苹果的手册页真的根本帮不上忙。如何将证书添加到系统钥匙串,而仅将SSL和基本选项设置为"Aways信任"?

长版本:

我正在生成自签名证书并将它们传递到 Websocketd 中,以便通过 SSL 连接到 Web 套接字。Firefox 和 Chrome 不需要进一步的步骤...他们只是用这个。但是,Safari 不信任我的自签名证书,我必须进入钥匙串访问并添加我的证书并将信任设置更改为"使用自定义设置",只有SSL 选项和 X.509 基本策略选项设置为"始终信任"...任何其他设置和 Safari 抱怨。我不希望我的用户不得不摆弄证书,所以我的解决方案是使用安装后脚本将我的证书添加到系统钥匙串。这样:

sudo security add-trusted-cert -d -r trustRoot -k "/Library/Keychains/System.Keychain" "./certificate.cert"

这将成功将证书添加到用户的系统钥匙串...但它将所有选项设置为"始终信任"...出于某种原因,Safari 不喜欢这样并抱怨。当 SSL 和 X.509 基本策略选项设置为"始终信任",其余选项设置为"未指定值"时,Safari 才会运行。

好的,所以我检查了"安全添加信任证书"的手册页,果然有一个选项,您可以传入该选项以仅将某些选项设置为"始终信任"......所以我想出了这个:

sudo security add-trusted-cert -d -r trustRoot -p ssl -k "/Library/Keychains/System.Keychain" "./certificate.cert"

-p ssl选项的结果是,现在我的证书被添加到系统钥匙串中,只有 SSL 选项设置为始终信任...但基本选项不是!如果我将 ssl 替换为基本,我可以将基本选项设置为始终信任:

sudo security add-trusted-cert -d -r trustRoot -p basic -k "/Library/Keychains/System.Keychain" "./certificate.cert"

但这仍然不能解决我的问题!我需要将两者设置为始终信任,而其他选项则保留在"无指定值"...所以我试了这个:

sudo security add-trusted-cert -d -r trustRoot -p ssl & basic -k "/Library/Keychains/System.Keychain" "./certificate.cert"

但这行不通。我发誓我已经阅读了所有关于这个主题的谷歌,我找不到一个如何构建这个命令的例子,以便它完成我所描述的内容。此链接确认了我需要做什么,但实际上并没有提供示例命令,并且此链接正在搜索与我相同的答案......但是还没有人回答合适的答案,关于这个堆栈溢出问题的公认答案是正确的......但他们只是告诉你你需要做什么(我已经知道了),并没有告诉你如何实际去做。

那么,如何将证书添加到系统钥匙串,并且仅将SSL和基本选项设置为"Aways Trust"?

谢谢!

在又一次令人沮丧的尝试猜测正确命令之后,我终于偶然发现了答案,如果有人需要它,我将在这里分享它:

sudo security add-trusted-cert -d -r trustRoot -p ssl -p basic -s "localhost" -k "/Library/Keychains/System.Keychain" "./certificate.cert"

请注意,解决方案是简单地添加另一个 -p 标志,后跟另一个约束。此外,使用 -s 标志指定策略字符串可能是明智的...就我而言,这只是本地主机。

我希望这证明有用!我目瞪口呆,这样的例行任务几乎没有文档,也没有关于堆栈溢出的答案。

最新更新