Thiết lập chế độ nâng cao của Protector4J

Chế độ nâng cao cho phép bạn tự đặt phạm vi bảo vệ, các tùy chọn tương thích và những tùy chọn riêng của từng loại ứng dụng. Lần đầu xử lý một ứng dụng mới, hãy bắt đầu bằng chế độ đơn giản, hoặc chạy một lượt quét tương thích ngay trên trang tùy chọn nâng cao rồi điều chỉnh theo kết quả.

Trang này khai triển phần nói về chế độ nâng cao trong Hướng dẫn giao diện đồ họa. Để quyết định lớp nào nên để không bảo vệ, xem Tương thích và phạm vi bảo vệ; để viết câu lệnh tự động hóa tương đương, xem Tham chiếu dòng lệnh.

1. Vào chế độ nâng cao

  1. Chọn loại ứng dụng và tệp JAR hoặc WAR đầu vào.
  2. Chọn phiên bản Java đi kèm và ít nhất một nền tảng mục tiêu.
  3. Ở mục Chế độ, chọn Nâng cao — tự tùy chỉnh các tùy chọn.
  4. Bấm Tiếp theo để mở trang tùy chọn nâng cao.

Nếu bạn đang ở trang xem lại đầu ra, hãy bấm Tùy chỉnh... để quay lại phần tùy chọn nâng cao. Sau khi sửa, quay về trang đầu ra và kiểm tra xem phần tóm tắt đã phản ánh thay đổi chưa.

Phiên bản Java và nền tảng mục tiêu không đổi được ở trang tùy chọn nâng cao; muốn đổi thì quay lại trang đầu vào. Tác vụ nhiều nền tảng tạo ra đầu ra riêng cho từng nền tảng, và các thư mục vlxjre của chúng không dùng thay cho nhau được.

2. Tùy chọn chung

Bốn loại ứng dụng dùng chung mục này, dù một số thiết lập chỉ áp dụng cho vài loại nhất định. Mã hóa thư viện không sinh tập lệnh khởi chạy nên không có tùy chọn khởi chạy JVM; thiết lập hậu tố của nó dùng để gợi ý và giữ nhất quán tên tệp đầu ra.

Thiết lậpMặc địnhTác dụngKhuyến nghị
Hậu tố kho lưu trữp4jxĐặt tên kho lưu trữ ứng dụng thành .p4jx hoặc .jarGiữ .p4jx. Chỉ chuyển sang jar khi một thành phần bên thứ ba ghi cứng tên tệp .jar.
Tắt JIT cho các phương thức được bảo vệTắtGiữ phương thức được bảo vệ chỉ chạy trong trình thông dịchBật khi mã rất nhạy cảm và bạn đã cân nhắc cái giá về hiệu năng.
Thêm lớp phủ ZIP cho trình quétTắtThêm một khung nhìn tương thích cho các công cụ quét cấu trúc ZIPChỉ bật khi lượt quét khuyến nghị, hoặc khi ứng dụng thật sự đọc cấu trúc ZIP vật lý.
Tùy chọn khởi chạy JVMTrốngGhi tùy chọn JVM vào các tập lệnh khởi chạy được sinhNhập mỗi dòng một tùy chọn hoàn chỉnh.
Quét tương thích...Không tự chạyQuét đầu vào và đưa ra khuyến nghị an toànChạy lại với mỗi ứng dụng mới, sau khi nâng cấp framework và sau khi đổi phạm vi bảo vệ.

Các tùy chọn riêng của từng loại:

Loại ứng dụngTùy chọn riêngTrạng thái ban đầuTùy chọn dòng lệnh tương ứng
Ứng dụng JavaLớp chính, các lớp cần loại trừ, JavaFX và WebViewLớp chính lấy từ tệp kê khai; không loại trừ gì; không kèm JavaFX--main, --exclude, --javafx, --javafx-webview / --no-javafx-webview
Spring BootLớp chính, bố trí, bảo vệ JAR phụ thuộc, các lớp cần loại trừ, JavaFX và WebViewLớp chính lấy từ Start-Class; bố trí p4jx-fat; không bảo vệ phụ thuộc; không loại trừ gì; không kèm JavaFX--main, --layout, --protect-lib, --exclude cùng các tùy chọn JavaFX
TomcatPhiên bản Tomcat, đường dẫn ngữ cảnh, các lớp cần loại trừChưa chọn phiên bản; đường dẫn /app; không loại trừ gì--tomcat-version, --context, --exclude

«Không loại trừ gì» nghĩa là mặc định mọi lớp ứng dụng của loại đó đều được bảo vệ. Điều này không có nghĩa các phụ thuộc bên thứ ba cũng được bảo vệ: BOOT-INF/lib của Spring Boot và WEB-INF/lib của Tomcat mặc định nằm ngoài phạm vi bảo vệ.

Hậu tố kho lưu trữ

Chọn jar chỉ đổi tên tệp; nội dung vẫn là P4JX. Nó không mở được bằng công cụ ZIP hay JAR thông thường và JRE tiêu chuẩn cũng không nạp được. Với mã hóa thư viện, thiết lập này chuyển hậu tố tệp đầu ra giữa .p4jx.jar; nếu bạn tự gõ một hậu tố khác thì tên tệp bạn nhập được giữ nguyên.

Tùy chọn dòng lệnh tương ứng:

--archive-suffix p4jx
--archive-suffix jar

Tắt JIT cho các phương thức được bảo vệ

Bật Tắt JIT cho các phương thức được bảo vệ sẽ giữ những phương thức đó khỏi trình biên dịch JIT, nhờ đó giảm lượng mã máy đã biên dịch bị lộ ra. Mã nặng về tính toán có thể chậm đi đáng kể. Thiết lập này chỉ tác động tới phương thức được bảo vệ, không đưa cả JVM sang chế độ thông dịch.

Tùy chọn dòng lệnh tương ứng:

--no-jit

Lớp phủ ZIP cho trình quét

Lớp phủ chỉ để lộ tài nguyên công khai, thư mục và phần khung siêu dữ liệu của các lớp được bảo vệ — không bao giờ lộ phần thân thật của phương thức. Nó tồn tại để những công cụ đọc thẳng thư mục trung tâm của ZIP vẫn hoạt động. Nó không thay thế bố trí fat của Spring Boot và cũng không giúp gì khi kho lưu trữ bị phân tích từ luồng trong bộ nhớ bằng ZipInputStream hay JarInputStream.

Tùy chọn dòng lệnh tương ứng:

--zip-overlay scanner

Tùy chọn khởi chạy JVM

Nhập mỗi dòng một tùy chọn hoàn chỉnh, ví dụ:

-Xms512m
-Xmx2g
-Dfile.encoding=UTF-8

Mỗi dòng là một tùy chọn; tuyệt đối đừng viết hai tùy chọn trên cùng một dòng. Các tùy chọn được ghi vào tập lệnh khởi chạy cho macOS, Linux và Windows; với Tomcat còn ghi vào đường khởi chạy của nó. Mã hóa thư viện không sinh tập lệnh khởi chạy nên ô nhập bị vô hiệu. Ví dụ đầy đủ cho từng nền tảng nằm ở Tùy chọn khởi chạy JVM.

Trên dòng lệnh, tùy chọn được lặp lại:

--jvm-option -Xms512m --jvm-option -Xmx2g

3. Quét tương thích và các khuyến nghị

Cả bốn loại đều dùng được Quét tương thích... để quét đầu vào hiện tại. Nếu bạn chấp nhận kết quả, công cụ sẽ gộp các khuyến nghị dành cho loại đó vào thiết lập hiện tại, chủ yếu gồm:

  • thêm những lớp nên để không bảo vệ;
  • bật lớp phủ ZIP cho trình quét;
  • điều chỉnh hậu tố kho lưu trữ;
  • bật JavaFX và WebView cho ứng dụng Java hoặc Spring Boot;
  • chọn bố trí cho Spring Boot;
  • chọn Tomcat 9 hay 10.1.

Mã hóa thư viện chỉ áp dụng hai khuyến nghị về lớp phủ ZIP và hậu tố. Nó vốn được thiết kế để bảo vệ mọi lớp trong tệp JAR đầu vào và không hỗ trợ loại trừ; vì vậy nếu lượt quét tìm thấy thứ buộc phải để không bảo vệ — chẳng hạn lớp JNI hay lớp gốc — báo cáo sẽ khuyên bạn chuyển những lớp đó sang một JAR thông thường, hoặc đổi sang chế độ đóng gói có hỗ trợ bảo vệ chọn lọc.

Sau khi chấp nhận khuyến nghị, bạn vẫn sửa tiếp được. Lượt quét giữ nguyên các quy tắc loại trừ bạn đã có, và cũng không tắt JavaFX mà bạn tự bật chỉ vì nó không phát hiện ra JavaFX. Hủy hộp thoại thì không áp dụng gì cả.

