协慌网

登录 贡献 社区

如何使 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

答案

永久接受特定证书

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

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

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

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

禁用特定存储库的 SSL 验证

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

git config --global http.sslVerify false

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_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 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通过不同的证书颁发机构进行验证的风险,该证书颁发机构可能会受到损害。