Lỗi proxy IntelliJ: Gradle sync, Maven, plugin và chứng chỉ
Lỗi proxy IntelliJ thường hiện ra lúc Gradle sync, lúc Maven tải thư viện hoặc lúc cài plugin, mỗi chỗ một kiểu thông báo. ProxyVN chạy thật thư viện mạng của Java qua proxy tự dựng có mật khẩu để lấy nguyên văn các thông báo mà Gradle, Maven in lại. Bài là bảng tra từ thông báo lỗi tới nguyên nhân, kèm cách sửa đúng chỗ cho từng thành phần.
Lỗi proxy IntelliJ thường gặp và bảng tra nhanh
Bài này là phần chẩn đoán. Cách cài proxy cho IDE JetBrains đã có ở bài PyCharm proxy, dùng chung cho IntelliJ IDEA vì hai IDE có cùng trang HTTP Proxy. Cách cài cho Maven và Gradle có ở bài Maven Gradle proxy. Ở đây chỉ tập trung vào đọc lỗi.
Bảng tra từ thông báo lỗi
Thông báo trong IntelliJ |
Nguyên nhân thật |
Thành phần cần sửa |
|---|---|---|
Unable to tunnel through proxy. Proxy returns "HTTP/1.1 407 Proxy Authentication Required" |
Thiếu tài khoản, sai tài khoản, hoặc Java tắt Basic cho HTTPS |
gradle.properties hoặc JVM của Gradle |
PKIX path building failed, unable to find valid certification path |
Proxy công ty giải mã HTTPS |
Kho chứng chỉ của JDK |
java.net.ConnectException: Connection refused: connect |
Sai cổng hoặc proxy không chạy |
Địa chỉ proxy |
java.net.UnknownHostException: tên máy proxy |
Sai tên máy proxy hoặc DNS nội bộ |
Địa chỉ proxy |
Could not transfer artifact, status code 407 |
Maven không có tài khoản proxy |
settings.xml |
Connect timed out khi Gradle sync |
Gradle đi thẳng vì thiếu proxy cho https |
systemProp.https |
Hộp thoại mật khẩu proxy hiện mỗi lần mở |
Chưa đánh dấu Remember |
HTTP Proxy của IDE |
Bốn chỗ cấu hình proxy trong một dự án IntelliJ
IntelliJ không phải một khối. Trang HTTP Proxy của IDE lo việc của chính IDE. Gradle chạy trong một tiến trình Java riêng gọi là daemon. Maven chạy theo settings.xml. Chương trình anh em viết chạy trong JVM riêng của cấu hình Run. Lỗi proxy của thành phần nào thì sửa ở cấu hình của thành phần đó.
Theo trang trợ giúp HTTP Proxy của IntelliJ IDEA 2026.2, thiết lập của IDE dùng cho tải plugin, kiểm giấy phép, đồng bộ cài đặt và các việc khác của IDE. Trang này không nói Gradle hay Maven dùng thiết lập đó. Thực tế cũng vậy: cài proxy trong IDE xong mà Gradle sync vẫn lỗi là chuyện rất thường.
Môi trường tái hiện lỗi proxy IntelliJ
Vì sao thử bằng Java thay vì bằng IDE
Gradle, Maven và phần mạng của IntelliJ đều chạy trên Java. Các thông báo như "Unable to tunnel through proxy" hay "PKIX path building failed" là câu của thư viện Java, Gradle và Maven in lại trong phần Caused by. Thử trực tiếp thư viện Java cho ra đúng những câu đó, mà đổi được từng thông số một cách chính xác.
Máy thử không cài IntelliJ, Gradle hay Maven, chỉ có Java 8 bản 1.8.0_401. Mình dùng công cụ jjs đi kèm Java 8 gọi tới kho Maven Central thật qua proxy HTTP và SOCKS5 tự dựng có mật khẩu p@ss#2026, nhật ký proxy ghi mọi kết nối. Bản Java mới hơn cho cùng các thông báo này.
Đọc lỗi Gradle sync ở đâu
Khi Gradle sync lỗi, cửa sổ Build ở dưới hiện dòng tóm tắt màu đỏ. Bấm vào dòng đó để mở toàn bộ thông báo, cuộn xuống phần Caused by cuối cùng. Câu ở đó mới là nguyên nhân. Dòng tóm tắt kiểu "Could not resolve all files for configuration" hay "Could not GET" chỉ cho biết có tải hỏng, không cho biết vì sao.
Lỗi proxy IntelliJ 407: Unable to tunnel through proxy
Nguyên văn thông báo
Khi proxy đòi tài khoản mà Java không gửi được, thông báo là:
java.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.1 407 Proxy Authentication Required"
Chữ tunnel cho biết Java đang mở đường hầm CONNECT tới một địa chỉ HTTPS, ở đây là repo.maven.apache.org. Với địa chỉ http thường, câu khác hẳn: "Server returned HTTP response code: 407 for URL". Hai câu cùng là 407 nhưng nhìn câu là biết đích là HTTPS hay HTTP.
Mật khẩu đúng mà vẫn 407
Đây là bẫy lớn nhất. Từ Java 8 bản cập nhật 111, Java mặc định tắt xác thực Basic cho đường hầm HTTPS, qua thuộc tính jdk.http.auth.tunneling.disabledSchemes. Mình thử với một chương trình đã có sẵn tên và mật khẩu đúng: kết quả vẫn 407. Nhật ký proxy ghi Java gửi CONNECT không kèm tài khoản, nhận 407 rồi dừng, không gửi lại.
Thêm thuộc tính jdk.http.auth.tunneling.disabledSchemes để trống, cùng chương trình trả 200. Nhật ký ghi lần thứ hai Java gửi kèm tài khoản user1. Với Gradle, thêm vào gradle.properties trong thư mục .gradle của người dùng:
org.gradle.jvmargs=-Djdk.http.auth.tunneling.disabledSchemes= -Djdk.http.auth.proxying.disabledSchemes=
systemProp.jdk.http.auth.tunneling.disabledSchemes=
systemProp.jdk.http.auth.proxying.disabledSchemes=
Dòng systemProp đặt thuộc tính cho tiến trình Gradle. Nếu dự án đã có org.gradle.jvmargs với giá trị khác như -Xmx, nối các tham số -D vào cùng dòng chứ đừng ghi đè. Thay đổi này nới một mặc định an toàn của Java, chỉ dùng khi proxy bắt buộc Basic. Bài Java proxy giải thích thêm về thuộc tính này.
407 vì thiếu tài khoản cho https
Trường hợp thứ hai: anh em chỉ khai báo systemProp.http.proxyUser mà quên dòng https. Gradle tải từ kho HTTPS nên đọc nhóm https, không có tài khoản, proxy trả 407. Theo tài liệu proxy của Gradle, nhóm http và nhóm https khai báo riêng:
systemProp.http.proxyHost=proxy.example.com
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=user1
systemProp.http.proxyPassword=matkhau
systemProp.http.nonProxyHosts=*.noibo.local|localhost
systemProp.https.proxyHost=proxy.example.com
systemProp.https.proxyPort=8080
systemProp.https.proxyUser=user1
systemProp.https.proxyPassword=matkhau
systemProp.https.nonProxyHosts=*.noibo.local|localhost
Danh sách bỏ qua nối bằng dấu gạch đứng, khác ô No proxy for của IDE dùng dấu phẩy. Chép từ IDE sang Gradle mà quên đổi dấu thì danh sách không khớp.
Ký tự đặc biệt trong mật khẩu ở gradle.properties
gradle.properties là file properties của Java, có luật đọc riêng. Mình thử nạp một file mẫu bằng chính lớp Properties của Java. Mật khẩu p@ss#2026 ở giữa dòng được đọc nguyên văn, dấu @ và # không cần mã hóa như trong địa chỉ URL. Nhưng dấu gạch chéo ngược bị nuốt: dòng ghi ab\cd được đọc thành abcd, mất ký tự. Muốn giữ dấu gạch chéo ngược trong mật khẩu, phải ghi hai lần.
Một bẫy khác: dấu cách thừa ở cuối dòng được giữ lại và trở thành một phần mật khẩu. Dòng có dấu cách sau mật khẩu, do chép từ email hay tin nhắn, sẽ cho 407 dù nhìn bằng mắt thấy đúng. Bật hiển thị ký tự trắng trong trình soạn của IntelliJ để kiểm.
Proxy NTLM của công ty
Tài liệu Gradle cho hai cách khai báo tên miền NTLM: ghi tên dạng domain/username trong proxyUser, hoặc đặt thuộc tính http.auth.ntlm.domain. Diễn đàn Gradle có nhiều báo cáo proxy Kerberos hoặc nhiều kiểu xác thực khó cấu hình. Khi thử mọi cách vẫn 407, chạy một proxy trung gian cục bộ như CNTLM hoặc Px, rồi trỏ Gradle về 127.0.0.1 không mật khẩu.

