如何使git接受自签名证书?


648

使用Git,有没有办法告诉它接受自签名证书?

我正在使用https服务器托管git服务器,但目前证书是自签名的。

当我第一次尝试在此处创建存储库时:

git push origin master -f

我得到错误:

error: Cannot access URL     
https://the server/git.aspx/PocketReferences/, return code 22

fatal: git-http-push failed

4
您怎么知道问题出在证书上?
2012年

1
相反,从PC上,另一个用户的Git工具使他们可以忽略证书,并且证书可以工作。从Mac上,我不知道该如何忽略。
伊恩·温克

我在git 2.1.1中遇到的错误:“致命:无法访问'https://.../project.git/':SSL证书问题:证书链中的自签名证书”
Stan Kurdziel 2014年

在OSX / macintosh上,git 似乎不会使用该sslcainfo选项。如果您可以成功地使用它curl --cacert来拉回购路径,但是git无法正常工作,则应该将证书添加到神秘的OSX Keychain程序中。更这里superuser.com/questions/605900/...
amwinter

Answers:


1166

永久接受特定证书

尝试http.sslCAPathhttp.sslCAInfo亚当·斯皮尔斯(Adam Spiers)的答案提供了一些很好的例子。这是最安全的解决方案。

为单个git命令禁用TLS / SSL验证

尝试使用适当的config变量传递-cgit,或使用Flow的答案

git -c http.sslVerify=false clone https://example.com/path/to/git

禁用特定存储库的SSL验证

如果存储库完全在您的控制之下,则可以尝试:

git config --global http.sslVerify false

中有很多SSL配置选项git。从手册页git config

http.sslVerify
    Whether to verify the SSL certificate when fetching or pushing over HTTPS.
    Can be overridden by the GIT_SSL_NO_VERIFY environment variable.

http.sslCAInfo
    File containing the certificates to verify the peer with when fetching or pushing
    over HTTPS. Can be overridden by the GIT_SSL_CAINFO environment variable.

http.sslCAPath
    Path containing files with the CA certificates to verify the peer with when
    fetching or pushing over HTTPS.
    Can be overridden by the GIT_SSL_CAPATH environment variable.

其他一些有用的SSL配置选项:

http.sslCert
    File containing the SSL certificate when fetching or pushing over HTTPS.
    Can be overridden by the GIT_SSL_CERT environment variable.

http.sslKey
    File containing the SSL private key when fetching or pushing over HTTPS.
    Can be overridden by the GIT_SSL_KEY environment variable.

http.sslCertPasswordProtected
    Enable git's password prompt for the SSL certificate. Otherwise OpenSSL will
    prompt the user, possibly many times, if the certificate or private key is encrypted.
    Can be overridden by the GIT_SSL_CERT_PASSWORD_PROTECTED environment variable.

40
技巧是'git config --global http.sslVerify false'。谢谢!
克里斯·斯托里

110
永远不应全局禁用TLS(/ SSL)证书验证
流动

4
@Flow-我完全同意。我已经编辑了这个答案(现在已经很旧了),以更有效地禁用TLS / SSL证书验证。
Christopher

8
对我来说,这git -c http.sslVerify=false clone https://domain.com/path/to/git解决了我的问题,谢谢...
Fernando Gomes

2
@Flow如果我们处于雇主为MITM的工作环境中,除了全局禁用TLS / SSL,还有什么替代方法?
Stevoisiak

164

您可以设置GIT_SSL_NO_VERIFYtrue

GIT_SSL_NO_VERIFY=true git clone https://example.com/path/to/git

或另选配置Git不在命令行上验证连接:

git -c http.sslVerify=false clone https://example.com/path/to/git

请注意,如果您不验证SSL / TLS证书,则容易受到MitM攻击


2
您也可以使用-c标记on git修改单个命令的配置值。我认为这种语法更简洁。
Christopher

1
啊,我对-cgit 不了解。我实际上认为这是更清洁的解决方案,而不是污染环境。:)
流程

1
@SkylarSaveland注意,git -c http.sslVerify=false <gitSubCommand>也可以通过中介进行工作。
流量

1
我应该指出,此解决方案使您容易受到中间人的攻击。
omikron

2
答案描述最不安全的选项
cp.engr

139

我不是现有答案的[编辑:原始版本]的忠实拥护者,因为禁用安全检查应该是不得已的方法,而不是第一个提供的解决方案。即使没有某些其他验证方法也无法信任首次签收的自签名证书,但使用证书进行后续git操作至少会大大降低仅下载证书后才发生的攻击的难度。换句话说,如果您下载的证书真实的,那么从那时起您就可以了。相反,如果你简单地禁用验证,那么你大开任何中间人攻击的任何点

举一个具体的例子:著名的repo.or.cz存储库提供了一个自签名证书。我可以下载该文件,将其放置在/etc/ssl/certs,然后执行以下操作:

