首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将传入的HTTP请求中继(而不是重定向)到现有HTTPS服务器的解决方案?

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

Server Fault用户
提问于 2023-02-01 08:46:51
回答 1查看 62关注 0票数 -1

寻找一个Linux侦听应用程序,它将传入的请求按原样转发到远程HTTPS服务器,并将(decrypred)响应中继回来。

基本上,我们有一个黑盒https VM,它的访问丢失了,它的证书已经过期了。虽然devs正在努力实现一个替代(年底),我们需要我们的许多其他应用程序继续与它交谈。重新编码这些应用程序需要花费大量时间,以允许忽略过期的证书,但重新配置这些应用程序以与另一个(HTTP) url对话是很容易的,后者将在幕后完成通话到过期的HTTPS。

示例:

证书过期

代码语言:javascript
复制
$ curl https://blackbox:3333/v1/configserver/6c15dd4a -H 'X-Vault-Token: ****'
curl: (60) Peer's Certificate has expired.
...

忽略证书适用于卷发

代码语言:javascript
复制
$ curl -k https://blackbox:3333/v1/configserver/6c15dd4a -H 'X-Vault-Token: ****'
{"request_id":"b6e832", "backdoor.token.encryption.password":"****", "oauth.keys":"****|****",
...

需要HTTP-监听本地主机:80并在幕后与HTTPS://blackbox:3333交谈

代码语言:javascript
复制
$ curl http://localhost:80/v1/configserver/6c15dd4a -H 'X-Vault-Token: ****'
{"request_id":"b6e832", "backdoor.token.encryption.password":"****", "oauth.keys":"****|****",
...

有人告诉我,nginx应该能够做到这一点,但我没有找到任何例子来轻松地设置它,同时忽略过期的证书(而且觉得nginx在配置它之前需要大量的背景知识,甚至是开始之前)。

更新:

我的问题是HTTP ->过期-证书-HTTPS继电器

@GeraldSchneider,

  • 有一些主题可以解决<>相反的中继(HTTPS -> HTTP):

如何转发来自服务器的请求?

  • 有一些主题解决相似的中继(HTTP ->好-有效-证书-HTTPS):

https://stackoverflow.com/questions/8017508/solutions-to-convert-http-traffic-to-https-proxy-relay

如果其中任何一个提到如何将apacheHttpd/nginx/etc配置为忽略过期/无效/自签名的证书--这将是我正在寻找的答案。

EN

回答 1

Server Fault用户

发布于 2023-02-01 09:09:18

同时,我使用java spring-启动编写了一个示例HTTP->HTTPS中继,但它缺乏完整性(没有处理“循环”重定向,只使用GET方法,大量手工操作headers/retCodes/queryStrings/closables/streams/buffers,,可能在代码中有一些错误,等等)。它可能适合我们的短期需求,但我更喜欢一个标准/健壮/更简单的HTTP->HTTPS中继工具(如果有的话)。

代码语言:javascript
复制
@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 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();
                }
            }
        }
    }
票数 -1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1121663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档