Unable to tunnel through proxy 407
Lỗi proxy IntelliJ khi Gradle đi thẳng hoặc không tới được proxy
Chỉ khai báo http, Gradle đi thẳng với https
Mình đặt riêng http.proxyHost rồi gọi địa chỉ https của Maven Central. Kết quả trả 200, nhưng nhật ký proxy không ghi kết nối nào. Java đã đi thẳng ra Internet, bỏ qua proxy, vì đích HTTPS chỉ đọc nhóm https.proxyHost. Ở nhà, lỗi này vô hình vì đi thẳng vẫn chạy. Trong mạng công ty chỉ cho ra ngoài qua proxy, nó thành lỗi hết giờ kiểu "Connect timed out".
Nếu Gradle sync chạy ở nhà mà lỗi hết giờ ở công ty, kiểm ngay xem gradle.properties có đủ nhóm https không.
Connection refused: sai cổng hoặc proxy đã tắt
Cổng proxy sai cho ra "java.net.ConnectException: Connection refused: connect". Với SOCKS, câu là "java.net.SocketException: Connection refused: connect". Cả hai nghĩa là máy proxy không nghe ở cổng đó. Kiểm lại cổng nhà cung cấp gửi, hoặc kiểm proxy cục bộ như CNTLM còn chạy không.
UnknownHostException: tên máy proxy không tra được
Ghi sai tên máy proxy cho ra "java.net.UnknownHostException" kèm chính tên đó. Lỗi này hay gặp khi proxy công ty có tên nội bộ, kiểu proxy.congty.local, mà máy đang ở ngoài mạng công ty hoặc chưa bật VPN. Lưu ý thông báo ghi tên máy proxy, không phải tên kho. Nếu thông báo ghi tên kho, nghĩa là Java đang đi thẳng và tự tra tên miền kho.
Daemon Gradle giữ cấu hình cũ
Gradle giữ một daemon chạy nền để dựng nhanh hơn. Đổi gradle.properties xong mà lỗi không đổi, có thể daemon cũ vẫn chạy với thuộc tính cũ. Chạy gradlew --stop trong Terminal của IntelliJ để dừng daemon, rồi sync lại. Tài liệu Gradle ghi gradle.properties ở thư mục người dùng thắng file trong dự án, nên kiểm cả hai file.
Gradle JDK khác JDK của dự án
Trong Settings, Build, Execution, Deployment, Build Tools, Gradle có ô Gradle JVM. Daemon Gradle chạy bằng JDK đó, không phải JDK của dự án. Nếu anh em đã nhập chứng chỉ công ty vào một JDK nhưng Gradle JVM là JDK khác, lỗi chứng chỉ vẫn còn. Phần sau nói chi tiết.
Lỗi proxy IntelliJ về chứng chỉ: PKIX path building failed
Nguyên văn và ý nghĩa
Mình giả lập proxy công ty giải mã HTTPS bằng một máy chủ dùng chứng chỉ tự ký. Java báo:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Câu này nghĩa là Java không tìm được chuỗi tin cậy từ chứng chỉ máy chủ đưa ra tới một chứng chỉ gốc trong kho của JDK. Với proxy giải mã HTTPS, chứng chỉ máy chủ được ký bởi chứng chỉ của công ty, mà kho cacerts của JDK không có chứng chỉ đó.
IDE chạy mà Gradle lỗi
IntelliJ có kho chứng chỉ riêng ở Settings, Appearance & Behavior, System Settings, Server Certificates, có thể tin chứng chỉ hệ điều hành và hỏi anh em có chấp nhận chứng chỉ lạ không. Vì vậy IDE cài plugin được, trong khi Gradle chạy bằng JDK riêng vẫn báo PKIX. Một chỗ chạy không có nghĩa chỗ khác cũng chạy.
Cách sửa đúng
Cách bền nhất là nhập chứng chỉ gốc của công ty vào kho cacerts của JDK mà Gradle JVM đang dùng, bằng công cụ keytool:
keytool -importcert -alias congty-ca -file C:\certs\congty-ca.cer -keystore "%JAVA_HOME%\lib\security\cacerts" -storepass changeit
Trên Windows, một cách khác là cho JVM của Gradle dùng kho chứng chỉ của Windows bằng tham số -Djavax.net.ssl.trustStoreType=Windows-ROOT trong org.gradle.jvmargs. Cách này không phải làm lại mỗi lần cập nhật JDK, nếu bộ phận IT đã cài chứng chỉ công ty vào Windows.
Không tắt kiểm tra chứng chỉ. Mọi hướng dẫn bảo thêm tham số bỏ qua xác minh đều mở đường cho kẻ đứng giữa sửa thư viện tải về.

