Tidak dapat mengautentikasi dengan klien http Apache 4.5 menggunakan cache tiket kerberos

Saya menjalankan permintaan https ke layanan REST yang diautentikasi kerberos. Semuanya baik-baik saja jika saya menggunakan keytab. Namun, saya memiliki persyaratan bahwa saya harus menggunakan file cache tiket kerberos yang dibuat ketika seseorang masuk ke stasiun kerja menggunakan kata sandinya.

Saya akan mengganti domainnya dengan MY_DOMAINE.COM

Jadi, klist menunjukkan:

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

Menggunakan curl seperti ini berfungsi dengan baik:

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

Sekarang, mari kita kembali ke kode. Login.conf saya seperti ini:

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;
};

Kode Java yang relevan untuk klien http saya yang disiapkan untuk kerberos adalah:

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);
}

Sebelum ini, saya mengatur properti Java ini:

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

Output dari log kerberos adalah:

Dimuat dari konfigurasi 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

Jadi menurut saya tiket sudah dibaca tetapi tidak ada kredensial yang diambil darinya karena saya menerimanya di akhir 401.

Haruskah saya melakukan sesuatu yang khusus pada klien http Apache 4.5 untuk menggunakan tiket tacke?

Salam


person adragomir    schedule 15.05.2018    source sumber
comment
Sesuatu yang terkait, saya percaya stackoverflow.com/questions/45463635/. Lihat juga stackoverflow .com/questions/48411107/   -  person Tarun Lalwani    schedule 17.05.2018


Jawaban (3)


Berdasarkan kesalahan: unsupported key type found the default TGT: 18

Tipe 18 = aes-256-cts-hmac-sha1-96 (Lihat Parameter IANA Kerberos)

Saya rasa Anda menggunakan JRE dengan kebijakan JCE berkekuatan terbatas dan harus menetapkan kebijakan JCE berkekuatan tidak terbatas.

Di situs pengunduhan Oracle untuk Oracle JRE. Periksa di Sumber Daya Tambahan, File Kebijakan Yurisdiksi Kekuatan Tak Terbatas Java Cryptography Extension (JCE) untuk JDK/JRE 8

Unduhan Oracle Java SE

Lihat juga: Catatan teknis Oracle Java SE 8 jgss

CATATAN: Kerangka kerja JCE dalam JDK mencakup kemampuan untuk menerapkan pembatasan mengenai algoritma kriptografi dan kekuatan kriptografi maksimum yang tersedia untuk aplikasi. Pembatasan tersebut ditentukan dalam "file kebijakan yurisdiksi". File kebijakan yurisdiksi yang digabungkan dalam Java SE membatasi panjang kunci maksimum. Oleh karena itu, untuk menggunakan jenis enkripsi AES256, Anda perlu menginstal kebijakan kripto JCE dengan versi tidak terbatas untuk mengizinkan AES dengan kunci 256-bit.

Menguji kebijakan Anda (sumber):

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

Mulai awal tahun 2018, Oracle JDK di semua versi yang didukung mulai dikirimkan dengan kebijakan JCE kekuatan tak terbatas default:

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

Lihat juga solusi menarik ini dengan refleksi, dan kemungkinan pengaturan override untuk JRE9: https://stackoverflow.com/a/22492582/2824577

person Gerrit    schedule 23.05.2018
comment
itu dia! Saya telah menginstal jdk terbuka yang telah menginstalnya, tetapi proyek saya menggunakan Oracle jdk yang tidak - person adragomir; 24.05.2018

mmm...

Prinsipal default: dragomira@MY_DOMAINE.COM

Kepala klien DEBUG adalah dragomira@MY_DOMANIN.COM

DOMANIN?

person OptimalChoice    schedule 22.05.2018

Saya melakukan hal yang sama di aplikasi boot musim semi. Saya dapat melakukan panggilan istirahat menggunakan tiket cache (users/conf/krb5_xyz) dan diautentikasi dengan benar.

klien kerja saya:

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