Xuất VPN trên Android: điều gì thực sự chuyển sang điện thoại mới
Một lần xuất VPN trên Android gửi cài đặt và đôi khi cả khóa, nhưng không bao giờ gửi quyền ủy quyền của thiết bị. Hãy kiểm tra điều gì thực sự chuyển trước khi xóa điện thoại cũ.
Xuất hồ sơ VPN khỏi Android có cảm giác như một bước sao lưu, và menu cung cấp việc đó không làm gì để sửa ấn tượng ấy. Thứ bạn mang đi là đầu vào cho bộ phân tích, một khóa mà hệ điều hành có thể không bao giờ trả lại, và một quyền ủy quyền được cấp đúng cho chiếc điện thoại đó. Tách ba thứ ấy ra và câu hỏi hữu ích xuất hiện: phần nào vẫn còn thiếu trên thiết bị mới?
Tệp là phần dễ. Hai thứ còn lại quyết định việc chuyển có thành công hay không.
Hồ sơ được xuất thực sự chứa gì
Mở tệp bằng trình soạn thảo văn bản trước khi tin nó. Hồ sơ OpenVPN là một ngôn ngữ cấu hình nhỏ: remote, proto, data-ciphers và thường là các khối <ca>, <cert>, <key> hoặc <tls-crypt> nội tuyến mà ứng dụng khách chuyển cho chồng TLS của nó. Cấu hình WireGuard phẳng hơn: [Interface] chứa PrivateKey và Address, rồi một [Peer] cho mỗi điểm cuối mang PublicKey, AllowedIPs và Endpoint. IKEv2 đến dưới dạng .mobileconfig với từ điển tải trọng thay vì khối khóa.
Không đoạn văn bản nào trong số đó tự nó là thông tin xác thực. Thông tin xác thực là khóa riêng, và mỗi định dạng hoặc dán nó vào bên trong hoặc trỏ tới một bí danh chỉ được phân giải bên trong ứng dụng khách đã tạo ra nó.
Khóa thực sự sống ở đâu trên Android
Android lưu dữ liệu ứng dụng dưới /data/data/<package>, chỉ UID của ứng dụng đó đọc được. Không có cách được hỗ trợ để sao chép thư mục riêng của ứng dụng khác từ điện thoại chưa root, và adb backup không còn là câu trả lời chung sau khi Android 12 loại bỏ nó và các ứng dụng khách bắt đầu khai báo allowBackup="false". Vì vậy xuất từ một ứng dụng khách Android nghĩa là những gì ứng dụng đó triển khai, không phải bản sao của hệ thống tệp.
Lớp danh tính nằm bên dưới ứng dụng. Nếu ứng dụng khách đã nhập khóa của bạn vào Android Keystore, vật liệu được tạo hoặc gói ở đó, và các lần xuất sau có thể mang tham chiếu tới bí danh Keystore thay vì byte. Khóa được bảo vệ bằng phần cứng được tạo để ngay cả ứng dụng sở hữu cũng không đọc được, như Keystore documentation mô tả, nên hồ sơ trỏ tới bí danh đó nhập sạch trên cùng điện thoại và thất bại ở mọi nơi khác.
Đó không phải là lần xuất hỏng. Đó là thuộc tính mà nền tảng được yêu cầu cung cấp.
Hồ sơ không thể mang theo gì
So sánh các đối tượng với những gì đích sẽ chấp nhận:
| Đối tượng | Có chuyển không? | Vì sao |
|---|---|---|
| Giao thức và điểm cuối | Có, nếu ứng dụng khách đích hỗ trợ | Văn bản thuần trong hồ sơ |
| Chứng chỉ CA và kiểm tra tên máy chủ | Thường thì có | Vật liệu công khai, nhưng tên máy chủ vẫn phải khớp với chứng chỉ |
| Chứng chỉ ứng dụng khách | Có, trừ khi bị ràng buộc theo từng thiết bị | Chứng chỉ có thể mang đi; nhà phát hành quyết định bao nhiêu thiết bị được dùng một chứng chỉ |
| Khóa riêng | Chỉ khi được tạo bên ngoài Keystore | Khóa được bảo vệ bằng phần cứng không thể xuất, chỉ có thể thay thế |
| Tài khoản, MFA, phiên SSO | Không | Mã thông báo hết hạn và vẫn gắn với thiết bị đã lấy chúng |
| Tuyến, DNS và phạm vi ứng dụng | Chỉ dưới dạng văn bản cấu hình | Android áp dụng chúng khi kết nối qua VpnService.Builder |
| Danh sách ứng dụng trong đường hầm chia tách | Hiếm khi | Tên gói khác nhau giữa các thiết bị, và danh sách là trạng thái của ứng dụng khách |
Hai hàng gây ra phần lớn sự nhầm lẫn. Khóa được tạo trên thiết bị và bị đánh dấu không thể xuất thực sự mất đi cùng dữ liệu ứng dụng, nên thay thế là một khóa mới và chứng chỉ cấp cho nó. Mã thông báo phiên sao chép sang điện thoại mới thường chết ở lần làm mới đầu tiên, điều này trông giống như nhập thất bại.
Nhập là một lần phân tích, rồi một yêu cầu đồng ý
Ở phía nhận, nhập là một lần phân tích tiếp theo là ghi. Ứng dụng khách đọc cấu hình, kiểm tra rằng mọi khối được tham chiếu đều tồn tại, rồi ghi định nghĩa đường hầm vào hộp cát của riêng nó, đó là lý do tệp bạn chọn từ Tải xuống không phải là thứ kết nối sau đó.
Sau đó đến một bước ủy quyền mà không tệp nào bỏ qua được. Android yêu cầu ứng dụng gọi VpnService.prepare() và nhận sự đồng ý của bạn trước khi có thể thiết lập đường hầm, nên một hồ sơ vừa nhập vẫn hiển thị hộp thoại hệ thống một lần. Sau đó đường hầm được dựng rõ ràng qua addAddress, addRoute, addDnsServer và addAllowedApplication hoặc addDisallowedApplication cho định tuyến theo ứng dụng. Không điều nào trong số đó được ngụ ý bởi một điểm cuối, nên cùng một hồ sơ có thể tạo ra tập tuyến hiệu lực khác nhau trong hai ứng dụng khách.
Cấu hình dựa trên chứng chỉ thêm một nhánh nữa. Khi máy chủ cấp chứng chỉ cho một thiết bị cụ thể, như MDM và đăng ký SCEP làm, việc dùng lại trên điện thoại thứ hai hoặc hoạt động cho đến khi máy chủ buộc một phiên cho mỗi danh tính, hoặc thất bại ở bắt tay TLS. Kiểm tra chính sách của nhà phát hành trước khi định dùng lại.
Xác minh thiết bị mới trước khi cho thiết bị cũ nghỉ
Giữ điện thoại cũ kết nối cho đến khi điện thoại mới vượt qua điều gì đó tốt hơn một biểu tượng xanh. Xác nhận địa chỉ thoát từ thiết bị mới và trình phân giải DNS mà nó thực sự dùng. Nếu split tunneling quan trọng, hãy mở một ứng dụng lẽ ra phải đi vòng đường hầm và một ứng dụng không nên, rồi xem cái nào đến được nhà cung cấp của bạn.
Một lần kiểm tra giải quyết địa chỉ thoát. Mở https://ifconfig.me trong trình duyệt điện thoại, rồi chạy curl -s https://ifconfig.me từ máy tính xách tay trên cùng Wi-Fi và so cả hai câu trả lời với địa chỉ mà nhà cung cấp đã cấp.
Chỉ khi đó mới cho danh tính cũ nghỉ, và làm qua nhà phát hành: thu hồi chứng chỉ hoặc xóa thiết bị khỏi tài khoản. Xóa tệp khỏi Tải xuống không kết thúc gì, vì hai thiết bị giữ cùng chứng chỉ trông giống hệt nhau trong nhật ký máy chủ.
Nếu lần xuất hóa ra không mang đi được, giải pháp là đăng ký mới chứ không phải gói cấu hình công khai. Yêu cầu hồ sơ cho thiết bị thứ hai, hoặc tạo cặp khóa trên điện thoại mới và gửi CSR; chậm hơn, và đó là con đường mà nhà phát hành hỗ trợ.
Chạy danh sách kiểm tra trước khi xóa bất cứ thứ gì: thiết bị mới kết nối, địa chỉ thoát và DNS khớp, phạm vi theo ứng dụng đúng như bạn định, danh tính cũ đã bị thu hồi, và mọi tệp cấu hình bạn giữ nằm trong kho mã hóa.