Những rủi ro ở mức mã nguồn nêu trong báo cáo — agent, JNI, trình nạp lớp tự viết, bytecode bị sửa lúc chạy — thường không thể giải quyết bằng cách gạt một công tắc. Hãy dựa vào Tương thích và phạm vi bảo vệ để dịch chuyển ranh giới trong mã của bạn, rồi kiểm thử thực tế.

4. Tùy chọn của Ứng dụng Java

Tùy chọn nâng cao của ứng dụng Java thông thường

Lớp chính

Để trống thì Main-Class được đọc từ tệp kê khai của JAR đầu vào. Chỉ nhập tên lớp đầy đủ khi tệp kê khai không có lớp chính, hoặc khi bạn muốn thay thế nó — ví dụ com.example.Main.

Tùy chọn dòng lệnh tương ứng: --main com.example.Main.

Các lớp cần loại trừ

Mặc định mọi lớp ứng dụng đều được bảo vệ. Những lớp và gói liệt kê ở đây sẽ để không bảo vệ, phù hợp với DTO, thực thể, lớp cấu hình, lớp cầu nối JNI và mọi thứ được framework bổ sung hoặc cần đọc chính bytecode thật của mình. Cách viết quy tắc xem ở phần «Phạm vi bảo vệ và quy tắc loại trừ» bên dưới.

Môi trường chạy JavaFX

Với ứng dụng JavaFX thông thường, hãy đánh dấu Đưa JavaFX vào runtime đóng gói. WebView có ba lựa chọn:

  • Tự động (phát hiện javafx.scene.web): chỉ đưa vào khi phát hiện javafx.scene.web;
  • Bao gồm: luôn đưa fx-webkit vào;
  • Loại trừ: không bao giờ đưa vào.

WebView làm gói nặng thêm khoảng 40 MB. Giao diện sẽ tải thành phần khớp với phiên bản Java và nền tảng mục tiêu của bạn; nếu cần chỉ định thư mục JavaFX cục bộ, hãy dùng dòng lệnh.

Tùy chọn dòng lệnh tương ứng: --javafx, --javafx-webview, --no-javafx-webview. Lựa chọn Tự động không có tùy chọn riêng, vì trình đóng gói tự quyết định dựa trên các tham chiếu của chính ứng dụng.

5. Tùy chọn của Spring Boot

Tùy chọn nâng cao của Spring Boot

Lớp chính

Để trống thì Start-Class được đọc từ tệp kê khai. Nhập tên lớp đầy đủ nếu muốn thay thế.

Tùy chọn dòng lệnh tương ứng: --main com.example.Application.

Bố trí

