macOS Git客户端可以使用存储在用户钥匙串中的证书吗?

时间:2018-04-26 12:02:53

标签: git macos curl certificate libcurl

我们的Git服务器正在被更改为在Git客户端访问时需要证书/私钥。

我们的Windows用户被指示在本地导入证书,然后配置Git以使用支持SSL的schannel,如

git config --global http.sslBackend schannel

这显然不适用于macOS用户。有没有办法在macOS上用Git客户端做类似的事情?

我发现我可以指向我的Git配置中的证书和私钥,如果a)它们在单独的文件中,并且b)是.pem格式,如下所示:

git config --global http.sslCert /Users/.../cert.pem
git config --global http.sslKey /Users/.../key.pem
git config --global http.sslCertPasswordProtected true

执行此操作后,每当我尝试推/拉时,Git客户端都会询问私钥的密码,如下所示:

$ git pull
Password for 'cert:////Users/.../cert.pem': *********
Already up to date.

有没有办法告诉Git客户端(或底层的curl客户端)使用macOS Keychain来检索证书,密钥以及密钥的密码?

我知道较新版本的curl支持-E/--cert参数来使用密钥链,但我不确定是否可以通过Git客户端使用。

2 个答案:

答案 0 :(得分:1)

我设法使用Homebrew提供的Git和cURL版本找到了为macOS执行此操作的方法:

  • 如果您尚未完成此操作,请安装Homebrew for macOS
  • 使用Homebrew安装cURL和Git:

    brew install curl
    brew install --with-curl git
    

    --with-curl选项很重要,因为它会强制Git使用cURL的Homebrew版本,其中包括对macOS Keychain的必需支持 - 通过cURL的-E/--cert参数。

    自制的cURL版本支持使用-E/--cert参数提供的名称/别名在用户的钥匙串中查找证书,而cURL的stock macOS版本则不支持。

    有必要安装Git并支持自制的cURL版本,因为如果没有另外说明的话,它只会使用macOS中的那个。

    如果您已经通过Homebrew安装了Git,则必须使用--with-curl选项重新安装它:

    brew reinstall --with-curl git
    

更新使用a recent change in the Homebrew Git formula,删除了--with-curl选项。如果您仍想使用它,可以执行以下操作来安装特定版本的Git - 这是在删除选项之前。要安装此特定版本的Git公式,请使用以下方法(基于these instructions) - 您可能必须先删除现有的Git安装,但是:

# Install curl
brew install curl

# Install the last version of the Git formula that still has the --with-curl option
brew install --with-curl https://raw.githubusercontent.com/Homebrew/homebrew-core/a86ae8fc2b24001b3c6460a46dbfc6e323d2a4d1/Formula/git.rb

# Pin Git in Homebrew so that it does not get updated automatically
brew pin git
  • 将证书导入用户的登录密钥链(双击证书文件,例如,如果它是.pfx格式)。检查用户的登录密钥链中是否存在证书(以及私钥 - 它们可能位于不同的条目中)并记下证书的名称。我们假设它被称为git.example.com

  • 配置Git以引用钥匙串中的证书条目。不要将其指向本地文件,而是提供存储在钥匙串中的证书名称。自制的cURL版本支持:

    git config --global http.sslCert git.example.com
    

    如果您只想将证书用于特定服务器,可以使用以下语法将设置限制为该特定URL:

    git config --global http."https://git.example.com".sslCert git.example.com
    

完成上述步骤后,无论何时使用git.example.com服务器运行Git命令,Git / cURL都应尝试从您的Keychain获取证书。

首次访问时,它可能会显示一个窗口,要求您解锁登录密钥链。提供该钥匙串的密码,并确保单击始终允许按钮。之后,进一步的Git命令不应要求您再次提供密码短语或密钥链密码。

Git credential dialog

您也可以直接修改.gitconfig文件,例如通过添加以下内容来使用特定URL的证书:

[http "https://git.example.com"]                                                                                                                                   
    sslCert = git.example.com

答案 1 :(得分:0)

您还可以尝试使用以下方法将p12文件分为$( "#Status" ).load( "status.php #PartId" ); key组件:

cert

如果运行这些命令,系统将提示您输入密码(两次-每个命令一次)。现在openssl pkcs12 -in /Users/bob/Documents/Certificate-2311d3.p12 -out /Users/bob/Documents/2311d3.key.pem -nocerts -nodes openssl pkcs12 -in /Users/bob/Documents/Certificate-2311d3.p12 -out /Users/bob/Documents/2311d3.crt.pem -clcerts -nokeys key不再受密码保护。

注意:生成的密钥和证书文件不应离开本地(希望已加密)文件系统。现在,它们是“不受保护的”,任何可以访问它们的人都可以访问您的远程服务器-与常规ssh密钥相同。 p12文件格式被设计为便携式容器,只要受密码保护,您就可以在Internet上发送此文件,但是在我认为有需要的地方,将其解压缩到不受保护的组件中就可以了。

然后,您可以使用与尝试过的命令类似的命令克隆远程仓库,例如:

cert

然后您将不会在每次与远程仓库交互时被要求输入密码,而git也不必与osx钥匙串进行交互。

还有许多其他http设置可能适用于您的特定情况,我真的建议您仔细阅读official git config http documentation,它确实对我有帮助(就像您的帖子一样!)。