# Initial clone
GIT_SSL_CAINFO=/etc/ssl/certs/rorcz_root_cert.pem \
    git clone https://repo.or.cz/org-mode.git

# Ensure all future interactions with origin remote also work
cd org-mode
git config http.sslCAInfo /etc/ssl/certs/rorcz_root_cert.pem

请注意,git config在此处使用local (即不使用--global)意味着仅对此特定存储库信任此自签名证书,这很好。它比使用更好,GIT_SSL_CAPATH因为它消除了git通过不同的证书颁发机构进行验证的风险,这可能会受到威胁。


3
巧合的是,http.sslCAPath使用libcurl的ssl_capath逻辑。我认为您实际上可以在/etc/ssl/certs/目录中存储任意数量的证书,并且可以有效地整理出所需的所有内容。请注意,我尚未对此进行测试,但是它可能允许您将a --global与大量证书一起使用。但是值得测试。
Christopher

6
考虑完全禁用SSL验证的风险,而事实上的问题是“我怎样才能使git的接受一个自签名的证书吗?”,这应该是公认的答案。
PLNech

5
在理想的世界中,可能会发生以下情况git config http.validCertFingerprint <base64-encoded-hash-of-certifcate>
流程

1
Internet上唯一适用于我的情况的答案。那是私有的Composer VCS库,由SSL托管在自托管的Gitlab上,这在git版本化的项目中需要。
Dejv 2016年

1
来自新鲜的克隆;这可以在一行中完成:(git clone --config http.sslCAInfo=<path_to_cert> https://repo.or.cz/org-mode.git无需在之后调用“ git config”命令)。
亚伦

39

Git自签名证书配置

tl; dr

切勿禁用所有SSL验证!

这造成了不良的安全文化。不要做那个人。

您需要的配置键是:

这些用于配置您信任的主机证书

这些用于配置您的证书以响应SSL挑战。

将上述设置有选择地应用于特定主机。

全球.gitconfig自签名证书颁发机构

就我自己和我的同事而言,这就是我们如何在不禁用的情况下设法使自签名证书起作用sslVerify编辑您.gitconfig的使用git config --global -e添加以下内容:

# Specify the scheme and host as a 'context' that only these settings apply
# Must use Git v1.8.5+ for these contexts to work
[credential "https://your.domain.com"]
  username = user.name

  # Uncomment the credential helper that applies to your platform
  # Windows
  # helper = manager

  # OSX
  # helper = osxkeychain

  # Linux (in-memory credential helper)
  # helper = cache

  # Linux (permanent storage credential helper)
  # https://askubuntu.com/a/776335/491772

# Specify the scheme and host as a 'context' that only these settings apply 
# Must use Git v1.8.5+ for these contexts to work
[http "https://your.domain.com"]
  ##################################
  # Self Signed Server Certificate #
  ##################################

  # MUST be PEM format
  # Some situations require both the CAPath AND CAInfo 
  sslCAInfo = /path/to/selfCA/self-signed-certificate.crt
  sslCAPath = /path/to/selfCA/
  sslVerify = true

  ###########################################
  # Private Key and Certificate information #
  ###########################################

  # Must be PEM format and include BEGIN CERTIFICATE / END CERTIFICATE, 
  # not just the BEGIN PRIVATE KEY / END PRIVATE KEY for Git to recognise it.
  sslCert = /path/to/privatekey/myprivatecert.pem

  # Even if your PEM file is password protected, set this to false.
  # Setting this to true always asks for a password even if you don't have one.
  # When you do have a password, even with this set to false it will prompt anyhow. 
  sslCertPasswordProtected = 0

参考文献:

git clone-ing 时指定配置

如果您需要在每个存储库中应用它,则文档会告诉您仅git config --local在您的存储库目录中运行。那么,当您尚未在本地克隆回购协议时,这没有用吗?

您可以global -> local通过如上所述设置全局配置来执行hokey-pokey,然后在克隆后将这些设置复制到本地存储库配置中...

或者,您可以做的是git clone克隆后将指定的配置命令应用于目标存储库。

# Declare variables to make clone command less verbose     
OUR_CA_PATH=/path/to/selfCA/
OUR_CA_FILE=$OUR_CA_PATH/self-signed-certificate.crt
MY_PEM_FILE=/path/to/privatekey/myprivatecert.pem
SELF_SIGN_CONFIG="-c http.sslCAPath=$OUR_CA_PATH -c http.sslCAInfo=$OUR_CA_FILE -c http.sslVerify=1 -c http.sslCert=$MY_PEM_FILE -c http.sslCertPasswordProtected=0"

# With this environment variable defined it makes subsequent clones easier if you need to pull down multiple repos.
git clone $SELF_SIGN_CONFIG https://mygit.server.com/projects/myproject.git myproject/

一线

编辑:请参阅VonC答案,该警告指出了有关从2.14.x / 2.15到此衬板的特定git版本的绝对和相对路径的警告

git clone -c http.sslCAPath="/path/to/selfCA" -c http.sslCAInfo="/path/to/selfCA/self-signed-certificate.crt" -c http.sslVerify=1 -c http.sslCert="/path/to/privatekey/myprivatecert.pem" -c http.sslCertPasswordProtected=0 https://mygit.server.com/projects/myproject.git myproject/

CentOS的 unable to load client key

如果您在CentOS上尝试此操作,并且.pem文件正在为您提供

unable to load client key: "-8178 (SEC_ERROR_BAD_KEY)"

然后,您将需要有关如何使用NSS而不是Open SSL的StackOverflow答案curl

而且您想从源代码重建curl

git clone http://github.com/curl/curl.git curl/
cd curl/
# Need these for ./buildconf
yum install autoconf automake libtool m4 nroff perl -y
#Need these for ./configure
yum install openssl-devel openldap-devel libssh2-devel -y

./buildconf
su # Switch to super user to install into /usr/bin/curl
./configure --with-openssl --with-ldap --with-libssh2 --prefix=/usr/
make
make install

因为libcurl仍作为共享库在内存中,所以重新启动计算机

Python,pip和conda

相关如何将自定义CA Root证书添加到Windows中pip使用的CA Store?


在Git接受之前,我必须确保自签名服务器证书为PEM格式。另外,上述某些答案表明,只需使用即可提供证书文件夹的路径http.sslCAPath。就我而言,我不得不使用它http.sslCAInfo来指定特定文件。这样做允许Git在不禁用SSL验证的情况下连接到我们的私有GitHub。
Zarepheth

@Zarepheth感谢您提供的信息。我遇到了同时需要CAPath和CAInfo的同一问题。由于我们的CA Cert是PEM格式,因此我忽略了对其进行记录。我用这些补充内容更新了答案。很高兴您能够安全地建立连接。
乔什·匹克

如果您被迫使用HTTPS进行克隆并且不能仅使用SSH绕过证书混乱,那么这可能是最佳的长期“修复”答案。
dragon788

我正要添加这个答案!很高兴其他人已经发现了它。
富兰克林·于

14

我一直遇到这个问题,因此编写了脚本来从服务器下载自签名证书并将其安装到〜/ .gitcerts,然后更新git-config指向这些证书。它存储在全局配置中,因此每个远程只需要运行一次。

https://github.com/iwonbigbro/tools/blob/master/bin/git-remote-install-cert.sh


很好,尽管选择使用本地配置而不是全局配置会更好。
亚当·斯皮尔斯

3
您可以随时将其分叉并删除--global选项;-)
Craig

