#kerberos #apache-httpclient-4.x
Вопрос:
Я использую http-клиент apache версии 4.5.9, и у меня есть вопрос, связанный с проверкой подлинности kerberos и шифрованием подчеркивания.
Я выполняю вызов веб-службы на сервер, для которого требуется проверка подлинности kerberos (windows winrm для журналов событий), и это через порт 5985 (обычный http-порт). Я внутренне использую веб-службу spring и подключаю http-клиент для проверки подлинности kerberos. Аутентификация kerberos прошла успешно, и я могу вызвать службу Windows winrm, но данные по проводу не зашифрованы, и я вижу полезную нагрузку soap xml в wireshark. Мой вопрос в том, поддерживает ли http-клиент apache шифрование данных с помощью ключа kerberos? Если он не поддерживает напрямую, может ли кто-нибудь помочь мне, как я могу достичь этого, применив какой-либо крюк в http-клиенте.
private HttpClient buildHttpClient() { HttpClientBuilder builder = HttpClientBuilder.create(); Lookuplt;AuthSchemeProvidergt; authSchemeRegistry = RegistryBuilder.lt;AuthSchemeProvidergt;create() .register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory(true)).build(); builder.setDefaultAuthSchemeRegistry(authSchemeRegistry); builder.setDefaultCredentialsProvider(new GSSCredentialsProvider()); builder.addInterceptorFirst(new HttpComponentsMessageSender.RemoveSoapHeadersInterceptor()); CloseableHttpClient httpClient = builder.build(); return httpClient; } private class GSSCredentialsProvider implements CredentialsProvider { @Override public void setCredentials(AuthScope authscope, Credentials credentials) { } @Override public Credentials getCredentials(AuthScope authscope) { return new KerberosCredentials(GSSCredentialsThreadLocal.getGSSCredential()); } @Override public void clear() { } }
У меня есть класс, который вызывает веб-службу, ниже приведен сокращенный код.
@Override public lt;Tgt; T callService(KerberosAuthContext context, PrivilegedExceptionActionlt;Tgt; action) throws KerberosServiceCallerException { System.setProperty("java.security.krb5.kdc", context.getKdc()); System.setProperty("java.security.krb5.realm", context.getRealm()); CustomLoginConfiguration loginCfg = new CustomLoginConfiguration(context.getKdc(), context.getRealm(), context.isSslEnabled()); LoginContext lc = null; try { lc = new LoginContext(context.getRealm() "-lc", new Subject(), new CredentialCallbackHandler(getUserIdForKerbAuth(context.getUsername()), context.getPassword()), loginCfg); lc.login(); } catch (LoginException e) { throw new KerberosServiceCallerException(e); } Subject subject = lc.getSubject(); try { KerberosPrincipal krbPrincipal = subject.getPrincipals(KerberosPrincipal.class).iterator().next(); Oid spnego = new Oid("1.3.6.1.5.5.2"); Oid kerberos5 = new Oid("1.2.840.113554.1.2.2"); final GSSManager manager = GSSManager.getInstance(); final GSSName name = manager.createName(krbPrincipal.toString(), GSSName.NT_USER_NAME); Setlt;Oidgt; mechs = new HashSetlt;gt;(Arrays.asList(manager.getMechsForName(name.getStringNameType()))); final Oid mech; if (mechs.contains(kerberos5)) { mech = kerberos5; } else if (mechs.contains(spnego)) { mech = spnego; } else { throw new IllegalArgumentException("No mechanism found"); } GSSCredential creds = Subject.doAs(subject, new PrivilegedExceptionActionlt;GSSCredentialgt;() { @Override public GSSCredential run() throws GSSException { return manager.createCredential(name, GSSCredential.DEFAULT_LIFETIME, mech, GSSCredential.INITIATE_AND_ACCEPT); } }); GSSCredentialsThreadLocal.setGSSCredential(creds); return Subject.doAs(subject, action); } catch (Exception e) { throw new KerberosServiceCallerException(e); } finally { GSSCredentialsThreadLocal.removeGSSCredential(); } }