You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetty 12 HttpClient配置SPNEGO代理Kerberos认证问题求助

Jetty 12.x HttpClient代理Kerberos认证配置问题

使用Jetty 12.x时,尝试为HttpClient配置代理并启用Kerberos认证,但查阅官方文档及测试示例后,未找到相关配置指引。

我的代理信息如下:

String realm = "CAPVANLAB.COM";
String kdc = "capvanlab.com";

String proxyUser = "svc.bcaaa@CAPVANLAB.COM";
String proxyPassword = "Pass@123";
String serviceName = "VanBluecoatS200.capvanlab.com"; // 这是Bluecoat代理本身

String proxyHost = "192.168.72.8";
int proxyPort = 8080;

我有两个疑问:

  • 创建SPNEGOAuthentication对象时,传入的URI应取什么正确值?
  • 为SPNEGOAuthentication对象设置的serviceName应取什么正确值?

当前实际生成的Sname错误附加了目标站点主机名,而预期的Sname应与HttpUrlConnection生成的一致。查看SPNEGOAuthentication.initGSSContext()代码发现,其从HttpRequest提取主机名并附加到服务名生成SPN,这似乎不正确。

以下是我尝试的示例代码:

package com.example.caching;

import org.apache.catalina.authenticator.SpnegoAuthenticator;
import org.eclipse.jetty.client.*;
import org.eclipse.jetty.util.component.LifeCycle;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.reactive.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

import javax.security.auth.Subject;
import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.Configuration;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
import java.net.*;
import java.util.HashMap;
import java.util.Set;

@RestController
@Slf4j
public class CustomerController {

    public String uri = "http://example.com";

    String serviceType = "HTTP";
    String serviceName = "VanBluecoatS200.capvanlab.com";
    String scheme = "http";

    String nameStr ="Capvanlabdc.Capvanlab.com";

    String realm = "CAPVANLAB.COM";
    String kdc = "capvanlab.com";

    String clientName ="svc.bcaaa";
    String proxyUser = "svc.bcaaa@CAPVANLAB.COM";
    String proxyPassword = "Pass@123";

    String proxyHost = "192.168.72.8";
    int proxyPort = 8080;


    @GetMapping("/jet")
    public String jetHttp() {
        log.info(">>> checking kerberos httpClient");
        setSystemProperties();
        HttpClient  httpClient;
        try {httpClient = getJettyClient();
        httpClient.start();
        log.info(">>> httpClient.start() httpClient called");
        ContentResponse res = httpClient.GET(uri);
        log.info("res.getStatus()  {}", res.getStatus());
        String result = res.getContentAsString();
        new Thread(() -> LifeCycle.stop(httpClient)).start();
        return result;
        } catch(Exception e){
            log.warn(">>> Exception " + e);
            return "Exception occurred";
        }
    }



    public void setSystemProperties() {
        log.info("Setting Kerberos Realm and KDC");
        System.setProperty("java.security.krb5.realm", realm);
        System.setProperty("java.security.krb5.kdc", kdc);
        System.setProperty("sun.security.krb5.debug", "true");
        Configuration.setConfiguration(setJaasConfigParams());
        log.info("Kerberos Realm and KDC are succesfull set to the perf qualification ");
    }

    private Configuration setJaasConfigParams() {
        log.info("calling setJaasConfigParams");
        return new Configuration() {

            public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
                HashMap<String, Object> options = new HashMap<>();
                options.put("useTicketCache", "false");
                AppConfigurationEntry appConfigurationEntry = new AppConfigurationEntry(
                        "com.sun.security.auth.module.Krb5LoginModule",
                        AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options);
                return new AppConfigurationEntry[]{appConfigurationEntry};
            }
        };
    }


    private HttpClient getJettyClient() throws URISyntaxException {
        HttpClient httpClient = new HttpClient();
        configProxyJettyClient(httpClient);
        return  httpClient;
    }

    private void configProxyJettyClient(HttpClient httpClient) throws URISyntaxException {
        log.info("configProxyJettyClient start");
        URI spnegoURI =  URI.create("http://" + proxyHost + ":" +proxyPort);
        SPNEGOAuthentication spnegoAuth = new SPNEGOAuthentication(spnegoURI);
        spnegoAuth.setUserName(clientName + "@" + realm); // Or use Kerberos principal
        spnegoAuth.setUserPassword(proxyPassword); // Not required if using keytab
        spnegoAuth.setServiceName(serviceName);
        AuthenticationStore auth = httpClient.getAuthenticationStore();
        auth.addAuthentication(spnegoAuth);
        HttpProxy proxy = new HttpProxy(proxyHost, proxyPort);
        ProxyConfiguration proxyConfig = httpClient.getProxyConfiguration();
        proxyConfig.addProxy(proxy);
        log.info("configProxyJettyClient end");
    }

}

内容的提问来源于stack exchange,提问作者Kamal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:32:04