这很棒,是分批进行的吗?
Halter'Apr

10

此答案摘自Michael Kauffman撰写的这篇文章

将Git for Windows与公司SSL证书一起使用

问题

如果您拥有公司SSL证书,并且想要从控制台或VSCode克隆存储库,则会出现以下错误:

致命:无法访问“ https:// myserver / tfs / DefaultCollection / _git / Proj / ”:SSL证书问题:无法获取本地发行者证书

解决方案

  1. 将根自签名证书导出到文件中。您可以在浏览器中执行此操作。

  2. 在您的git文件夹中找到“ ca-bundle.crt”文件(当前版本为C:\ Program Files \ Git \ usr \ ssl \ certs,但过去已更改)。将文件复制到您的用户配置文件。使用诸如VSCode的文本编辑器将其打开,然后将导出的证书的内容添加到文件末尾。

现在我们必须配置git以使用新文件:

git config --global http.sslCAInfo C:/Users/<yourname>/ca-bundle.crt

这会将以下条目添加到用户配置文件根目录中的.gitconfig文件中。

[http] sslCAInfo = C:/Users/<yourname>/ca-bundle.crt


1
谢谢,我发现此答案对于Windows而言更简单,更安全。
Pisu

7

禁用特定存储库的SSL验证如果存储库完全在您的控制之下,则可以尝试:

 git config --global http.sslVerify false

3

当使用sslKey或sslCert使用一根衬垫时,请小心,如Josh Peak回答

git clone -c http.sslCAPath="/path/to/selfCA" \
  -c http.sslCAInfo="/path/to/selfCA/self-signed-certificate.crt" \
  -c http.sslVerify=1 \
  -c http.sslCert="/path/to/privatekey/myprivatecert.pem" \
  -c http.sslCertPasswordProtected=0 \
https://mygit.server.com/projects/myproject.git myproject

只有Git 2.14.x / 2.15(2015年第3季度)才能~username/mykey正确解释路径(尽管它仍然可以解释绝对路径/path/to/privatekey)。