Bố tríKhi nào dùng
p4jx-fatMặc định. Dịch vụ Spring Boot thông thường, phạm vi bảo vệ rộng nhất.
fatỨng dụng cần cấu trúc vật lý của JAR Spring Boot, chẳng hạn khi dùng ClassGraph hay Reflections.
separateMôi trường tích hợp cũ đòi hỏi classpath phẳng lib/*.

Nếu lượt quét khuyến nghị rõ fat, đừng ép về p4jx-fat rồi trông chờ lớp phủ ZIP bù đắp. Chi tiết từng bố trí xem ở Bảo vệ ứng dụng Spring Boot.

Tùy chọn dòng lệnh tương ứng: --layout p4jx-fat, --layout fat, --layout separate.

Bảo vệ các JAR phụ thuộc…

Các phụ thuộc trong BOOT-INF/lib mặc định không được bảo vệ. Chỉ chọn những phụ thuộc mã nguồn đóng của riêng bạn; đừng mã hóa các gói framework bên thứ ba như Spring, Tomcat, thư viện ghi nhật ký hay trình điều khiển cơ sở dữ liệu. Các JAR đã ký không chọn được, vì sửa chúng sẽ phá vỡ chữ ký.

Chọn một phụ thuộc thì mọi lớp bên trong nó được bảo vệ, nhưng bạn vẫn có thể dùng Các lớp cần loại trừ để chừa ra vài lớp hoặc gói cụ thể. Cả ba bố trí Spring Boot đều hỗ trợ bảo vệ phụ thuộc.

Tùy chọn dòng lệnh tương ứng: --protect-lib 'company-core.jar,company-domain.jar'. Dòng lệnh còn nhận mẫu glob; giao diện thì ghi lại đúng tên tệp của các JAR bạn đã chọn.

Các lớp cần loại trừ và JavaFX

Cách dùng giống hệt Ứng dụng Java. Quy tắc loại trừ áp dụng cho cả lớp ứng dụng lẫn những JAR phụ thuộc bạn chọn bảo vệ. Ứng dụng để bàn Spring Boot cũng có thể đưa JavaFX và WebView vào từ thẻ Môi trường chạy JavaFX.

6. Tùy chọn của Tomcat

Tùy chọn nâng cao của Tomcat

Phiên bản Tomcat

  • Nếu WAR dùng javax.servlet.*, chọn Tomcat 9 · javax.
  • Nếu dùng jakarta.servlet.*, chọn Tomcat 10.1 · jakarta.

Tomcat 10.1 cần Java 11 trở lên. Nếu chưa chắc, hãy chạy quét tương thích. Nếu ứng dụng dùng cả javax lẫn jakarta, đừng ép chọn phiên bản mà hãy giải quyết xung đột phụ thuộc trước.

Chế độ nâng cao không chọn sẵn phiên bản nào: bạn phải chấp nhận khuyến nghị của lượt quét hoặc tự chọn thì mới đi tiếp được. Tùy chọn dòng lệnh tương ứng: --tomcat-version 9 hoặc --tomcat-version 10; dòng lệnh còn nhận auto.

Đường dẫn ngữ cảnh

Nhập đường dẫn triển khai bắt đầu bằng /, ví dụ /app. Để trống thì dùng /app. Khi thêm ứng dụng vào một thư mục xuất Tomcat sẵn có, đường dẫn không được trùng với ứng dụng đã có.

Tùy chọn dòng lệnh tương ứng: --context /app.

Các lớp cần loại trừ

Mặc định các lớp ứng dụng dưới WEB-INF/classes được bảo vệ, còn WEB-INF/lib thì không. Servlet, filter, listener, DTO, lớp cấu hình, thực thể, lớp cầu nối JNI và mọi thứ vùng chứa cần bổ sung thường nên loại trừ.

7. Phạm vi bảo vệ và quy tắc loại trừ

Ở chế độ nâng cao, giao diện mặc định bảo vệ mọi lớp ứng dụng, còn ranh giới với framework thì bạn vạch bằng Các lớp cần loại trừ. Có ba dạng quy tắc:

com.example.SecretService   chỉ riêng lớp này
com.example.service.*       chỉ gói này, không gồm gói con
com.example.service.**      gói này và mọi gói con

Bạn có thể chọn lớp từ cây lớp bằng Chọn..., hoặc tự gõ vào bằng Thêm.... Chọn một gói thì mặc định bao gồm cả gói con; dùng .* để giới hạn trong chính gói đó. Với Spring Boot, cây lớp còn hiển thị những JAR phụ thuộc bạn đã chọn bảo vệ.

Cách bố trí được khuyến nghị là: ranh giới công khai hoặc điểm vào framework → facade hoặc giao diện thông thường → phần lõi được bảo vệ. Đừng mã hóa toàn bộ phụ thuộc bên thứ ba và điểm vào framework chỉ để bề mặt bảo vệ trông rộng hơn.

8. Xuất, dùng lại và kiểm tra lần cuối

Bấm Xuất tham số... để xuất tệp tác vụ p4j-task.yml có thể sửa bằng tay. Tệp này ghi lại các tùy chọn đã được xác định, nhưng tuyệt đối không ghi email và mật khẩu tài khoản. Về sau bạn khôi phục tác vụ bằng mục Nạp tệp tác vụ ở phía trên cửa sổ; mục này vẫn đọc được các tệp p4j-encrypt-run.sh.bat do phiên bản cũ xuất ra.

Ở trang đầu ra, hãy kiểm tra ít nhất những điểm sau:

  • tệp đầu vào, loại ứng dụng, phiên bản Java và toàn bộ nền tảng mục tiêu;
  • hậu tố kho lưu trữ, thiết lập JIT, lớp phủ cho trình quét và tùy chọn khởi chạy JVM;
  • JavaFX và WebView, bố trí Spring Boot, hoặc phiên bản Tomcat cùng đường dẫn ngữ cảnh;
  • các JAR phụ thuộc đã chọn bảo vệ và toàn bộ quy tắc loại trừ;
  • thư mục xuất, và có tạo thư mục con p4jx-xxxx mới hay không.

Sau khi tạo xong gói, hãy dùng tập lệnh khởi chạy trong gói trên từng nền tảng mục tiêu để kiểm tra việc khởi chạy, quét framework, tuần tự hóa, phản chiếu, nạp tài nguyên và các luồng nghiệp vụ cốt lõi. Đặt đúng tùy chọn nâng cao chỉ có nghĩa là tác vụ đã được cấu hình chuẩn; nó không thay thế được việc kiểm tra sản phẩm cuối.