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

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

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

当我第一次尝试在那里创建repo时:

git push origin master -f

我得到错误:

error: Cannot access URLhttps://the server/git.aspx/PocketReferences/, return code 22
fatal: git-http-push failed
1365892 次浏览

永久接受特定证书

尝试http.sslCAPathhttp.sslCAInfoAdam Spiers的回答给出了一些很好的例子。这是这个问题最安全的解决方案。

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

尝试使用正确的配置变量将-c传递给git,或者使用Flow的答案

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

禁用所有存储库的SSL验证

可以全局停用ssl验证。它是强烈建议不要这样做,但为了完整性而提到它:

git config --global http.sslVerify false # Do NOT do this!

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

http.sslVerifyWhether to verify the SSL certificate when fetching or pushing over HTTPS.Can be overridden by the GIT_SSL_NO_VERIFY environment variable.
http.sslCAInfoFile containing the certificates to verify the peer with when fetching or pushingover HTTPS. Can be overridden by the GIT_SSL_CAINFO environment variable.
http.sslCAPathPath containing files with the CA certificates to verify the peer with whenfetching or pushing over HTTPS.Can be overridden by the GIT_SSL_CAPATH environment variable.

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

http.sslCertFile containing the SSL certificate when fetching or pushing over HTTPS.Can be overridden by the GIT_SSL_CERT environment variable.
http.sslKeyFile containing the SSL private key when fetching or pushing over HTTPS.Can be overridden by the GIT_SSL_KEY environment variable.
http.sslCertPasswordProtectedEnable git's password prompt for the SSL certificate. Otherwise OpenSSL willprompt 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.

您可以将GIT_SSL_NO_VERIFY设置为true

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攻击

我不是第一个现有答案的超级粉丝,因为禁用安全检查应该是最后的手段,而不是提供的第一个解决方案。即使你不能在没有额外验证方法的情况下信任第一次收到的自签名证书,但在随后的git操作中使用证书至少会让只发生之后你下载了证书的攻击变得更加困难。换句话说,如果你下载的证书是真实的,那么从那时起你就很好了。相比之下,如果你简单地禁用验证,那么你很容易受到任何类型的中间人攻击在任何时候

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

# Initial cloneGIT_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 workcd org-modegit config http.sslCAInfo /etc/ssl/certs/rorcz_root_cert.pem

请注意,在此处使用本地git config(即没有--global)意味着此自签名证书仅受此特定存储库的信任,这很好。它也比使用GIT_SSL_CAPATH更好,因为它消除了git通过可能受到损害的不同证书授权中心进行验证的风险。

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

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

Git自签名证书配置

tl; dr

永远不要禁用所有SSL验证!

这会造成不良的安全文化。不要成为那个人。

您需要的配置密钥是:

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

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

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

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

为了我自己和我的同事,这里是我们如何设法让自签名证书在不禁用sslVerify的情况下工作的。编辑你的#1使用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 CAInfosslCAInfo = /path/to/selfCA/self-signed-certificate.crtsslCAPath = /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,然后将这些设置复制到您的本地存储库配置,一旦它克隆…

或者你可以做的是在#0处指定配置命令,一旦它被克隆就应用于目标存储库。

# Declare variables to make clone command less verboseOUR_CA_PATH=/path/to/selfCA/OUR_CA_FILE=$OUR_CA_PATH/self-signed-certificate.crtMY_PEM_FILE=/path/to/privatekey/myprivatecert.pemSELF_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/

One Liner

编辑:请参阅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/

CentOSunable to load client key

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

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

然后你会想要这个StackOverflow答案关于curl如何使用NSS而不是Open SSL。

你会喜欢想要从源代码重建#0

git clone http://github.com/curl/curl.git curl/cd curl/# Need these for ./buildconfyum install autoconf automake libtool m4 nroff perl -y#Need these for ./configureyum install openssl-devel openldap-devel libssh2-devel -y
./buildconfsu # Switch to super user to install into /usr/bin/curl./configure --with-openssl --with-ldap --with-libssh2 --prefix=/usr/makemake install

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

python、pip和conda

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

使用sslKey或sslCert使用一个衬垫时要小心,如乔什·皮克回答

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年第三季度)能够正确解释像~username/mykey这样的路径(同时它仍然可以解释像/path/to/privatekey这样的绝对路径)。

