使用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
使用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
尝试使用http.sslCAPath
或http.sslCAInfo
。请参考Adam Spiers的回答,其中有一些非常好的示例。这是该问题最安全的解决方案。
尝试向git
传递-c
与正确的配置变量,或者使用Flow的回答:
git -c http.sslVerify=false clone https://example.com/path/to/git
可以全局停用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.
git config --local http.sslVerify false
呢? - DatzGIT_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
git -c http.sslVerify=false <gitSubCommand>
也可以通过中间人的方式工作。 - Flowgit config http.sslVerify false
,对我很有效。谢谢。 - Fernando Nogueira我不是特别喜欢现有答案的[编辑:原始版本],因为禁用安全检查应该是最后的手段,而不是首选解决方案。虽然你不能在第一次接收自签名证书时信任它而不进行其他验证方法,但至少在随后的 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
(即没有--global
)意味着这个自签名证书仅在此特定存储库中受信任,这很好。这比使用GIT_SSL_CAPATH
更好,因为它消除了通过不同的证书颁发机构验证可能会被攻击的风险。/etc/ssl/certs/
目录中存储任意数量的证书,并且它会有效地整理出所需的所有内容。请注意,我没有测试过,但它可能允许您使用 --global
来使用大量的证书。值得测试一下。 - Christophergit clone --config http.sslCAInfo=<证书路径> https://repo.or.cz/org-mode.git
(无需在后面调用“git config”命令)。 - Aaron永远不要禁用所有SSL验证!
这会造成糟糕的安全文化。不要成为那个人。
你需要的配置键是:
http.sslverify
- 始终为true。参见上面的注意事项。这些是用于配置您信任的主机证书
这些是用于配置您的证书以响应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
时指定配置如果您需要对每个仓库应用它,文档告诉您只需在您的仓库目录中运行git config --local
。但是,当您还没有将仓库本地克隆时,这并不有用。
您可以通过设置全局配置,然后将这些设置复制到本地仓库配置中来进行全局 -> 本地的操作...
或者,您可以在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的答案,该答案指出了关于绝对路径和相对路径在特定Git版本2.14.x / 2.15到这个一行命令中的一个警告。
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上执行此操作,并且您的.pem
文件出现问题,
unable to load client key: "-8178 (SEC_ERROR_BAD_KEY)"
您可能需要查看这个StackOverflow答案,了解curl
如何使用NSS而不是Open SSL。
并且,您可能需要从源代码重新构建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仍然作为共享库存在内存中,因此请重新启动计算机
http.sslCAPath
提供证书文件夹的路径即可。但在我的情况下,我必须使用 http.sslCAInfo
来指定特定的文件。这样做可以让 Git 连接到我们的私有 GitHub,而不必禁用 SSL 验证。 - Zarephethgit config --global http.sslCAInfo C:/Users/<yourname>/ca-bundle.crt
这将在您的用户配置文件根目录的.gitconfig文件中添加以下条目。
[http] sslCAInfo = C:/Users/<yourname>/ca-bundle.crt
ca-bundle.crt
文件:C:\Program Files\Git\usr\ssl\certs\ca-bundle.crt 和 C:\Program Files\Git\mingw64\ssl\certs\ca-bundle.crt,将证书添加到第一个文件无效 - 添加到第二个文件有效。 - Tom Charles Zhang我一直遇到这个问题,所以写了一个脚本来下载服务器的自签名证书并将其安装到~/.gitcerts中,然后更新git-config以指向这些证书。它存储在全局配置中,因此您只需要每个远程运行它一次。
https://github.com/iwonbigbro/tools/blob/master/bin/git-remote-install-cert.sh
git config --global http.sslCAInfo "C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt"
注意:文件路径取决于你本地的 ca-bundle 文件路径!
sslcainfo
选项。如果您可以成功使用curl --cacert
拉取存储库路径,但git无法工作,则应将证书添加到神秘的OSX Keychain程序中。更多信息请参见http://superuser.com/questions/605900/why-wont-os-x-trust-githubs-ssl-certificate。 - amwinter