PKIX: JDK không tin chứng chỉ công ty
Gradle Wrapper lỗi ngay từ bước tải Gradle
Dự án dùng gradlew sẽ tải bản Gradle từ services.gradle.org ở lần chạy đầu. Nếu proxy chưa đúng, lỗi xuất hiện trước cả khi sync bắt đầu, ngay sau dòng "Downloading https://services.gradle.org/distributions/...". Câu lỗi vẫn là các câu Java ở trên: Unable to tunnel through proxy, Connection refused hay PKIX.
Wrapper đọc các dòng systemProp trong gradle.properties, nên cùng một khai báo sửa được cả bước tải Gradle lẫn bước tải thư viện. Nếu công ty chặn services.gradle.org, có thể sửa distributionUrl trong file gradle-wrapper.properties trỏ về bản Gradle đặt trên kho nội bộ. Việc này nên thống nhất với cả nhóm, vì file đó nằm trong kho mã.
Đọc lỗi bằng --info thay vì đoán
Khi dòng Caused by vẫn chưa đủ rõ, chạy lại trong Terminal với tham số --info hoặc --debug. Gradle in từng địa chỉ đang tải và proxy đang dùng. Tìm dòng có địa chỉ kho bị lỗi, xem ngay trước đó Gradle báo dùng proxy nào hay kết nối thẳng. Cách này phân biệt được lỗi do không đi proxy với lỗi do proxy từ chối.
Lỗi proxy IntelliJ khi Maven import dự án
Maven đọc settings.xml
Plugin Maven của IntelliJ đọc proxy trong settings.xml, mặc định ở thư mục .m2 của người dùng. Vào Settings, Build, Execution, Deployment, Build Tools, Maven để xem ô User settings file đang trỏ tới file nào. Nhiều người sửa một file settings.xml trong khi IntelliJ đọc file khác.
Khối proxy tối thiểu:
<proxies>
<proxy>
<id>congty</id>
<active>true</active>
<protocol>http</protocol>
<host>proxy.example.com</host>
<port>8080</port>
<username>user1</username>
<password>matkhau</password>
<nonProxyHosts>localhost|*.noibo.local</nonProxyHosts>
</proxy>
</proxies>
Ô protocol ghi http kể cả khi kho là HTTPS. Đây là loại kết nối tới proxy, không phải tới kho.
Đọc lỗi Maven
Khi Maven không qua được proxy, cửa sổ Build ghi dạng "Could not transfer artifact" kèm tên thư viện, theo sau là nguyên nhân. Có mã 407 là chuyện tài khoản. Có chữ PKIX là chuyện chứng chỉ, sửa như phần trên. Có Connection refused hay UnknownHost là chuyện địa chỉ proxy. Cùng bộ thông báo Java như Gradle, chỉ khác chỗ cấu hình.
Maven bản đi kèm và Maven của máy
IntelliJ có Maven đi kèm, ô Maven home path chọn bản đi kèm hoặc bản cài trên máy. Hai bản dùng chung settings.xml ở thư mục người dùng, nhưng bản cài trên máy còn có file settings.xml riêng trong thư mục conf. Proxy khai báo ở file đó chỉ có tác dụng khi IntelliJ chọn đúng bản cài đó.
Mirror và kho nội bộ
Dự án công ty thường dùng mirror trỏ về Nexus hay Artifactory nội bộ. Kho nội bộ phải nằm trong nonProxyHosts, nếu không Maven đẩy yêu cầu ra proxy ngoài và nhận lỗi 502 hoặc hết giờ. Bài Maven Gradle proxy có phần riêng về kho nội bộ.
Lỗi proxy IntelliJ khi tải plugin, JDK và cập nhật
Check Connection thành công mà plugin không tải được
Nút Check Connection thử một địa chỉ anh em nhập. Thử với một trang bất kỳ thành công không có nghĩa kho plugin cũng qua. Thử lại với plugins.jetbrains.com. Proxy công ty có thể chặn riêng tên miền đó, khi đó cần IT mở. Một cách tạm là tải file plugin bằng trình duyệt rồi cài bằng Install Plugin from Disk trong trang Plugins.
Hộp thoại mật khẩu proxy hiện mỗi lần mở
Trang trợ giúp ghi rõ: không đánh dấu Remember thì IDE hỏi mật khẩu proxy mỗi lần kết nối đầu tiên sau khi mở. Đánh dấu Remember để lưu. Mật khẩu proxy vừa đổi mà IDE vẫn gửi mật khẩu cũ thì bấm Clear Passwords ở chế độ Auto-detect proxy settings rồi nhập lại.
File PAC không chạy
Trang trợ giúp có ghi chú: file PAC lưu dạng UTF-8 có BOM sẽ không chạy. Notepad có thể lưu kèm BOM. Lưu lại dạng UTF-8 không BOM rồi điền vào ô Automatic proxy configuration URL. Bài PAC proxy giải thích file PAC.
Tải JDK từ trong IDE
Mục tải JDK trong Project Structure là việc của IDE, nên đi theo HTTP Proxy của IDE. Nếu tải JDK lỗi trong khi plugin tải được, có thể máy chủ phân phối JDK nằm trên tên miền proxy công ty chặn. Đọc idea.log, mở bằng Help, Show Log in Explorer, tìm tên miền bị lỗi.
Lỗi proxy IntelliJ với SOCKS và chương trình chạy thử
SOCKS có mật khẩu
Trang HTTP Proxy cho chọn SOCKS và có ô tài khoản. Với Java, SOCKS cần chương trình tự cung cấp tên và mật khẩu qua Authenticator. Mình thử Java với socksProxyHost mà không có tài khoản: Java tự gửi tên người dùng Windows kèm mật khẩu rỗng, proxy từ chối với lỗi "SOCKS : authentication failed". Gradle và Maven không đọc tài khoản SOCKS từ IDE. Với các công cụ dựng mã, ưu tiên proxy HTTP.
Chương trình chạy bằng Run không thừa hưởng proxy
Chương trình Java chạy bằng nút Run là một JVM mới, không có proxy của IDE hay của Gradle. Thêm vào ô VM options của Run Configuration các tham số như -Dhttps.proxyHost=proxy.example.com -Dhttps.proxyPort=8080. Nhớ thêm nhóm https, vì như đã thử, chỉ có nhóm http thì đích HTTPS đi thẳng. Với chương trình cần tài khoản proxy, thuộc tính https.proxyUser không đủ, vì thư viện mạng chuẩn HttpURLConnection của Java không đọc nó. Mình đã thử đặt riêng http.proxyUser và http.proxyPassword cho một chương trình gọi qua proxy có mật khẩu, kết quả vẫn 407, proxy ghi nhận không có tài khoản nào được gửi. Chương trình phải tự đặt Authenticator trong mã, và vẫn cần thuộc tính disabledSchemes để trống nếu proxy dùng Basic. Để đỡ phải sửa từng Run Configuration, có thể tạo một mẫu ở mục Edit Configuration Templates, mọi cấu hình mới tạo sau đó tự có các tham số proxy.
Spring Boot và các thư viện HTTP khác
Nhiều thư viện HTTP không đọc thuộc tính hệ thống của Java. Một số client HTTP phổ biến cần cấu hình proxy trong mã, không tự đọc https.proxyHost. Khi chương trình vẫn đi thẳng dù đã có VM options, kiểm tài liệu của thư viện đang dùng.

