Аутентификация и шифрование Kerberos в http-клиенте Apache

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