寻找一个 Linux HTTP 监听应用程序,它可以将传入的请求按原样中继到远程 HTTPS 服务器,并将(解密的)响应中继回来。
基本上,我们有一个黑盒 https VM,它的访问权限已丢失,并且其证书已过期。虽然开发人员正在努力实现替代方案(年底前),但我们需要我们的众多其他应用程序继续与其通信。重新编码这些应用程序以允许忽略过期的证书需要大量时间,但重新配置这些应用程序以与另一个 (HTTP) url 通信会很容易,这将在后台执行与过期 HTTPS 的通信。
例子:
证书已过期
$ curl https://blackbox:3333/v1/configserver/6c15dd4a -H 'X-Vault-Token: ****'
curl: (60) Peer's Certificate has expired.
...
ignoring-the-cert 适用于 curl
$ curl -k https://blackbox:3333/v1/configserver/6c15dd4a -H 'X-Vault-Token: ****'
{"request_id":"b6e832", "backdoor.token.encryption.password":"****", "oauth.keys":"****|****",
...
需要在 localhost:80 上进行 HTTP 监听,并在后台与 HTTPS://blackbox:3333 进行通信
$ curl http://localhost:80/v1/configserver/6c15dd4a -H 'X-Vault-Token: ****'
{"request_id":"b6e832", "backdoor.token.encryption.password":"****", "oauth.keys":"****|****",
...
有人告诉我 nginx 应该能够做到这一点,但是我没有找到任何示例可以轻松地设置这一点,同时忽略过期的证书(并且感觉 nginx 需要你开始之前就具备大量的背景知识来配置它)。
更新:
我的问题是关于 HTTP -> expired-cert-HTTPS 中继
@GeraldSchneider,
- 有主题解决对面的中继(HTTPS -> HTTP):
- 有主题解决一样中继(HTTP -> 良好有效证书-HTTPS):
https://stackoverflow.com/questions/8017508/solutions-to-convert-http-traffic-to-https-proxy-relay
如果其中任何一个提到如何配置 apacheHttpd/nginx/etc 以忽略过期/无效/自签名证书 - 那就是我正在寻找的答案
答案1
同时,我使用 java spring-boot 编写了一个示例 HTTP->HTTPS 中继,但它缺乏完整性(不处理“循环”重定向,只有 GET 方法,大量手动摆弄 headers/retCodes/queryStrings/closables/streams/buffers,代码中可能存在一些错误等)。它可能可以满足我们的短期需求,但我更喜欢标准/强大/更简单的 HTTP->HTTPS 中继工具(如果有的话)。
@RestController
class Controller {
@GetMapping("/**")
void relay(HttpServletRequest servletReq, HttpServletResponse servletResp) {
HttpClient httpClient = null;
HttpResponse httpResp = null;
try {
httpClient = HttpClients.custom()
.setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, TrustAllStrategy.INSTANCE).build())
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).build();
String host = "blackbox:3333";
HttpUriRequest httpReq = new HttpGet("https://" + host + servletReq.getRequestURI() + "?" + servletReq.getQueryString());
Enumeration<String> he = servletReq.getHeaderNames();
if (null != he)
while (he.hasMoreElements()) {
String n = he.nextElement(), v = ("host".equals(n)) ? host : servletReq.getHeader(n);
httpReq.setHeader(new BasicHeader(n, v));
}
httpResp = httpClient.execute(httpReq);
for (Header h : httpResp.getAllHeaders()) {
servletResp.addHeader(h.getName(), h.getValue());
}
servletResp.setStatus(httpResp.getStatusLine().getStatusCode());
IOUtils.copy(httpResp.getEntity().getContent(), servletResp.getOutputStream());
servletResp.flushBuffer();
servletResp.getOutputStream().close();
} catch (Throwable t) {
t.printStackTrace();
} finally {
if (null != httpResp && httpResp instanceof CloseableHttpResponse) {
try {
((CloseableHttpResponse) httpResp).close();
} catch (Throwable t) {
t.printStackTrace();
}
}
if (null != httpClient && httpClient instanceof CloseableHttpClient) {
try {
((CloseableHttpClient) httpClient).close();
} catch (Throwable t) {
t.printStackTrace();
}
}
}
}