libssh2 是一个使用 C 语言编写的以实现 SSH2 协议的代码库。
SSH 协议的全称是 Secure Shell,顾名思义就是为操作系统提供一个安全的 Shell 使得用户在和远程主机进行交互时的数据不易被第三方窃取。除了这个基本的功能之外,它还包含了很多其他的功能,比如 SFTP,端口转发等等。
<small>关于 SSH 的端口转发,可以参考我的这篇文字 SSH 动态端口转发。</small>
因为现在有项目需要在 iOS 系统中使用 SSH 协议,重新实现一个肯定不可能了,所以考虑已有的开源项目包括但不限于 libssh 和 libssh2,之所以优先考虑这两个是因为它们都是 C 编写的,并且已经存在了一段时间,很多项目都使用了它们,所以可以确保它们的性能和健壮度。
但是由于 libssh 的开源协议是 LGPL,根据官网的 Licence 描述,如果编译成了静态库则需要遵守 LGPL 协议即开源代码,而 iOS 目前对动态库的支持并不是很好,所以如果使用了 libssh 那么目前来看必须采用静态编译,那么势必项目的代码就必须开源,原文见 libssh Static Linking。
于是就需要考虑 libssh2 了,好在已经有人给出了自动编译的脚本,项目在这里 libssh2-for-iOS,别看它的名字是 for iOS
实际上脚本中包含的构架包括了 i386 x86_64 armv7 armv7s arm64 tv_x86_64 tv_arm64
。
但是,我并不建议你直接使用这个项目,因为作者似乎不经常维护它了。而我在这个项目的原有基础上,进行了一些细微的修改,并提供了一点更便捷的方式。
我的 fork 在这里 mconintet/OpenSSL-for-iPhone。
那么接下来简单说下我做了哪些修改。
首先,脚本中的下载链接中的所采用的 HTTP 协议其实已经不妥了,因为 libssh2 全站使用了 HTTPS,于是我修改了下载链接的协议部分,使之变成 HTTPS,并且默认使用了最近版 1.7.0
,原项目中已经很老的 1.2.0
了。
其次,libssh 的下载文件使用了 GnuPG 去校验文件的完整性,而原项目中还是使用的 md5。于是我在编译脚本中增加了代码,将对下载文件校验的部分换成了使用 GnuPG 来校验。
我将其中的一个名为 openssl 的 submodule 仓库的地址换成了我对原项目的另一个 fork,因为这个 submodule 也是由同一个作者维护的,目前的维护频率并不是很高了。在我的 fork 中有关于一个文件拷贝路径错误的 bugfix。
最后我添加了一个新的脚本,将编译好的文件打包到一个名为 libssh2.framework
的 framework 中,这样使用起来直接拖到 Xcode 中就行了。
下面简单说下如何使用我的 fork
- 首先你需要 clone 下项目
- 然后进入 clone 后的目录,使用下面的代码来加载下 submodule
git submodule init
git submodule update
- 在编译之前你需要运行下面的代码来安装下 GnuPG
brew install gpg
- 现在你就可以开始编译 libssh2 了,使用下面的命令
./build-all.sh openssl
如果你希望和 libgcrypt 一起编译的话,可以这样
./build-all.sh libgcrypt
- 经过一段时间的编译,运行下面的命令将编译结果打包
./create-libssh2-framework.sh
然后你就会在目录中发现名为 libssh2.framework
的 framework 了,和你使用其他的 framework 一样,直接拖到 Xcode 中就行了。
希望对有相同需要的同学有帮助😼