ไม่สามารถตรวจสอบสิทธิ์กับไคลเอนต์ apache http 4.5 โดยใช้แคชตั๋ว kerberos

ฉันกำลังดำเนินการคำขอ https ไปยังบริการ REST ที่ได้รับการรับรองความถูกต้องของ Kerberos ทุกอย่างเรียบร้อยดีถ้าฉันใช้แท็บปุ่มกด อย่างไรก็ตาม ฉันมีข้อกำหนดว่าฉันควรใช้ไฟล์แคชตั๋ว Kerberos ซึ่งสร้างขึ้นเมื่อมีการเข้าสู่ระบบเวิร์กสเตชันโดยใช้รหัสผ่าน

ฉันจะแทนที่โดเมนด้วย MY_DOMAINE.COM

ดังนั้น klist จะแสดง:

Ticket cache: FILE:/tmp/krb5cc_210007
Default principal: dragomira@MY_DOMAINE.COM

Valid starting     Expires            Service principal
05/15/18 07:21:51  05/15/18 17:21:51  krbtgt/MY_DOMAINE.COM@MY_DOMAINE.COM
        renew until 05/22/18 06:18:22

การใช้ curl แบบนี้ก็ใช้ได้:

curl -k --negotiate -u :  'my_url' -v

ตอนนี้เรากลับมาที่โค้ดกันดีกว่า Login.conf ของฉันเป็นเช่นนี้:

com.sun.security.jgss.login {
  com.sun.security.auth.module.Krb5LoginModule required
  client=TRUE
  doNotPrompt=true
  useTicketCache=true;
};

com.sun.security.jgss.initiate {
  com.sun.security.auth.module.Krb5LoginModule required
  client=TRUE
  doNotPrompt=true
  useTicketCache=true;
};

com.sun.security.jgss.accept {
  com.sun.security.auth.module.Krb5LoginModule required
  client=TRUE
  doNotPrompt=true
  useTicketCache=true;
};

รหัสจาวาที่เกี่ยวข้องสำหรับไคลเอนต์ http ของฉันซึ่งมีไว้สำหรับ kerberos คือ:

try {
    SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (chain, authType) -> true).build();
    HostnameVerifier hostnameVerifier = new NoopHostnameVerifier();
    Registry<AuthSchemeProvider> authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create()
            .register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory())
            .build();
    Credentials dummyCredentials = new NullCredentials();
    CredentialsProvider credProv = new BasicCredentialsProvider();
    credProv.setCredentials(new AuthScope(null, -1, null), dummyCredentials);
    this.httpClient = HttpClientBuilder.create()
            .setDefaultAuthSchemeRegistry(authSchemeRegistry)
            .setDefaultCredentialsProvider(credProv)
            .setSSLContext(sslContext)
            .setSSLHostnameVerifier(hostnameVerifier)
            .build();
} catch (NoSuchAlgorithmException | KeyStoreException | KeyManagementException e) {
    throw new RuntimeException(e.getMessage(), e);
}

ก่อนหน้านี้ ฉันกำลังตั้งค่าคุณสมบัติ Java เหล่านี้:

java.security.auth.login.config=/home/dragomira/kerberos/login.conf
java.security.krb5.conf=/etc/krb5.conf
sun.security.krb5.debug=true
javax.security.auth.useSubjectCredsOnly=false

ผลลัพธ์ของบันทึก Kerberos คือ:

โหลดจากการกำหนดค่า Java

>>>KinitOptions cache name is /tmp/krb5cc_210007
>>>DEBUG <CCacheInputStream>  client principal is dragomira@MY_DOMANIN.COM
>>>DEBUG <CCacheInputStream> server principal is krbtgt/MY_DOMANIN.COM@MY_DOMANIN.COM
>>>DEBUG <CCacheInputStream> key type: 18
>>>DEBUG <CCacheInputStream> auth time: Tue May 15 06:18:22 EDT 2018
>>>DEBUG <CCacheInputStream> start time: Tue May 15 07:21:51 EDT 2018
>>>DEBUG <CCacheInputStream> end time: Tue May 15 17:21:51 EDT 2018
>>>DEBUG <CCacheInputStream> renew_till time: Tue May 22 06:18:22 EDT 2018
>>> CCacheInputStream: readFlags()  FORWARDABLE; RENEWABLE; INITIAL; PRE_AUTH;
>>>DEBUG <CCacheInputStream>  client principal is dragomira@MY_DOMANIN.COM
>>>DEBUG <CCacheInputStream> server principal is HTTP/configuration.prd.int.MY_DOMANIN.COM@MY_DOMANIN.COM
>>>DEBUG <CCacheInputStream> key type: 23
>>>DEBUG <CCacheInputStream> auth time: Tue May 15 06:18:22 EDT 2018
>>>DEBUG <CCacheInputStream> start time: Tue May 15 07:57:49 EDT 2018
>>>DEBUG <CCacheInputStream> end time: Tue May 15 17:21:51 EDT 2018
>>>DEBUG <CCacheInputStream> renew_till time: Tue May 22 06:18:22 EDT 2018
>>> CCacheInputStream: readFlags()  FORWARDABLE; RENEWABLE; PRE_AUTH;
>>> unsupported key type found the default TGT: 18

