我在 ec2 上运行 squid 代理服务器,我所做的唯一 squid.conf 更改如下(在 squid.conf 文件的顶部)
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
acl squid_users proxy_auth REQUIRED
http_access allow squid_users
我现在在本地运行一个 spring boot kotlin 应用程序,并使用 RestTemplate 调用在 ec2 服务器上运行的另一个服务(我们称之为 RemoteServer)。下面是使用 BasicAuth 创建 RestTemplate 的代码。
var restTemplate = RestTemplate()
val credentialsProvider = BasicCredentialsProvider()
credentialsProvider.setCredentials(
AuthScope(PROXY_SERVER_HOST, PROXY_SERVER_PORT),
UsernamePasswordCredentials("username", "password")
)
val proxy = HttpHost(PROXY_SERVER_HOST, PROXY_SERVER_PORT)
val httpClient = HttpClientBuilder.create()
.setRoutePlanner(object : DefaultProxyRoutePlanner(proxy){
override fun determineProxy(target: HttpHost, request: HttpRequest, context: HttpContext): HttpHost {
return super.determineProxy(target, request, context)
}
})
.setDefaultCredentialsProvider(credentialsProvider).disableCookieManagement()
.build()
restTemplate.setRequestFactory(HttpComponentsClientHttpRequestFactory(httpClient))
val headers = HttpHeaders()
headers.contentType = MediaType.APPLICATION_JSON;
headers.accept = Collections.singletonList(MediaType.APPLICATION_JSON);
val request: HttpEntity<*> = HttpEntity<Any?>(headers)
val response: ResponseEntity<String> = restTemplate.exchange<String>(
uri,
HttpMethod.GET,
request,
String::class.java
)
请求成功,我在本地服务器上收到响应。但是我在 squid 的 access.log 文件中看到了两个日志。第一行是 TCP_DENIED/407,第二行是 TCP_TUNNEL/200。
1678210437.315 0 <IP> TCP_DENIED/407 4036 CONNECT <api_url>:443 - HIER_NONE/- text/html
1678210460.537 23182 <IP> TCP_TUNNEL/200 6331 CONNECT <api_url>:443 user1 HIER_DIRECT/<IP> -
当我从具有 squid 代理身份验证的浏览器调用 RemoteServer 的相同 API 时。我在 TCP_TUNNEL/200 的 access.log 文件中只得到一行。
使用restTemplate时无法理解附加的TCP_DENIED/407