ข้อผิดพลาดพร็อกซี Java 407: ตรวจสอบการยืนยันตัวตน Basic สำหรับ CONNECT
จำกัดข้อมูลรับรอง Java ให้ใช้กับพร็อกซีที่กำหนด และตรวจสอบนโยบาย Basic แยกต่างหากของ JDK สำหรับอุโมงค์ HTTPS CONNECT
การพบ 407 ซ้ำไม่ได้แปลว่า Java ส่งรหัสผ่านผิดเสมอไป การใช้งานอ้างอิงของ JDK มักปิดการยืนยันตัวตน Basic สำหรับอุโมงค์ HTTPS CONNECT พร็อกซีที่เสนอเฉพาะ Basic อาจถูกปฏิเสธก่อนที่ callback การยืนยันตัวตนจะส่งข้อมูลรับรองให้เสียอีก
จำกัดขอบเขตของ callback ข้อมูลรับรอง
ผูก 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();
นี่คือโค้ดตั้งค่าไคลเอนต์หนึ่งตัว ไม่ใช่ตัวยืนยันตัวตนเริ่มต้นส่วนกลาง เปลี่ยนที่อยู่สำหรับเอกสารและใช้ข้อมูลรับรองที่ได้รับมาสำหรับบริการนั้นจริง ๆ การตรวจสอบประเภทผู้ร้องขอและปลายทางช่วยป้องกันไม่ให้ callback เดียวกันส่งบัญชีพร็อกซีอย่างไม่รอบคอบเมื่อตอบรับคำท้าการยืนยันตัวตนจากเว็บไซต์
ตรวจสอบว่าขั้นตอนการยืนยันตัวตนใดล้มเหลว
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 ที่กำหนดเองด้วยมือจะเปลี่ยนกระบวนการของตัวยืนยันตัวตนอัตโนมัติ จึงควรตรวจสอบส่วนหัวที่ปรับแต่งเมื่อ callback ทำงานต่างจากตัวอย่าง