【问题标题】:mac security command needs write permissions when run by daemon?mac安全命令在守护进程运行时需要写权限吗?
【发布时间】:2014-10-20 21:08:16
【问题描述】:

我的任务是将 Tomcat/Jenkins 安装从已弃用(现已在 Yosemite 中删除)的 SystemStarter 框架移至 launchd。它作为“构建”用户启动并运行良好,除了一件事。我们构建过程的一部分涉及调用“安全”命令来操作钥匙串。这失败如下:

security: cert import failed: write permissions error
security: problem decoding

如果我通过 bin/startup.sh SSH 进入构建机器并从命令提示符启动 Tomcat,那么对 security 的调用不会抱怨。只有当我通过 launchd 启动 Tomcat 时它才会抱怨。我的 plist 如下所示:

<plist version="1.0">
<dict>
    <key>Label</key>
    <string>org.apache.tomcat</string>
    <key>UserName</key>
    <string>builduser</string>
    <key>WorkingDirectory</key>
    <string>/Users/builduser</string>
    <key>Program</key>
    <string>/Users/builduser/bin/tomcat.sh</string>
    <key>KeepAlive</key>
    <dict>
        <key>SuccessfulExit</key>
        <true/>
    </dict>
    <key>EnvironmentVariables</key>
    <dict>
        <key>CATALINA_HOME</key>
        <string>/Users/builduser/Tomcat</string>
        <key>CATALINA_OPTS</key>
        <string>-Djava.awt.headless=true</string>
        <key>JAVA_OPTS</key>
        <string>-Xmx1024m -XX:MaxPermSize=512m</string>
    </dict>
</dict>
</plist>

plist 位于 /Library/LaunchDaemons 中,而 tomcat.sh 只是一个启动 tomcat 然后等待进程终止的包装器。

【问题讨论】:

    标签: macos tomcat keychain launchd


    【解决方案1】:

    我自己也遇到过类似的问题 - 我正在使用

    解码 .mobileprovision 文件

    cmd -D -i &lt;path_to_file&gt;

    一切都在本地和 SSH 上运行,但从 Python 应用程序执行时抛出 security: cert import failed: write permissions error

    我发现this walkaround 似乎是同一个问题,他们最终创建了临时keychain 并在security 命令中使用它:

    cmd -D -k &lt;specific_keychain&gt; -i &lt;path_to_file&gt;

    我不能 100% 确定这是否是解决这个问题的正确方法,但它确实很有效。

    【讨论】:

      【解决方案2】:

      我刚刚实施了 Dariusz 的解决方法,它很有效。 在我寻求解决这个问题的过程中,我还在这里遇到了用户 joensson 的一个很好的答案:

      https://stackoverflow.com/a/9482707/1074558

      要点是将这些键添加到您的 plist 中。

      <key>SessionCreate</key>
      <true/>
      <key>UserName</key>
      <string>builduser</string>
      

      我看到你已经设置了UserName,所以它只是SessionCreate 键。

      【讨论】:

        【解决方案3】:

        我也遇到了这个问题,经过进一步检查,我在机器上使用哪个钥匙串与通过 ssh 运行以及通过我的应用程序运行之间似乎存在混淆。

        在尝试之前,运行security default-keychain 并检查您期望的钥匙串是否是正在使用的钥匙串。如果不是,您可以通过使用上面 Dariusz 的答案中的 -k 标志传递正确的标志。这也可能是钥匙串损坏的问题,因此您可以尝试重置或修复钥匙串。

        记住~/Library/KeychainsLibrary/Keychains 都有

        【讨论】:

          【解决方案4】:

          如果您的钥匙串具有配置管理功能(ansible/chef/etc.) 另一种解决方案是重置钥匙串/删除“损坏”的钥匙串并使用新的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-02
            • 2021-10-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多