我们的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客户端使用。
答案 0 :(得分:1)
我设法使用Homebrew提供的Git和cURL版本找到了为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命令不应要求您再次提供密码短语或密钥链密码。
您也可以直接修改.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,它确实对我有帮助(就像您的帖子一样!)。