שגיאות פרוקסי 407 ב-Java: בדקו אימות Basic עבור CONNECT
הגבילו את פרטי ההתחברות של Java לפרוקסי ובדקו את מדיניות Basic הנפרדת של JDK למנהרות HTTPS CONNECT.
407 שחוזר על עצמו אינו אומר תמיד ש-Java שלחה סיסמה שגויה. מימוש הייחוס של JDK משבית בדרך כלל אימות Basic עבור מנהרות HTTPS CONNECT. פרוקסי שמציע Basic בלבד עשוי להידחות עוד לפני שפונקציית הקריאה החוזרת של האימות מספקת פרטי התחברות.
הגבילו את תחום הפעולה של הקריאה החוזרת לפרטי ההתחברות
חברו Authenticator אל לקוח HTTP של Java והגבילו אותו לפרוקסי שהוגדר:
String proxyHost = "203.0.113.10";
int proxyPort = 8080;
String password = System.getenv("PROXY_PASSWORD");
if (password == null) {
throw new IllegalStateException("Set PROXY_PASSWORD");
}
java.net.Authenticator auth = new java.net.Authenticator() {
@Override
protected java.net.PasswordAuthentication getPasswordAuthentication() {
if (getRequestorType() == RequestorType.PROXY
&& proxyHost.equals(getRequestingHost())
&& proxyPort == getRequestingPort()) {
return new java.net.PasswordAuthentication(
"proxy-user", password.toCharArray());
}
return null;
}
};
java.net.http.HttpClient client = java.net.http.HttpClient.newBuilder()
.proxy(java.net.ProxySelector.of(
new java.net.InetSocketAddress(proxyHost, proxyPort)))
.authenticator(auth)
.connectTimeout(java.time.Duration.ofSeconds(5))
.build();
זהו קוד הגדרה ללקוח אחד, ולא מאמת ברירת מחדל כללי. החליפו את כתובת התיעוד והשתמשו בפרטי התחברות שסופקו בפועל לשירות הזה. בדיקות סוג המבקש ונקודת הקצה מונעות מאותה קריאה חוזרת להציע בלי הבחנה את חשבון הפרוקסי בתגובה לאתגר אימות של אתר.
בדקו איזה שלב אימות נכשל
ל-JDK יש הגדרות נפרדות לסכמות מושבתות עבור תעבורת HTTP רגילה דרך פרוקסי ועבור מנהרות CONNECT. השמות הרלוונטיים הם jdk.http.auth.proxying.disabledSchemes ו-jdk.http.auth.tunneling.disabledSchemes.
כך ייתכן שאימות תעבורת HTTP יצליח, בעוד מנהרת HTTPS דרך אותו פרוקסי תיכשל. בדקו את conf/net.properties של סביבת הריצה ואת מדיניות הפריסה במקום להניח שבמחשב אחר חלות אותן ברירות מחדל בפועל.
ריקון רשימת הסכמות המושבתות באופן כללי אינו פתרון כולל לבעיות פרוקסי. פרטי Basic שנשלחים לפרוקסי HTTP בטקסט גלוי אינם מוגנים בחיבור ה-TLS שנוצר בהמשך אל היעד. בחנו את התעבורה אל הפרוקסי, את שיטת האימות ואת מדיניות הפריסה לפני אישור שינוי.
גם ההתנהגות המתועדת של האימות המובנה ב-JDK אינה הבטחה לתמוך בכל סכמה שהפרוקסי מפרסם. כותרת Authorization או Proxy-Authorization שמסופקת ידנית משנה את זרימת המאמת האוטומטי, לכן בדקו כותרות מותאמות כשהקריאה החוזרת פועלת אחרת מהדוגמה.