ChatGPT解决这个技术问题 Extra ChatGPT

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

使用 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
在 OSX/macintosh 上,似乎 git 不会使用 sslcainfo 选项。如果您可以成功使用 curl --cacert 拉出您的 repo 路径但 git 无法正常工作,您应该将证书添加到神秘的 OSX Keychain 程序中。更多在这里superuser.com/questions/605900/…
我觉得这个文档很有用gist.github.com/evantoli/f8c23a37eb3558ab8765
f15ijp.com/2012/08/… 我发现的最佳解决方案之一
另一种解决方案是使用 git 协议(通过 ssh)而不是 https
我遇到了同样的问题 - 但是当我登录到不同的 github 帐户(通过我在工作笔记本电脑上授权的工作电子邮件)时 - 然后我可以推送到远程 git 而没有任何 SSL 相关问题

J
Josiah

永久接受特定证书

试试 http.sslCAPathhttp.sslCAInfoAdam Spiers's answer 给出了一些很好的例子。这是该问题的最安全的解决方案。

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

尝试使用正确的配置变量将 -c 传递给 git,或使用 Flow's answer

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.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.

您永远不应全局禁用 TLS(/SSL) 证书验证。
@Flow——我完全同意。我已经编辑了这个(现在很老的)答案,以便对禁用 TLS/SSL 证书验证更具争议性。
@Flow 如果我们在 employer is the MITM 的工作环境中,除了全局禁用 TLS/SSL 之外,还有什么替代方法?
正如 Steven Vascellaro 所指出的那样:如果公司网络的唯一出路是公司代理,那么必须处理的证书就是公司的证书,并且为了防止中间人攻击,需要处理该代理。所以在那种情况下 git config --global http.sslVerify false 不是安全问题。
为什么不对受影响的 Git 项目使用 git config --local http.sslVerify false
M
Maarten Bodewes

您可以将 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 证书,那么您很容易受到中间人攻击。


@SkylarSaveland 请注意,git -c http.sslVerify=false <gitSubCommand> 也可以通过中介工作。
这:git config http.sslVerify false,为我工作..谢谢
答案仅描述了最不安全的选项。
A
Adam Spiers

我不是 [EDIT: original versions of the] 现有答案的忠实粉丝,因为禁用安全检查应该是最后的手段,而不是提供的第一个解决方案。即使您在第一次收到时无法信任自签名证书,如果没有一些额外的验证方法,使用该证书进行后续的 git 操作至少会使仅在您拥有之后发生的攻击变得更加困难下载了证书。换句话说,如果您下载的证书正版,那么从那时起您就很好了。相反,如果您只是禁用验证,那么您很容易受到任何类型的中间人攻击在任何时候

举一个具体的例子:著名的 repo.or.cz 存储库提供 a self-signed certificate。我可以下载该文件,将其放在 /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(即不使用 --global)意味着此自签名证书仅受此特定存储库的信任,这很好。它也比使用 GIT_SSL_CAPATH 更好,因为它消除了 git 通过可能受到损害的不同证书颁发机构进行验证的风险。


巧合的是,http.sslCAPath 使用了 libcurl 的 ssl_capath 逻辑。我认为您实际上可以在 /etc/ssl/certs/ 目录中存储任意数量的证书,它会有效地整理出您需要的所有内容。请注意,我尚未对此进行测试,但它可能允许您使用带有大量证书的 --global。然而,值得测试。
考虑到完全禁用 SSL 验证的风险,以及问题是“我怎样才能让 git 接受自签名证书?”,这应该是公认的答案。
在理想的世界中,会有类似 git config http.validCertFingerprint <base64-encoded-hash-of-certifcate>
@AdamSpiers:所以 repo.or.cz 提供了一个自签名证书,但是 GitHub 呢?
来自一个新鲜的克隆;这可以在一行中完成:git clone --config http.sslCAInfo=<path_to_cert> https://repo.or.cz/org-mode.git(之后无需调用“git config”命令)。
J
Josh Peak

Git 自签名证书配置

tl;博士

永远不要禁用所有 SSL 验证!这会造成不良的安全文化。不要成为那个人。

您所追求的配置键是:

http.sslverify - 始终正确。见上注。

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

http.sslCAPath

http.sslCAInfo

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

http.sslCert

http.sslCertPasswordProtected

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

http..*

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

为了我自己和我的同事的缘故,我们如何设法在不禁用 sslVerify 的情况下使自签名证书正常工作。 Edit your .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 凭证

Git 凭证存储

使用 Gnome Keyring 作为凭证存储

Git 配置 http..* 从 Git v1.8.5 开始支持

git clone-ing 时指定配置

如果您需要基于每个 repo 应用它,文档会告诉您只需在 repo 目录中运行 git config --local。好吧,当您还没有在本地克隆 repo 时,这没有用,是吗?

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

或者您可以做的是 specify config commands at 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/

一个班轮

