Private Internet Access
Private Internet Access 是全球领先的消费级 VPN 服务。在 Private Internet Access,我们相信所有人应该享有无拘无束的访问权利,作为开源生态系统的坚定支持者,我们决定开源我们的 VPN 客户端。有关 Private Internet Access 服务的更多信息,请访问我们的网站 privateinternetaccess.com 或查看 Wiki。
适用于 Apple 平台的隧道
此库为 Apple 平台提供了 OpenVPN® 协议的简化 Swift/Obj-C 实现,同时利用了 Private Internet Access 客户端补丁定制。加密层建立在 OpenSSL 1.1.0h 之上,这又使得支持一系列加密和摘要算法。
入门指南
客户端已知与 OpenVPN® 2.3+ 服务器兼容。还包含密钥协商和重放保护,但当前不支持完整的配置文件 (.ovpn)。
- UDP 或 TCP 上的握手和隧道传输
- 客户端发起的协商
- 重放保护(硬编码窗口)
- 数据加密
- AES-CBC (128 位和 256 位)
- AES-GCM (128 位和 256 位)
- HMAC 摘要
- SHA-1
- SHA-256
- TLS 证书验证
- RSA (2048 位、3072 位和 4096 位)
- ECC (secp256r1, secp521r1, secp256k1)
- 自定义证书
安装
要求
- iOS 9.0+ / macOS 10.11+
- Xcode 9+ (Swift 4)
- Git (预安装在Xcode命令行工具中)
- Ruby (预安装在macOS中)
- CocoaPods 1.5.0
- jazzy(可选,用于文档)
强烈建议使用Homebrew提供的Git和Ruby包。
CocoaPods
使用CocoaPods时,只需将其添加到Podfile中
pod 'PIATunnel'
测试
本地下载库代码库
$ git clone https://github.com/pia-foss/tunnel-apple.git
假设您有一个正常工作的CocoaPods环境,设置库的工作空间只需安装pod依赖项
$ pod install
然后,在Xcode中打开PIATunnel.xcworkspace
,并运行在PIATunnelTests
目标中找到的单元测试。在PIATunnel-iOS
上按下CMD+U也可以做到这一点。
示例
有一个名为Demo
的目录,其中包含一个测试隧道的简单应用程序,称为BasicTunnel
。像往常一样,启动CocoaPods
$ pod install
然后打开Demo.xcworkspace
并运行BasicTunnel-iOS
目标。
为了让VPN正常工作,BasicTunnel
演示需要
- 具有App Groups和Keychain Sharing功能
- 具有Packet Tunnel权限的应用ID
这两个功能都在主应用程序和隧道扩展目标中。
要测试连接到您自己的服务器而不是PIA服务器,请修改文件Demo/BasicTunnel-[iOS|macOS]/ViewController.swift
,并确保
- 将
builder.endpointProtocols
中的.pia
替换为.vanilla
。 - 将
builder.handshake
设置为.custom
。 - 将
builder.ca
设置为您的VPN服务器CA的PEM格式证书。
示例
builder.endpointProtocols = [PIATunnelProvider.EndpointProtocol(.udp, 1194, .vanilla)]
builder.handshake = .custom
builder.ca = """
-----BEGIN CERTIFICATE-----
MIIFJDCC...
-----END CERTIFICATE-----
"""
文档
这个库分为两个模块,以便将底层协议实现与平台特定的桥接解耦,即NetworkExtension VPN框架。
公共接口的完整文档可用,可以通过jazzy生成。在安装jazzy Ruby gem后
$ gem install jazzy
进入存储库的根目录并运行
$ jazzy
生成的输出以HTML格式存储在docs
目录中。
核心
在这里,您可以找到建立连接的低级实体。代码混合了Swift和Obj-C,大部分都不对消费者公开。《核心》模块依赖于OpenSSL,基本上是平台无关的。
入口点是SessionProxy
类。网络层是完全抽象的,并通过使用不透明的IOInterface
(LinkInterface
和TunnelInterface
)以及SessionProxyDelegate
协议进行外部委托。
应用扩展
此模块的目标是将一个NEPacketTunnelProvider的实现打包为一个黑盒,NEPacketTunnelProvider是包隧道提供器应用扩展的重要组成部分。您可以在PIATunnelProvider
类中找到主要实现。
目前,此扩展支持通过UDP和TCP套接字进行VPN。可选地维护和共享调试日志快照,并通过共享App Group中的UserDefaults
与宿主应用共享。
贡献
通过参与此项目,您同意在《贡献者许可协议》(CLA)中声明的条款。请在此处查看。
如需更多详细信息,请参阅CONTRIBUTING。
问题和拉取请求应使用以下模板:ISSUE 和 PULL REQUEST。
作者
- Davide De Rosa - keeshux
- Steve
许可
此项目采用MIT (Expat) 许可协议,可在此处找到:在这里。
致谢
- SwiftyBeaver - © 2015 Sebastian Kreutzberger
此产品包含 OpenSSL 项目开发的软件,用于 OpenSSL 工具套件。(https://www.openssl.org/)
© 2002-2018 OpenVPN Inc. - OpenVPN 是 OpenVPN Inc. 的注册商标。