Khi bạn dựng một màn hình VPN trong ứng dụng iOS, điều bất ngờ đầu tiên là danh sách giao thức trong ứng dụng Cài đặt không phải là danh sách API. Khung Network Extension cho phép ứng dụng của bạn tạo một cấu hình VPN cá nhân, thuộc sở hữu của ứng dụng đó, và nó chỉ chấp nhận vài đối tượng giao thức. Mọi thứ khác mà người ta mong đợi, từ L2TP đến một hồ sơ đã tải xuống, nằm ngoài bề mặt đó hoặc là riêng tư của Apple. Những thất bại tiếp theo thường không phải lỗi, mà là API từ chối một công việc mà nó chưa từng được giao.

Huyền thoại: API là trình biên tập Cài đặt

Người ta tin rằng vì iOS có thể cấu hình hồ sơ IKEv1, IKEv2, L2TP và IPsec, một ứng dụng có thể tạo bất kỳ loại nào trong số đó bằng lập trình. Không thể. Khung này cung cấp chính xác một chỗ cấu hình cho ứng dụng gọi, và chỗ đó chỉ chấp nhận một tập nhỏ các lớp giao thức công khai. Mọi thứ khác mà người ta mong đợi, từ L2TP đến một hồ sơ đã tải xuống, nằm ngoài bề mặt đó hoặc là riêng tư của Apple.

Những thất bại tiếp theo thường không phải lỗi. Đó là API từ chối một công việc mà nó chưa từng được giao, và cách khắc phục là thiết kế màn hình xoay quanh những gì API sở hữu.

Ba đối tượng giao thức và những thứ không tồn tại

Các lựa chọn của bạn là IKEv1 qua NEVPNProtocolIPSec, IKEv2 qua NEVPNProtocolIKEv2, và NETunnelProviderProtocol nếu bạn cung cấp tiện ích mở rộng đường hầm gói của riêng mình. Tài liệu tham khảo NEVPNManager liệt kê các đối tượng giao thức được chấp nhận. L2TP và PPTP không bao giờ xuất hiện trong danh sách đó vì Apple không công bố lớp nào cho chúng. Việc thử một trong hai sẽ kết thúc khi lưu bằng lỗi, hoặc tệ hơn, bằng một cấu hình mà hệ thống âm thầm từ chối sử dụng.

Mã máy tính để bàn tuân theo các quy tắc khác. Trên macOS, SCNetworkInterfaceCreateWithInterface xếp chồng một loại giao diện như L2TP trên IPv4 và gắn nó vào một dịch vụ mạng, và networksetup -connectpppoeservice khởi chạy kết quả. Cần quyền quản trị và một công cụ trợ giúp, vì bí mật chia sẻ và mật khẩu đi vào chùm khóa của hệ thống. Sao chép thiết kế đó sang iOS và không gì biên dịch được.

Truyền một tham chiếu chùm khóa, không phải mật khẩu

Cả hai lớp IKE đều không chấp nhận mật khẩu dưới dạng văn bản. Hai thuộc tính passwordReference và sharedSecretReference muốn một tham chiếu chùm khóa bền vững, bạn lấy từ SecItemCopyMatching bằng cách yêu cầu kSecReturnPersistentRef. Việc truyền dữ liệu của mục, hoặc chèn một chuỗi vào trường, tạo ra lỗi lưu hoặc một kết nối với thông tin xác thực trống. Tham chiếu chỉ bền chừng nào mục chùm khóa phía sau còn, vì vậy mục phải tồn tại trước khi cấu hình được lắp ráp. Tạo nó trong cùng giao dịch với việc lưu và bạn loại bỏ cả một lớp lỗi thứ tự.

Xác thực bằng chứng chỉ đi theo con đường khác: identityData cộng identityDataPassword cho một blob PKCS#12. Việc gửi blob đó bên trong gói ứng dụng là thói quen kế thừa từ mã mẫu, không phải quyết định phát hành, vì mật khẩu đi cùng nó và mọi bản sao của ứng dụng đều mang cùng một danh tính.

Quyền và tính sẵn có gác mọi thứ

Trình quản lý có thể hoàn toàn không tồn tại, và lý do là việc cấp phát. Định danh ứng dụng của bạn cần khả năng Network Extension cùng với quyền VPN cá nhân, và hồ sơ ký bản dựng phải mang cả hai.

Bỏ qua điều đó và cá thể chia sẻ trả về nil, hoặc việc lưu thất bại với lỗi không bao giờ nhắc đến quyền. Tính sẵn có là cổng còn lại. Nếu bạn nhắm tới thứ cũ hơn iOS 8, biểu tượng sẽ thiếu khi chạy, nên thất bại là một cú sập hoặc một trình quản lý nil, không phải trình quản lý không có cấu hình. Kiểm tra môi trường chạy và quyền trước khi gỡ lỗi đồ thị đối tượng của bạn.

Tải, sửa, lưu, rồi quan sát thứ tự theo yêu cầu

Coi vòng đời là tải, sửa, lưu, và đừng bao giờ bỏ qua việc tải. Cho đến khi loadFromPreferences hoàn tất, trình quản lý không giữ gì và đối tượng giao thức không thể đọc hay hoán đổi.

Lần lưu thứ hai thay thế cấu hình thay vì thêm một cái khác, nên một lần lưu dở dang có thể làm hỏng hồ sơ đang hoạt động. Các quy tắc theo yêu cầu tạo thành một mảng có thứ tự, và thứ tự đó là chính sách. Đặt quy tắc kết nối từ mọi nơi trước quy tắc ngắt kết nối và sau khi ngắt kết nối thủ công là kết nối lại ngay lập tức, điều trông giống lỗi nhưng tuân theo đánh giá đã được ghi lại.

Di chuyển quy tắc ngắt kết nối lên trước khi hành động của người dùng phải thắng. Những gì nằm ngoài tầm kiểm soát của ứng dụng cũng quan trọng không kém. Các tuyến đến từ đường hầm hoặc chính sách máy chủ thay vì từ một tùy chọn bạn đặt, và nhà cung cấp đường hầm gói báo cáo chúng khi khởi động. Ứng dụng không thể liệt kê hoặc chỉnh sửa hồ sơ do ứng dụng khác hoặc hồ sơ cấu hình cài đặt, vì vậy đừng hứa một màn hình hiển thị mọi VPN trên thiết bị.

Bài viết liên quan