Mac OS X Lion 10.7.4 如何安装Homebrew

为了研究iPhone4上的越狱插件开发,我开始捣鼓起古老的iOS 6。而iOS 6开发需要使用XCode 4.5以上到XCode 5之间的版本,系统需要Mac OS X 10.7.4以上到Mac OS X 10.8之间的版本,这些条件我都满足了,可以参考VMWare安装Mac OS X 10.7.4。接下来需要解决的是,给Mac安装Homebrew,因为越狱插件需要。然而安装过程并不顺利。

升级OpenSSL

安装Homebrew的命令很简单,只需要命令行

1
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

但是安装过程报错

error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

我在网上找到的说法是,Homebrew的安装需要使用CURL工具,需要从GitHub获取源代码,而GitHub 停止了对加密弱 TLS 1.0 和 1.1 协议的支持,并且仅支持与 TLS 1.2 协议以上的连接。而自带的CURL工具仅支持TLS 1.0协议。而CURL工具的加密解密部分又依赖于OpenSSL工具,我的Mac Lion上的OpenSSL版本有点低,才0.9.8,可以使用命令行查看

1
openssl version

索性,我编译安装一个新版的OpenSSL吧。

因为系统太旧,只能选择从OpenSSL官网下载源代码,而无法使用CURL工具从GitHub下载。下载完成后,第一步先备份一下原OpenSSL工具。

1
2
3
4
5
6
7
8
9
10
11
12
13
// 查看openssl命令文件路径,一般位于/usr/bin/openssl
which openssl
// 备份openssl,以防万一
sudo mv /usr/bin/openssl /usr/bin/oldopenssl
// 解压下载的openssl压缩文件,我下载的是最新的1.1.1版本
cd ~/Downloads
tar xvf openssl-1.1.1.tar
// 编译安装Mac版本的openssl,如果是64位Mac系统参数是darwin64-x86_64-cc,32位Mac系统参数darwin64-x86-cc,可以使用命令uname -a查看Mac系统是32还是64位
cd openssl-1.1.1
sudo ./Configure darwin64-x86_64-cc --prefix=/usr/local/openssl
sudo make && make install
// 创建/usr/local/openssl/bin/openssl的链接到/usr/bin/openssl,不然使用openssl命令会报找不到/usr/bin/openssl路径
sudo ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl

在使用make命令之前有个前提,先给XCode安装Command Line Tools for Xcode,不然没有gcc以及make等命令。可以通过Xcode->Open Developer Tool->More Developer Tools,输入苹果开发者账号后(没有的话注册一个),找到Command Line Tools (OS X Lion) for Xcode 2012下载安装即可。

这样,就拥有了一个最新版本的OpenSSL,再次查看版本,显示1.1.1。记得一定要加上sudo,我之前因为没加上,导致好几次都没安装成功,如果安装失败也没关系,只需要执行命令清理一下就行,然后重新安装

1
2
3
4
// 进入openssl源代码目录
cd ~/Downloads/openssl-1.1.1
// 清理make的链接
sudo make clean

升级CURL

升级完OpenSSL之后,接下来就是要升级CURL工具了。这个过程比较艰辛,踩了很多坑。首先一样是去CURL官网去下载源代码。我下载的是最新的7.61.1版本。

有一个问题,我的虚拟机没法安装VMWare Tools,即便安装了成功了,虚拟机和主机之间依然无法互相访问。而Lion自带的Safari浏览器连CURL官网都打不开,我不得不用到自己的VPS来实现中转下载,多一步过程,总是觉得麻烦。

还有最重要的一点是,需要从CURL官网上下载证书文件,它的内容是一些可以信任的服务器,少了该证书文件,每次使用CURL命令时都会报

curl: (60) SSL certificate problem: self signed certificate in certificate chain More details here: https://curl.haxx.se/docs/sslcerts.html

虽然在使用CURL命令时可以加上-k参数,允许暂时信任访问的服务器,但是在使用brew命令的时候,brew默认调用CURL命令时不会带上-k参数,如果要自己加上还要修改Homebrew源代码进行编译,极其麻烦。

整个编译CURL的过程是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
// 重命名证书文件(为了方便),将其放到一个某个目录下,我放在了~/.ssh隐藏目录下
mv ~/Downloads/cacert-2018-06-20.pem ~/.ssh/cacert.pem
// 备份原curl文件
sudo mv /usr/bin/curl /usr/bin/oldcurl
// 解压curl压缩文件
cd ~/Downloads
unzip curl-7.61.1.zip
// 编译安装curl
cd curl-7.61.1
sudo ./configure --with-ssl=/usr/local/openssl --prefix=/usr/local/curl --with-ca-bundle=~/.ssh/cacert.pem
sudo make && make install
// 创建链接
sudo ln -s /usr/local/curl/bin/curl /usr/bin/curl

特别要注意的是上面的--with-ssl以及--with-ca-bundle参数,这两个参数很重要,如果不指定--with-ca-bundle就会出现上面的没有信任服务器的问题,使用CURL命令访问无论哪个网站,都无法直接访问,必须带上-k参数才行。这个问题困扰了我很久,可能是我没有好好读CURL官网的文档。

还有一个就是--with-ssl参数,这个参数也很重要,它告诉CURL命令,使用哪个版本的OpenSSL的关键所在,上一步升级OpenSSL就是为了在这里指定。如果不指定该参数,仍然会报错

error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

使用make命令的时候可能会提示

make[1]: Nothing to be done for `all-am’

忽略它就是了,并没有什么影响

安装Homebrew

貌似安装完CURL之后,系统就默认给安装上了Homebrew,我是在下载到了Homebrew的源码后才发现,原来已经安装好了,我推算可能和安装CURL有关,但我还是介绍一下下载哪个版本的Homebrew。

通过查看Homebrew的install文件可以得知,旧版的Homebrew源代码位于https://github.com/Homebrew/brew/tarball/master。因为我已经安装好了,所以就不需要编译安装了。

总结

终于可以使用brew命令了,深感安装环境的不易。当然我也学到了一点皮毛,但下次还是老老实实先看看官方文档再来安装吧。如果着急想搭环境,效果可能会适得其反。

avatar

chilihotpot

You Are The JavaScript In My HTML