使用终端从Mac OS X钥匙串中删除私钥

30
我已经使用"security"终端应用程序,通过以下命令将iOS开发的开发者身份(证书+私钥)导入到钥匙串中:
security import identity.p12 -k <keychain> -P <passphrase>

这将把p12文件中包含的证书和私钥导入指定的钥匙串中。但是,我忘记了指定-T /usr/bin/codesign,这会将codesign应用程序添加到私钥的访问列表中。我尝试添加codesign应用程序到访问列表,但没有成功:

  • 我尝试使用添加参数重新导入身份信息,但似乎并未更改私钥的访问列表。
  • 我也尝试使用security delete-certificate从钥匙串中删除证书,然后重新导入。这不会更改私钥的访问列表。

由于我只能通过ssh访问该机器,因此无法使用Keychain GUI应用程序。因此,我正在寻找一种方法来从钥匙串中删除私钥(以便稍后重新导入身份信息)。我查看了security工具的man页面,但没有找到删除私钥的方法。

是否有任何方法可以仅使用终端命令从钥匙串中删除私钥(因为我只能通过ssh访问相关机器)?

2个回答

37

您的系统中有几个关键链:

sudo security list-keychains
"/Users/JonDoe/Library/Keychains/login.keychain"
"/Library/Keychains/System.keychain"

我认为你将其导入了系统钥匙串: 在进行任何更改之前(或选择的任何其他钥匙串),先备份您的系统根证书:

cd /System/Library/Keychains/
sudo cp SystemRootCertificates.keychain SystemRootCertificates.keychain.old

列出您钥匙串中的所有钥匙串/证书:
ls -l /System/Library/Keychains/
sudo security dump-keychain /System/Library/Keychains/SystemRootCertificates.keychain

使用第二个命令显示密钥链中的每个证书。确定您要删除的证书。 然后使用以下命令删除证书:

sudo security delete-certificate -Z <SHA-1 hash of certificate> /System/Library/Keychains/SystemRootCertificates.keychain
**alternative:**
sudo security delete-certificate -c <common name of certificate> /System/Library/Keychains/SystemRootCertificates.keychain

好的,现在您可以再次导入您的证书。如果出现错误,您可以使用以下命令恢复您的密钥链:

sudo security import certificate_files_backup -k /System/Library/Keychains/SystemRootCertificates.keychain -t cert

1
非常感谢您提供如此详细的答案!我没有将身份导入到System-Keychain中,而是导入到了Login-Keychain中 - 这正是我想要的。我唯一做得不正确的事情就是在导入时没有正确指定“-T /usr/bin/codesign”标志。我已经尝试过delete-certificate子命令,但它只会删除证书,而不会删除私钥。因此,在重新导入时忽略了“-T”标志,因为私钥仍包含在密钥链中。这样清楚了吗? - Benjamin
试了一下后,我想最好的解决方案是从钥匙串中导出所有的密钥和证书,然后删除它们并重新导入。实际上,我找不到一个用于删除私钥的shell命令。您尝试过给“delete-certificate”选项指定密钥的SHA-1哈希值吗? - Erik
我尝试删除私钥所属的证书。这样做是有效的,但只要重新导入代码签名标识,旧的访问权限就会被授予私钥。 - Benjamin
我可以通过 -c(证书的通用名称)删除证书,但无法删除私钥,我不知道如何定位它。你是怎么做到的? - Luca Torella
我如何通过一个cer文件(我有p12文件)获取SHA-1哈希值或常见名称? - Zhongyuan Zhou
这只是帮助证书 - 它不会删除私钥。如何删除私钥?我在“security”工具中找不到此命令。 - Motti Shneor

2
您可以在终端中运行一个命令来删除证书和密钥:
sudo security delete-identity -Z "SHA-1"

或者

sudo security delete-identity -c "CommonName"

一开始我以为它只是移除了密钥,但实际上它也移除了证书(你只需要完全关闭钥匙串并重新打开它以查看更改——如果你正在使用GUI进行验证)。

来自man security

     delete-identity [-h] [-c name] [-Z hash] [-t] [keychain...]
        Delete a certificate and its private key from a keychain.  If no keychain arguments are provided, the default search list is used.

        -c name         Specify certificate to delete by its common name
        -Z hash         Specify certificate to delete by its SHA-1 hash
        -t              Also delete user trust settings for this identity certificate

您可能需要首先解锁钥匙串(来自 man security):
 unlock-keychain [-hu] [-p password] [keychain]
        Unlock keychain, or the default keychain if none is specified.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接