参见Junio C Hamano()提交8d15496(2017年7月20日。 帮助:Charles Bailey((由Junio C Hamano合并--commit 17b1e1d中,2017年8月11日)gitster
hashpling
gitster

http.chttp.sslcerthttp.sslkey都是路径名

回到当现代http_options()代码路径的建立是为了解析各种HTTP。*在选项29508e1(“分离物共享HTTP请求的功能”,2005-11-18,GIT中0.99.9k),然后后来被用于所述多个之间互为作用校正在配置文件中7059cd9 (“ http_init():修复配置文件解析”,2009-03-09,Git的1.6.3-RC0),我们解析配置变量一样http.sslkeyhttp.sslcert作为普通的香草字符串,因为git_config_pathname()能够理解‘ ~[username]/’前缀是不存在的。

后来,我们将其中的一些(即http.sslCAPathhttp.sslCAInfo)转换为使用该函数,并http.cookeyFile http.pinnedpubkey从一开始就添加了一些变量以使用该函数。因此,这些变量都理解“ ~[username]/”前缀。

使其余两个变量http.sslcert和和http.sslkey也了解约定,因为它们都是文件的明确路径名。


3

在Windows上使用64位版本的Git,只需将自签名的CA证书添加到以下文件中:

  • C:\ Program Files \ Git \ mingw64 \ ssl \ certs \ ca-bundle.crt
  • C:\ Program Files \ Git \ mingw64 \ ssl \ certs \ ca-bundle.trust.crt

如果只是服务器自签名证书,请将其添加到

  • C:\ Program Files \ Git \ mingw64 \ ssl \ cert.pem

这是处理重新签名所有HTTPS流量的公司防火墙的最佳方法。我只是将防火墙证书的PEM格式的crt文件作为文本,并将其复制粘贴到ca-bundle上,它的工作原理就像一个魅力。
Mitten.O

3

检查您的防病毒和防火墙设置。

从一天到另一天,git不再起作用。通过上述操作,我发现卡巴斯基将自签名的防病毒个人根证书放在中间。我没有按照上面的说明让Git接受该证书。我放弃了。对我有用的是禁用该功能以扫描加密的连接。

  1. 打开卡巴斯基
  2. 设置>其他>网络>不扫描加密的连接

之后,git再次启用sslVerify即可工作。

注意。这仍然令我不满意,因为我想启用我的防病毒功能。在高级设置中,卡巴斯基显示了无法使用该功能的网站列表。Github没有被列为其中之一。我将在卡巴斯基论坛上进行检查。似乎有一些主题,例如 https://forum.kaspersky.com/index.php?/topic/395220-kis-interfering-with-git/&tab=comments#comment-2801211



1

我这样做是这样的:

git init
git config --global http.sslVerify false
git clone https://myurl/myrepo.git

3
不要使用--global!很多教程都显示了,--global但是总的来说,这是一个非常糟糕的主意http.sslVerify。一旦您从计算机上的多个项目,公司,团队中克隆出一个以上的副本,您很快就会遇到麻烦。例如,从一个项目泄漏到另一个项目的用户ID和电子邮件可能会很尴尬。使用--globalon http.sslVerify可以解决各种安全问题。因此:请勿使用--global-除非您完全意识到副作用并准备冒险。
马丁

1

在Windows上,这对我有用:

将自签名证书的内容添加到ca-bundle文件的末尾。包括----- BEGIN证书---------- END证书-----

该位置CA-包文件通常是C:\ Program Files文件\的Git \ mingw64 \ SSL \证书

然后,将ca-bundle文件的路径添加到全局git config中。以下命令可以解决问题:git config --global http.sslCAInfo "C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt"

注意:路径取决于ca-bundle文件的本地路径!


1

将http.sslVerify设置为false不是一个好习惯。相反,我们可以使用SSL证书。

因此,构建代理将使用带有SSL证书和PAT的https进行身份验证。 在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

复制cer文件的内容,包括–begin–和–end--。

生成代理上的git bash => git config –global http.sslcainfo“ C:/ Program Files / Git / mingw64 / ssl / certs / ca-bundle.crt”转至该文件并附加.cer内容。

因此,构建代理可以访问SSL证书


0

我的答案可能晚了,但对我有用。它可能会帮助别人。

我尝试了上述步骤,但并没有解决问题。

尝试这个git config --global http.sslVerify false


0

我使用Windows机器,这篇文章对我有所帮助。基本上,我在记事本中打开ca-bundle.crt并在其中添加了链证书(所有证书)。这个问题通常发生在公司网络中,我们的中间人位于系统和git repo之间。我们需要导出证书链中的所有证书,除了以base 64格式的叶子证书,然后将所有证书添加到ca-bundle.crt中,然后为此修改后的crt文件配置git。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.