【问题标题】:Remove private key from Mac OS X keychain using Terminal使用终端从 Mac OS X 钥匙串中删除私钥
【发布时间】:2011-10-06 17:17:42
【问题描述】:

我已将用于 iOS 开发的开发人员身份(证书 + 私钥)导入钥匙串,使用“安全”终端应用程序和命令

security import identity.p12 -k <keychain> -P <passphrase>

这会将 p12 文件中包含的两个项目(证书和私钥)导入给定的钥匙串。但是,我忘记指定-T /usr/bin/codesign,它将协同设计应用程序添加到私钥的访问列表中。我已尝试将 codesign 应用添加到访问列表中,但无济于事:

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

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

有什么方法可以仅使用终端命令从钥匙串中删除私钥(因为我只有 ssh 访问相关机器)?

【问题讨论】:

    标签: macos terminal keychain codesign


    【解决方案1】:

    您的系统上有几个钥匙串:

    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
    

    【讨论】:

    • 感谢非常详细的回答!我没有将身份导入 System-Keychain 而是导入 Login-Keychain - 正如我所期望的那样。我唯一没有正确做的事情是在导入期间指定 -T /usr/bin/codesign 标志。我已经尝试过 delete-certificate 子命令,但它只删除证书,而不是私钥。因此,-T 标志在重新导入时将被忽略,因为私钥仍包含在钥匙串中。这是否说明了情况?
    • 经过一番尝试后,我认为最好的解决方案是从钥匙串中导出所有密钥和证书,将其删除并重新导入它们。事实上,我找不到删除私钥的 shell 命令。您是否尝试为“删除证书”选项提供密钥的 SHA-1 哈希?
    • 我试过删除私钥所属的证书。这可行,但一旦再次导入代码签名身份,旧的访问权限就会授予私钥。
    • 我可以通过 -c(证书的通用名称)删除证书,但不能删除私钥,我不知道如何定位它。你是怎么做到的?
    • 如何获取 cer 的 SHA-1 哈希或通用名称(我有 p12 文件)?
    【解决方案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.
    

    【讨论】:

      猜你喜欢
      • 2015-03-05
      • 1970-01-01
      • 2014-06-25
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多