Bốn chỗ cấu hình proxy riêng
Lỗi proxy IntelliJ trong mạng công ty: phối hợp với bộ phận IT
Trong mạng công ty, phần lớn lỗi proxy không sửa được từ máy lập trình mà cần bộ phận IT. Báo đúng thông tin giúp xử lý trong vài phút thay vì vài ngày.
Thông tin nên gửi kèm
- Câu lỗi nguyên văn ở dòng Caused by cuối cùng, không chỉ dòng tóm tắt.
- Địa chỉ kho bị lỗi, ví dụ repo.maven.apache.org hay plugins.gradle.org.
- Thời điểm lỗi, để IT tra nhật ký proxy.
- Kết quả lệnh curl qua proxy tới cùng địa chỉ.
- Đang ở văn phòng hay qua VPN, vì hai đường có thể đi qua hai proxy khác nhau.
Danh sách tên miền hay cần mở
Một dự án Java hay Android thường cần các tên miền sau đi qua được proxy: repo.maven.apache.org cho Maven Central, services.gradle.org và downloads.gradle.org cho Gradle, plugins.gradle.org cho plugin Gradle, dl.google.com cho thư viện Android, plugins.jetbrains.com cho plugin IDE. Dự án dùng thêm kho khác thì thêm tên miền của kho đó. Các kho hay gặp thêm là jitpack.io cho thư viện lấy thẳng từ GitHub, và maven.pkg.github.com cho gói đăng trên GitHub Packages. Ghi rõ cần cổng 443 và cho phép kết nối CONNECT, vì một số proxy chặn đường hầm tới tên miền lạ. Gửi danh sách này cho IT một lần, đỡ phải báo lỗi từng tên miền.
Những gì không nên tự làm
Không tự tắt kiểm tra chứng chỉ, không tự dựng đường vòng qua proxy ngoài để tránh proxy công ty. Chính sách mạng thường cấm việc này, và nó tạo rủi ro thật cho mã nguồn của công ty. Nếu proxy công ty chậm hoặc chặn quá nhiều, đề nghị IT dựng kho bộ đệm nội bộ như Nexus hay Artifactory. Máy lập trình khi đó chỉ cần nói chuyện với kho nội bộ, không phải ra Internet.
Kho bộ đệm nội bộ giải quyết gốc vấn đề
Với kho bộ đệm, chỉ máy chủ kho cần đi qua proxy ra ngoài, và việc đó IT cấu hình một lần. Máy lập trình trỏ Maven mirror và Gradle repositories về kho nội bộ, thêm kho nội bộ vào danh sách bỏ qua proxy. Lỗi 407, PKIX hay hết giờ gần như biến mất khỏi máy lập trình, thời gian sync cũng nhanh hơn vì thư viện đã nằm sẵn trong mạng nội bộ.
Quy trình kiểm lỗi proxy IntelliJ theo từng lớp
Kiểm proxy ngoài IntelliJ trước
Mở Terminal tích hợp, chạy curl qua đúng proxy tới kho Maven Central:
curl -x "http://user1:matkhau@proxy.example.com:8080" -I https://repo.maven.apache.org/maven2/
Trả về HTTP/1.1 200 là proxy và tài khoản đúng. Trả 407 là tài khoản sai. Không kết nối được là địa chỉ hoặc mạng. Mật khẩu có @ hay # thì mã hóa thành %40 và %23 trong lệnh curl, còn trong gradle.properties và settings.xml thì ghi nguyên văn.
Kiểm từng thành phần
1. IDE: Settings, HTTP Proxy, Check Connection với plugins.jetbrains.com.
2. Gradle: chạy gradlew --stop, rồi gradlew dependencies --refresh-dependencies --info, đọc dòng Caused by.
3. Maven: chạy lệnh mvn với tham số -X để in chi tiết, hoặc xem cửa sổ Build khi Reload project.
4. Chương trình: chạy với VM options có proxy, in ra System.getProperty("https.proxyHost") ở đầu chương trình để chắc thuộc tính đã vào.
Script tái hiện lỗi bằng đúng thư viện Java
curl dùng thư viện mạng khác Java, nên đôi khi curl chạy mà Java vẫn lỗi, nhất là với bẫy Basic bị tắt hay chứng chỉ. Đây là script mình dùng trong bài, chạy bằng công cụ jjs có sẵn trong Java 8 tới Java 14. Nó gọi một địa chỉ qua đúng cơ chế mà Gradle và Maven dùng, rồi in nguyên văn lỗi:
// jjs thu.js -- <ten> <url> [auth]
var URL = Java.type("java.net.URL");
var Authenticator = Java.type("java.net.Authenticator");
var PA = Java.type("java.net.PasswordAuthentication");
var ten = arguments[0], url = arguments[1];
if (arguments[2] == "auth") {
var A = Java.extend(Authenticator, { getPasswordAuthentication: function() { return new PA("user1", "p@ss#2026".split("")); } });
Authenticator.setDefault(new A());
}
try { var c = new URL(url).openConnection(); c.setConnectTimeout(8000); c.setReadTimeout(8000); c.getInputStream().close(); print(ten + ": OK"); }
catch (e) { var x = e.getClass ? e : e; print(ten + ": " + (e.javaException ? e.javaException : e)); }
Lưu thành thu.js, sửa tên và mật khẩu trong dòng PasswordAuthentication, rồi chạy:
jjs -J-Dhttps.proxyHost=proxy.example.com -J-Dhttps.proxyPort=8080 thu.js -- thu https://repo.maven.apache.org/maven2/ auth
Kết quả "Unable to tunnel through proxy" với 407 trong khi tài khoản đúng là dấu hiệu bẫy Basic. Chạy lại với thêm -J-Djdk.http.auth.tunneling.disabledSchemes= để xác nhận. Kết quả OK nghĩa là Java qua được proxy, lỗi còn lại nằm ở cấu hình Gradle hay Maven chưa nhận thuộc tính. Với JDK 15 trở lên không còn jjs, viết lại vài dòng trên bằng Java trong một lớp có hàm main, logic giữ nguyên.
Chọn proxy để giảm lỗi
Máy lập trình hợp nhất với proxy HTTP cố định, xác thực theo IP, cho CONNECT tới cổng 443. Không có mật khẩu thì không gặp bẫy Basic bị tắt, không phải khai báo tài khoản ở bốn chỗ. Bài xác thực proxy bằng IP whitelist hay user password so sánh hai cách. Khi cần proxy HTTP ổn định cho máy dựng mã, anh em có thể mua proxy uy tín tại trang chủ ProxyVN rồi kiểm bằng curl như trên trước khi khai báo.
Câu hỏi thường gặp về lỗi proxy IntelliJ
Có cách nào cho Gradle dùng luôn proxy của IDE không. Không có cách tự động cho mọi trường hợp. Gradle chạy ở tiến trình riêng và đọc gradle.properties. Khai báo một lần ở gradle.properties trong thư mục người dùng là đủ cho mọi dự án.
Vì sao Gradle sync chạy trên máy đồng nghiệp mà máy mình lỗi. So sánh gradle.properties ở thư mục người dùng của hai máy, và ô Gradle JVM. Hai máy có thể dùng hai JDK khác nhau, một cái đã có chứng chỉ công ty, một cái chưa.
Lỗi chỉ xảy ra với một thư viện. Thư viện đó có thể nằm ở kho khác, như kho của Google cho Android hay JitPack. Proxy công ty có thể chặn riêng tên miền kho đó. Đọc địa chỉ trong thông báo lỗi để biết kho nào.
Có nên lưu mật khẩu proxy trong gradle.properties của dự án không. Không. File trong dự án thường được đưa lên kho mã. Đặt ở gradle.properties trong thư mục người dùng, hoặc dùng proxy xác thực theo IP.
Proxy xoay có dùng được cho Gradle không. Được nhưng không nên. Một lần sync tải hàng trăm file, IP đổi giữa chừng có thể làm kho thư viện giới hạn tốc độ. Máy lập trình cần IP cố định.
Thêm disabledSchemes rồi mà vẫn 407. Kiểm daemon Gradle đã dừng chưa, rồi kiểm proxy có đúng là Basic không. Proxy NTLM hay Kerberos thì thuộc tính này không giúp gì, cần cấu hình NTLM hoặc proxy trung gian cục bộ. Đọc tiêu đề Proxy-Authenticate trong phản hồi bằng curl -v để biết proxy đòi kiểu xác thực nào.
IntelliJ báo chứng chỉ lạ mỗi lần mở dự án. IDE phát hiện kết nối dùng chứng chỉ không nằm trong kho tin cậy, thường là chứng chỉ của proxy công ty. Nếu đã xác nhận với IT đó là chứng chỉ của công ty, chấp nhận trong hộp thoại hoặc thêm vào Server Certificates. Nếu không rõ nguồn gốc, đừng chấp nhận.
Android Studio có giống IntelliJ không. Android Studio dựng trên IntelliJ nên có cùng trang HTTP Proxy và cùng cách Gradle đọc proxy. Các lỗi trong bài áp dụng được.

Kiểm lỗi proxy theo từng lớp
Lỗi proxy IntelliJ: những điều cần nhớ
Lỗi proxy IntelliJ thường do Gradle, Maven có cấu hình riêng. 407 với HTTPS khi mật khẩu đúng là do Java tắt Basic, thêm disabledSchemes rỗng. Khai báo đủ nhóm https, nhập chứng chỉ công ty vào đúng JDK, dừng daemon sau khi sửa. Cần proxy ổn định, liên hệ Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam.