使用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
。 亚当尖塔的回答给出了一些很好的例子。 这是问题的最安全的解决方案。
试图通过-c
来git
与适当的配置变量,或使用流量的回答 :
git -c http.sslVerify=false clone https://example.com/path/to/git
如果存储库完全是你的控制之下,你可以试试:
git config http.sslVerify false
禁用TLS(/ SSL)证书验证全球是一个非常不安全的做法。 不这样做。 不要用发出上述命令--global
修改。
有相当多的一些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.
您可以设置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证书,那么你很容易受到中间人攻击 。
我不是一个巨大的风扇[编辑:的原始版本]现有的答案,因为禁用安全检查应该是最后的手段,而不是提供的第一个解决方案。 即使你不能相信在首次收到自签名证书无需验资的一些额外的方法,使用证书进行后续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
,因为它消除了风险git
操作的方式从这些可能被破坏不同的证书颁发机构进行验证。
决不要停用所有的SSL验证!
这就产生了一个糟糕的安全文化。 不要被那个人。
设定键你以后是:
http.sslverify
-总是如此。 见上面的注释。 这些是你信任的配置主机证书
http.sslCAPath
http.sslCAInfo
这些是配置您的证书,以SSL挑战。
http.sslCert
http.sslCertPasswordProtected
选择性地将上面的设置到特定主机。
http.<url>.*
.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
通过设置全局配置如上做作,狱,然后将这些设置复制到本地回购的配置,一旦克隆...
或者你可以做的是指定在配置命令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/
unable to load client key
如果您在CentOS尝试这和你.pem
文件给你
unable to load client key: "-8178 (SEC_ERROR_BAD_KEY)"
然后你会想这个StackOverflow的答案怎么样curl
使用NSS,而不是打开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的是仍然在存储器中作为一个共享库重新启动计算机
相关阅读 : 如何添加自定义CA根证书在Windows中使用的PIP的CA商店?
我一直过这个问题来了,所以写了一个脚本来从服务器下载自签名证书并将其安装到〜/ .gitcerts,然后更新的git-config来指向这些证书。 它存储在全局配置,所以你只需要为每个远程运行一次。
https://github.com/iwonbigbro/tools/blob/master/bin/git-remote-install-cert.sh
这个答案是摘自这篇文章由迈克尔·考夫曼撰写。
使用git的Windows与企业的SSL证书
问题 :
如果你有一个企业的SSL证书,并希望从您会收到以下错误控制台或VSCode克隆您的回购协议:
致命的:无法访问' https://开头MYSERVER / TFS / DefaultCollection / _git /凸出/ ':SSL证书问题:无法获取本地颁发者证书
解决方案 :
导出根自签名证书到一个文件中。 你可以在浏览器中做到这一点。
找到你的git的文件夹中的“CA-bundle.crt”文件(当前版本C:\ Program Files文件\的Git的\ usr \ SSL \证书,但在过去发生了变化)。 将文件复制到您的用户配置文件。 与像VSCode文本编辑器打开它,你导出的证书的内容添加到文件的末尾。
现在我们就来配置GIT中使用新的文件:
git config --global http.sslCAInfo C:/Users/<yourname>/ca-bundle.crt
这将在您的用户配置文件的根目录下面的条目添加到您的.gitconfig文件。
[http] sslCAInfo = C:/Users/<yourname>/ca-bundle.crt
检查您的防病毒软件和防火墙设置。
从一天到其他,混帐没工作了。 随着上述内容,我发现,卡巴斯基提出一个自签名的防病毒个人的根证书在中间。 我没让Git的接受证书按照上述说明。 我放弃了这一点。 什么工作对我来说是禁用该功能扫描加密连接。
在此之后,git的工作有再次启用sslVerify。
注意。 这仍然没有让我满意,因为我想有我反病毒活跃的该功能。 在高级设置中,卡巴斯基表示,将不会与该功能工作的网站列表。 Github上没有被列为其中之一。 我将在卡巴斯基论坛查看。 似乎有一些话题,如https://forum.kaspersky.com/index.php?/topic/395220-kis-interfering-with-git/&tab=comments#comment-2801211
请注意,当您使用使用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(Q3 2015)将能够解释像一个路径~username/mykey
正确的(虽然它仍然能够解释像一个绝对路径/path/to/privatekey
)。
见提交8d15496由(2017年7月20日) JUNIOÇ滨野( gitster
) 。
帮助按: 查尔斯贝利( hashpling
) 。
(通过合并JUNIOÇ滨野- gitster
-在提交17b1e1d 8月11日2017)
http.c
:http.sslcert
和http.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.sslkey
,http.sslcert
纯香草字符串,因为git_config_pathname()
,理解“~[username]/
”前缀不存在。后来,我们转变他们中的一些(即,
http.sslCAPath
和http.sslCAInfo
)使用的功能,并增加了变量一样http.cookeyFile
http.pinnedpubkey
使用的功能从一开始。 正因为如此,这些变量都明白“~[username]/
”前缀。让剩下的两个变量,
http.sslcert
和http.sslkey
,也意识到了公约的,因为他们都清楚的路径名的文件。
在文件的.gitconfig你可以添加下面的给定值,使自签名的证书接受
sslCAInfo = /home/XXXX/abc.crt
在Windows上使用Git的64位版本,只需添加自签署CA证书到这些文件:
如果它仅仅是一个服务器的自签名的证书将其添加到
我不喜欢这样写道:
git init
git config --global http.sslVerify false
git clone https://myurl/myrepo.git
我的回答可能会迟到,但它为我工作。 它可以帮助别人。
我试过上述步骤,但这并没有解决问题。
试试这个git config --global http.sslVerify false