Fixing git HTTPS Error: "bad key length" on macOS 12
Fixing git HTTPS Error: "bad key length" on macOS 12
我正在使用公司托管的 (Bitbucket) git 可通过 HTTPS 访问的存储库。访问它(例如 git fetch
)可以使用 macOS 11 (Big Sur),但在更新到 macOS 12 Monterey 后中断。
*
将 macOS 更新到 12 Monterey 后,我之前的 git 设置崩溃了。现在我收到以下错误消息:
$ git fetch
fatal: unable to access 'https://.../':
error:06FFF089:digital envelope routines:CRYPTO_internal:bad key length
就其价值而言,使用 curl
也不起作用:
$ curl --insecure -L -v https://...
* Trying ...
* Connected to ... (...) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/cert.pem
* CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* error:06FFF089:digital envelope routines:CRYPTO_internal:bad key length
* Closing connection 0
curl: (35) error:06FFF089:digital envelope routines:CRYPTO_internal:bad key length
可以通过 Safari 或 Firefox 访问相同的 HTTPS 源。
据我所知,底层错误“错误密钥长度”错误来自 OpenSSL/LibreSSL,这与 git 和 curl 在 OS 后失败一致升级。
这是 openssl 的输出:
$ openssl s_client -servername ... -connect ...:443
CONNECTED(00000005)
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root G2
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = Thawte TLS RSA CA G1
verify return:1
depth=0 ...
4593010348:error:06FFF089:digital envelope routines:CRYPTO_internal:bad key length:
/System/Volumes/Data/SWE/macOS/BuildRoots/b8ff8433dc/Library/Caches/com.apple.xbs
/Sources/libressl/libressl-75/libressl-2.8/crypto/apple/hmac/hmac.c:188:
---
Certificate chain
...
---
No client certificate CA names sent
Server Temp Key: DH, 2048 bits
---
SSL handshake has read 4105 bytes and written 318 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-GCM-SHA384
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : DHE-RSA-AES256-GCM-SHA384
Session-ID: 1FA062DC9EEC9A310FF8231F1EB11A3BD6E0778F7AB6E98EAD1020A44CF1A407
Session-ID-ctx:
Master-Key:
Start Time: 1635319904
Timeout : 7200 (sec)
Verify return code: 0 (ok)
---
我曾尝试将服务器的证书添加到自定义 pem 文件中并设置 http.sslCAInfo,但这没有用。作为解决方法,我目前正在使用 decrypts/re-encrypts HTTPS 流量的代理。
如何配置 git(或所有 LibreSSL 用户)接受服务器证书?
很遗憾,我无法为您提供解决方案,但我找到了解决完全相同问题的解决方法(公司托管的 bitbucket 导致完全相同的错误)。
我也不知道为什么会出现问题,但我最好的猜测是 Monterey 附带的 libressl 库在特定 (?TLSv1.3) 证书方面存在某种问题。这个猜测是因为 brew 安装的 openssl v1.1 和 v3 在使用 /opt/homebrew/opt/openssl/bin/openssl s_client -connect ...:443
执行时不会抛出该错误
为了解决这个错误,我从针对不同 openssl 和 curl 实现的源构建了 git:
- 用 brew 安装
autoconf
、openssl
和 curl
(我想你可以 select 你喜欢的 openssl 库,即 v1.1 或 v3,我选择v3)
- 克隆您喜欢的 git 版本,即
git clone --branch v2.33.1 https://github.com/git/git.git
cd git
make configure
(这就是为什么需要 autoconf)
- execute
LDFLAGS="-L/opt/homebrew/opt/openssl@3/lib -L/opt/homebrew/opt/curl/lib" CPPFLAGS="-I/opt/homebrew/opt/openssl@3/include -I/opt/homebrew/opt/curl/include" ./configure --prefix=$HOME/git
(这里 LDFLAGS 和 CPPFLAGS 包括库 git 将被构建,正确的标志由 brew 在 curl 和 openssl 安装成功时发出;--prefix 是安装git 的目录,默认为 /usr/local
但可以更改)
make install
- 确保将安装目录的子文件夹
/bin
添加到 $PATH
的前面,以“覆盖”Monterey 提供的默认 git
- 重启终端
- 检查
git version
是否显示新版本
目前这应该有所帮助,但正如我已经说过的,这只是一种解决方法,希望 Apple 尽快修复他们的 libressl 分支。
已接受的答案有效,但您可能需要检查库和包含路径是否正确
brew info openssl
和
brew info curl
设置此 ENV 变量(例如 ~/.zshrc
)对我有用
export CURL_SSL_BACKEND="secure-transport"
在 MACOS 12.1 Monterey 上花了将近 3 周的时间来解决这个问题。我得到了
fatal: unable to access 'https://.../':
error:06FFF089:digital envelope routines:CRYPTO_internal:bad key length
这是有效的方法:
在终端中使用 zsh (Z Shell) 执行:
echo '导出 CURL_SSL_BACKEND="secure-transport"
' >> ~/.zshenv
重新加载更改。在终端
中输入以下行
来源~/.zshenv
检查您的新变量是否设置正确。在终端
中输入以下行
回声CURL_SSL_BACKEND
编辑:macOS 12.3 于 2022 年 3 月 13 日正式发布并且此问题上报告的问题已修复。我个人已经删除了我部署的解决方法,我建议其他人也这样做以跟上新版本。
上一个回答:
显然 Apple 已经在 macOS Monterey 12.3 developer beta 2 及更高版本上更新了 LibreSSL 版本,因此此问题不再发生。稳定的 12.3 版本尚未发布,但我已经测试了开发者测试版并确认它为我解决了这个问题,所以很快就不需要部署这个问题上提到的解决方法了。
我猜macOS 12.3大概会在下个月的某个时候发布。
我正在使用公司托管的 (Bitbucket) git 可通过 HTTPS 访问的存储库。访问它(例如 git fetch
)可以使用 macOS 11 (Big Sur),但在更新到 macOS 12 Monterey 后中断。
*
将 macOS 更新到 12 Monterey 后,我之前的 git 设置崩溃了。现在我收到以下错误消息:
$ git fetch
fatal: unable to access 'https://.../':
error:06FFF089:digital envelope routines:CRYPTO_internal:bad key length
就其价值而言,使用 curl
也不起作用:
$ curl --insecure -L -v https://...
* Trying ...
* Connected to ... (...) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/cert.pem
* CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* error:06FFF089:digital envelope routines:CRYPTO_internal:bad key length
* Closing connection 0
curl: (35) error:06FFF089:digital envelope routines:CRYPTO_internal:bad key length
可以通过 Safari 或 Firefox 访问相同的 HTTPS 源。
据我所知,底层错误“错误密钥长度”错误来自 OpenSSL/LibreSSL,这与 git 和 curl 在 OS 后失败一致升级。
这是 openssl 的输出:
$ openssl s_client -servername ... -connect ...:443
CONNECTED(00000005)
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root G2
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = Thawte TLS RSA CA G1
verify return:1
depth=0 ...
4593010348:error:06FFF089:digital envelope routines:CRYPTO_internal:bad key length:
/System/Volumes/Data/SWE/macOS/BuildRoots/b8ff8433dc/Library/Caches/com.apple.xbs
/Sources/libressl/libressl-75/libressl-2.8/crypto/apple/hmac/hmac.c:188:
---
Certificate chain
...
---
No client certificate CA names sent
Server Temp Key: DH, 2048 bits
---
SSL handshake has read 4105 bytes and written 318 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-GCM-SHA384
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : DHE-RSA-AES256-GCM-SHA384
Session-ID: 1FA062DC9EEC9A310FF8231F1EB11A3BD6E0778F7AB6E98EAD1020A44CF1A407
Session-ID-ctx:
Master-Key:
Start Time: 1635319904
Timeout : 7200 (sec)
Verify return code: 0 (ok)
---
我曾尝试将服务器的证书添加到自定义 pem 文件中并设置 http.sslCAInfo,但这没有用。作为解决方法,我目前正在使用 decrypts/re-encrypts HTTPS 流量的代理。
如何配置 git(或所有 LibreSSL 用户)接受服务器证书?
很遗憾,我无法为您提供解决方案,但我找到了解决完全相同问题的解决方法(公司托管的 bitbucket 导致完全相同的错误)。
我也不知道为什么会出现问题,但我最好的猜测是 Monterey 附带的 libressl 库在特定 (?TLSv1.3) 证书方面存在某种问题。这个猜测是因为 brew 安装的 openssl v1.1 和 v3 在使用 /opt/homebrew/opt/openssl/bin/openssl s_client -connect ...:443
为了解决这个错误,我从针对不同 openssl 和 curl 实现的源构建了 git:
- 用 brew 安装
autoconf
、openssl
和curl
(我想你可以 select 你喜欢的 openssl 库,即 v1.1 或 v3,我选择v3) - 克隆您喜欢的 git 版本,即
git clone --branch v2.33.1 https://github.com/git/git.git
cd git
make configure
(这就是为什么需要 autoconf)- execute
LDFLAGS="-L/opt/homebrew/opt/openssl@3/lib -L/opt/homebrew/opt/curl/lib" CPPFLAGS="-I/opt/homebrew/opt/openssl@3/include -I/opt/homebrew/opt/curl/include" ./configure --prefix=$HOME/git
(这里 LDFLAGS 和 CPPFLAGS 包括库 git 将被构建,正确的标志由 brew 在 curl 和 openssl 安装成功时发出;--prefix 是安装git 的目录,默认为/usr/local
但可以更改) make install
- 确保将安装目录的子文件夹
/bin
添加到$PATH
的前面,以“覆盖”Monterey 提供的默认 git
- 重启终端
- 检查
git version
是否显示新版本
目前这应该有所帮助,但正如我已经说过的,这只是一种解决方法,希望 Apple 尽快修复他们的 libressl 分支。
已接受的答案有效,但您可能需要检查库和包含路径是否正确
brew info openssl
和
brew info curl
设置此 ENV 变量(例如 ~/.zshrc
)对我有用
export CURL_SSL_BACKEND="secure-transport"
在 MACOS 12.1 Monterey 上花了将近 3 周的时间来解决这个问题。我得到了
fatal: unable to access 'https://.../':
error:06FFF089:digital envelope routines:CRYPTO_internal:bad key length
这是有效的方法:
在终端中使用 zsh (Z Shell) 执行:
echo '导出 CURL_SSL_BACKEND="secure-transport" ' >> ~/.zshenv
重新加载更改。在终端
中输入以下行来源~/.zshenv
检查您的新变量是否设置正确。在终端
中输入以下行回声CURL_SSL_BACKEND
编辑:macOS 12.3 于 2022 年 3 月 13 日正式发布并且此问题上报告的问题已修复。我个人已经删除了我部署的解决方法,我建议其他人也这样做以跟上新版本。
上一个回答:
显然 Apple 已经在 macOS Monterey 12.3 developer beta 2 及更高版本上更新了 LibreSSL 版本,因此此问题不再发生。稳定的 12.3 版本尚未发布,但我已经测试了开发者测试版并确认它为我解决了这个问题,所以很快就不需要部署这个问题上提到的解决方法了。
我猜macOS 12.3大概会在下个月的某个时候发布。