编辑:请参阅 VonCanswer,其中指出了从 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 无法加载客户端密钥

如果你在 CentOS 上尝试这个并且你的 .pem 文件给你

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

然后,您需要this StackOverflow answer了解 curl 如何使用 NSS 而不是 Open SSL。

您会想要rebuild curl from source

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

相关How to add a custom CA Root certificate to the CA Store used by pip in Windows?


在 Git 接受之前,我必须确保自签名服务器证书采用 PEM 格式。此外,上面的一些答案表明只需要使用 http.sslCAPath 提供证书文件夹的路径。就我而言,我必须使用 http.sslCAInfo 来指定特定文件。这样做允许 Git 在不禁用 SSL 验证的情况下连接到我们的私有 GitHub。
@Zarepheth 感谢您提供这些信息。我遇到了需要 CAPath 和 CAInfo 的相同问题。由于我们的 CA 证书是 PEM 格式,我忽略了记录它。我已经用这些添加更新了答案。很高兴您能够安全地连接。
如果您被迫使用 HTTPS 克隆并且不能仅使用 SSH 绕过证书混乱,这可能是最好的长期“修复”答案。
我正要添加这个答案!很高兴其他人已经发现了它。
A
AperioOculus

此答案摘自 Michael Kauffman 撰写的 this article

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

问题:

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

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

解决方案:

将根自签名证书导出到文件。您可以在浏览器中执行此操作。在您的 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


谢谢,我发现这个答案对 Windows 来说更容易、更安全。
如何将证书从浏览器导出到文件:medium.com/@menakajain/…
这个答案对我很有帮助,尤其是当您在公司的企业网络中工作时。
P
Palash Roy

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

https://i.stack.imgur.com/UwOFc.png

https://i.stack.imgur.com/L9cpG.png

https://i.stack.imgur.com/CBmPV.png

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

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

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


它是否需要任何系统重启,我附加了它,它仍然显示与 git bash 中的 OP 中给出的相同的错误
请尝试重新启动构建代理一次。
C
Craig

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

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


很好,尽管可以选择使用本地配置而不是全局配置会更好。
你总是可以分叉它并删除 --global 选项;-)
这个不错,是分批来的吗?
F
Flaviu

在 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 中,它就像一个魅力。
跟着这个,但仍然是同样的错误
V
VonC

当您使用一个使用 sslKey 或 sslCert 的衬垫时要小心,如 Josh Peakanswer

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 这样的绝对路径)。

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

http.c:http.sslcert 和 http.sslkey 都是路径名 回到创建现代 http_options() 代码路径以解析 29508e1 处的各种 http.* 选项(“隔离共享 HTTP 请求功能”,2005-11-18,Git 0.99 .9k),然后在 7059cd9 ("http_init(): Fix config file parsing", 2009-03-09, Git 1.6.3-rc0) 中对多个配置文件之间的交互进行了更正,我们解析了 http 等配置变量.sslkey、http.sslcert 是普通的普通字符串,因为不存在理解“~[username]/”前缀的 git_config_pathname()。后来,我们将其中的一些(即http.sslCAPath和http.sslCAInfo)转换为使用该函数,并从一开始就添加了http.cookeyFile http.pinnedpubkey等变量来使用该函数。因此,这些变量都理解“~[username]/”前缀。让剩下的两个变量 http.sslcert 和 http.sslkey 也知道约定,因为它们显然都是文件的路径名。


H
Henk

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

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

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

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

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


w
wero026

在 Windows 上,这对我有用:

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

ca-bundle 文件的位置通常是 C:\Program Files\Git\mingw64\ssl\certs

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

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


a
adamc

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

$ cd /path/to/ssl/cert/directory

$ ls -al

  total 16
  drwxr-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 16
  drwxr-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/

l
love gupta

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


链接的文章为我解决了这个问题,谢谢。
R
RahulMohan Kolakandy

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

sslCAInfo = /home/XXXX/abc.crt


这相当于 Adam's answer 中的第二步
M
Manjuboyz

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

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

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


使用 --global 禁用 sslVerify 是一个非常糟糕的主意。此链接可以帮助解释解决此问题的更好方法以及为什么不应该使用 --global。 mattferderer.com/…
T
Tadej

我这样做:

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

不要使用 --global !很多教程都显示了 --global,但总的来说这是一个非常糟糕的主意,尤其是对于 http.sslVerify。一旦您在计算机上拥有多个来自不同项目、公司、团队的克隆,您很快就会遇到麻烦。例如,从一个项目泄漏到下一个项目的用户 ID 和电子邮件可能会非常尴尬。并且在 http.sslVerify 上使用 --global 会使您面临各种安全问题。所以:不要使用 --global — 除非您完全了解副作用并准备承担风险。
A
Atchutha rama reddy Karri

它对我有用,只需运行以下命令

git config --global http.sslVerify false

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


这个答案已经发布了多次。