提交8d15496(2017年7月20日)byJunio C Hamano(#0)
帮助:查尔斯·贝利(#0).
(合并于提交17b1e1d中的Junio C Hamano----#0----,2017年8月11日)

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

回到创建现代http_options()代码路径以解析的时候各种超文本传输协议.*选项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.cookeyFilehttp.pinnedpubkey等变量以从一开始就使用该函数。正因为如此,这些变量都理解“~[username]/”前缀。

将剩下的两个变量http.sslcerthttp.sslkey也设置为意识到公约,因为它们都是明显的路径名文件。

. gitconfig文件中,您可以添加以下给定值以使自签名证书可接受

sslCAInfo= /home/XXXX/abc.crt

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

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

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

  • C:\Program Files\Git\ming w64\ssl\cert.pem

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

将Git for Windows与企业SSL证书一起使用

问题

如果您有公司SSL证书并想从控制台或VSCode克隆您的存储库,您会收到以下错误:

致命的:无法访问'https://myserver/tfs/DefaultCollection/_git/Proj/

解决方案

  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文件中。

[超文本传输协议]sslCAInfo=C:/用户/<你的名字>/ca-bundle.crt

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

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

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

之后,git在启用sslVerify的情况下再次工作。

注意。这对我来说仍然不满意,因为我想激活我的反病毒功能。在高级设置中,卡巴斯基显示了一个无法使用该功能的网站列表。Github没有被列为其中之一。我会在卡巴斯基论坛上查看它。似乎有一些主题,例如:https://forum.kaspersky.com/index.php?/topic/395220-kis-interfering-with-git/&; tab=评论#评论-2801211

我是这样做的:

git initgit config --global http.sslVerify falsegit clone https://myurl/myrepo.git

我的回答可能会迟到,但它对我有用。它可能会帮助某人。

我尝试了上面提到的步骤,但没有解决问题。

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

在Windows上,这对我很有用:

将自签名证书的内容添加到CA-丛文件的末尾。包括-----开始认证----------结束证书-----

CA-丛文件的位置通常是C:\Program Files\Git\ming w64\ssl\certs

然后,将CA-丛文件的路径添加到全局git配置中。以下命令完成了任务:git config --global http.sslCAInfo "C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt"

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

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

设置http.sslVerify false不是一个好的做法。我们可以使用SSL证书。

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

在此处输入图片描述

在此处输入图片描述

复制cer文件的内容,包括-开始-和-结束--。

构建代理上的git bash=>git config-globalhttp.sslcainfo"C:/Program Files/Git/ming w64/ssl/certs/ca-bundle.crt"转到此文件并附加. ser内容。

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

它适用于我只需运行以下命令

git config --global http.sslVerify false

它将打开一个git凭据窗口,提供您的凭据。第一次只问

关于http.sslCAPath选项的说明:如果OpenSSLc_rehash命令已在包含证书文件的目录上运行,则git只会检测给定目录路径中的证书文件。c_rehash命令将为每个证书创建符号链接,其中链接的名称是哈希值。例如:

$ cd /path/to/ssl/cert/directory
$ ls -al
total 16drwxr-xr-x  3 user  staff    96 Oct 20 13:47 .drwxr-xr-x  4 user  staff   128 Oct 20 13:46 ..-rw-r--r--  1 user  staff  4832 Oct 20 13:47 google.pem
$ /usr/local/opt/openssl@1.1/bin/c_rehash ./
Doing ./
$ ls -al
total 16drwxr-xr-x  4 user  staff   128 Oct 20 13:58 .drwxr-xr-x  4 user  staff   128 Oct 20 13:46 ..lrwxr-xr-x  1 user  staff    10 Oct 20 13:58 f6dbf7a7.0 -> google.pem-rw-r--r--  1 user  staff  4832 Oct 20 13:47 google.pem

请注意,c_rehash命令创建了以下符号链接:f6dbf7a7.0 -> google.pem

您还可以将以下命令替换为c_rehash实用程序,但请注意,以下命令将仅处理*.pem文件,而c_rehash实用程序将处理.pem, .crt, .cer, or .crl文件:

for file in *.pem; do ln -s $file `openssl x509 -hash -noout -in $file`.0; done

如果您现在将http.sslCAPath配置到包含上述符号链接的目录,git将获取证书文件:

# contents of /etc/gitconfig[http]sslCAPath = /path/to/ssl/cert/directory/

您还可以使用环境变量配置http.sslCAPath

export GIT_SSL_CAPATH=/path/to/ssl/cert/directory/

您可以像这样添加自签名证书,然后再推送…

git config --global http.sslCAInfo "C:\Program Files\Git\usr\ssl\cert.pem"