สำหรับฉันแล้วดูเหมือนว่าตั๋วถูกอ่านแล้วแต่ไม่มีการดึงข้อมูลประจำตัวออกมาเนื่องจากฉันได้รับในตอนท้าย 401

ฉันต้องทำอะไรบางอย่างเป็นพิเศษกับ apache http client 4.5 เพื่อใช้ตั๋วหรือไม่

ขอแสดงความนับถือ


comment
ฉันเชื่อว่ามีสิ่งที่เกี่ยวข้อง stackoverflow.com/questions/45463635/ นอกจากนี้ โปรดดู stackoverflow .com/questions/48411107/   -  person Tarun Lalwani    schedule 17.05.2018


คำตอบ (3)


ตามข้อผิดพลาด: unsupported key type found the default TGT: 18

ประเภท 18 = aes-256-cts-hmac-sha1-96 (ดู พารามิเตอร์ IANA Kerberos)

ฉันคิดว่าคุณกำลังใช้ JRE ที่มีนโยบาย JCE ที่มีความแข็งแกร่งจำกัด และต้องกำหนดนโยบาย JCE ที่มีความแข็งแกร่งไม่จำกัด

บนไซต์ดาวน์โหลด Oracle สำหรับ Oracle JRE ตรวจสอบภายใต้แหล่งข้อมูลเพิ่มเติม ไฟล์นโยบายเขตอำนาจศาลความแรงไม่จำกัดของ Java Cryptography Extension (JCE) สำหรับ JDK/JRE 8

การดาวน์โหลด Oracle Java SE

ดูเพิ่มเติม: เทคโน้ต Oracle Java SE 8 เจ็กส์

หมายเหตุ: กรอบงาน JCE ภายใน JDK มีความสามารถในการบังคับใช้ข้อจำกัดเกี่ยวกับอัลกอริธึมการเข้ารหัสและจุดแข็งของการเข้ารหัสสูงสุดที่มีให้สำหรับแอปพลิเคชัน ข้อจำกัดดังกล่าวระบุไว้ใน "ไฟล์นโยบายเขตอำนาจศาล" ไฟล์นโยบายเขตอำนาจศาลที่รวมอยู่ใน Java SE จะจำกัดความยาวคีย์สูงสุด ดังนั้น หากต้องการใช้ประเภทการเข้ารหัส AES256 คุณจะต้องติดตั้งนโยบายการเข้ารหัส JCE ด้วยเวอร์ชันไม่จำกัด เพื่ออนุญาต AES ด้วยคีย์ 256 บิต

การทดสอบนโยบายของคุณ (แหล่งที่มา):

jrunscript -e 'print (javax.crypto.Cipher.getMaxAllowedKeyLength("AES") >= 256);'

ตั้งแต่ต้นปี 2018 Oracle JDK ในเวอร์ชันที่รองรับทั้งหมดจะเริ่มจัดส่งพร้อมกับนโยบาย JCE ความแข็งแกร่งแบบไม่จำกัดเริ่มต้น:

https://bugs.openjdk.java.net/browse/JDK-8189377

ดูวิธีแก้ปัญหาที่น่าสนใจเหล่านี้ด้วยการสะท้อนและการตั้งค่าการแทนที่ที่เป็นไปได้สำหรับ JRE9: https://stackoverflow.com/a/22492582/2824577< /ก>

person Gerrit    schedule 23.05.2018
comment
นั่นมัน! ฉันติดตั้ง open jdk ซึ่งติดตั้งไว้แล้ว แต่โปรเจ็กต์ของฉันใช้ oracle jdk ซึ่งไม่ได้ติดตั้ง - person adragomir; 24.05.2018

อืม...

เงินต้นเริ่มต้น: Dragomira@MY_DOMAINE.COM

ลูกค้าหลักของ DEBUG คือ Dragomira@MY_DOMANIN.COM

โดมานิน?

person OptimalChoice    schedule 22.05.2018

ฉันกำลังทำสิ่งเดียวกันในแอปพลิเคชัน Spring Boot ฉันสามารถโทรที่เหลือโดยใช้ตั๋วแคช (users/conf/krb5_xyz) และรับรองความถูกต้องอย่างถูกต้อง

ลูกค้าที่ทำงานของฉัน:

public class Test {

    public static void main(String[] args) {


        Map<String, Object> loginOption = new HashMap<>();
        loginOption.put("refreshKrb5Config","true");
        loginOption.put("useTicketCache", "true");
        loginOption.put("ticketCache","h:/config/krb5cc_xyz");
        loginOption.put("doNotPrompt","true");
        loginOption.put("debug","true");

  /* 
option 1 : using keytab

KerberosRestTemplate restTemplate = new KerberosRestTemplate("C:\\Users\\xyz\\kerberos\\kerberos\\src\\main\\resources\\xyz.keytab", "[email protected]");*/

/* option 2: using cache */
       KerberosRestTemplate restTemplate = new KerberosRestTemplate(null , "-",loginOption);
        String response = restTemplate.getForObject("http://host:13080/xyz",String.class);
        System.out.println("Result"+response);


    }
person Ankur Dongre    schedule 09.08.2018