将传入的 HTTP 请求中继(而不是重定向)到现有 HTTPS 服务器的解决方案?

将传入的 HTTP 请求中继(而不是重定向)到现有 HTTPS 服务器的解决方案?

寻找一个 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();
                }
            }
        }
    }

相关内容