การพบ 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 ทำงานต่างจากตัวอย่าง

บทความที่เกี่ยวข้อง