我正在构建一个HTTPS代理,它可以转发所有SSL通信。这称为透明隧道。无论如何,我对Python的套接字服务器有问题。当我调用rfile.read()时,需要很长时间才能返回。即使我使用select来确保I / O准备就绪,它仍然需要很长时间。通常是30秒,并且客户端的套接字由于超时而关闭。我无法解除套接字的阻塞,因为我需要先读取数据,然后将刚读取的所有数据转发到远程服务器,因此必须首先将其与数据一起返回。
我的代码如下:
import SocketServer
import BaseHTTPServer
import socket
import threading
import httplib
import time
import os
import urllib
import ssl
import copy
from history import *
from http import *
from https import *
from logger import Logger
DEFAULT_CERT_FILE = "./cert/ncerts/proxpy.pem"
proxystate = None
class ProxyHandler(SocketServer.StreamRequestHandler):
def __init__(self, request, client_address, server):
self.peer = False
self.keepalive = False
self.target = None
self.tunnel_mode = False
self.forwardSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Just for debugging
self.counter = 0
self._host = None
self._port …Run Code Online (Sandbox Code Playgroud) 我有一个网络应用程序机器人,我想对其进行远程控制,以便一些人可以对其进行测试。我正在使用 Bot Framework Emulator 在本地测试它并且它产生了奇迹,但我完全没有让 ngrok 托管它。
(我实际上使用 ...azurewebsites.net/api/messages 链接我的应用程序在 Azure 中与另一个机器人连接,但我不能使用这个,所以我正在尝试使用 ngrok 为我提供的链接 - 两者我管理的机器人和这个机器人托管在 Azure 中,但我不知道如何使其可用于远程访问)
我正在采取的步骤:
在 Visual Studio 中部署应用程序,使其在 localhost:3979 上运行;
使用ngrok
3979 http -host-header=rewrite localhost:3979;在 ngrok 中从外部打开端口
获取 ngrok 为我提供的转发 URL 之一,例如
https://3d609207.ngrok.io
在 Bot Framework Emulator 中插入上一个 URL;
单击连接。
在 ngrok 和 Bot Framework Emulator 中都返回了 me 405 Method Not Allowed。
我尝试访问我在 Bot Framework Emulator 中插入的链接,我通常拥有在本地托管我的机器人时会看到的页面:
在此处描述您的机器人以及您的使用条款等。
访问 Bot Framework 以注册您的机器人。注册时,请记住将机器人的端点设置为
但是我无法在 Bot Framework Emulator 中发送或接收消息。
此外,ngrok 在 HTTP 请求标题下打印: …
remote-access http-tunneling http-status-code-405 ngrok botframework
我正在尝试通过 HTTPS 隧道发送 HTTPS 请求。也就是说,我的代理希望 CONNECT 使用 HTTPS。它还需要一个客户端证书。
我正在使用请求的代理功能。
import requests
url = "https://some.external.com/endpoint"
with requests.Session() as session:
response = session.get(
url,
proxies={"https": "https://proxy.host:4443"},
# client certificates expected by proxy
cert=(cert_path, key_path),
verify="/home/savior/proxy-ca-bundle.pem",
)
with response:
...
Run Code Online (Sandbox Code Playgroud)
这有效,但有一些限制:
proxy-ca-bundle.pem只验证与代理的TLS连接的服务器证书。来自外部端点的服务器证书似乎被忽略了。有什么办法可以requests用来解决这两个问题吗?我想为外部端点设置一组不同的 CA。
我也尝试使用http.client,HTTPSConnection.set_tunnel但是,据我所知,它的隧道是通过 HTTP 完成的,我需要 HTTPS。
我正在尝试从使用RTSP over HTTP的Axis ip camera流式传输.我可以使普通的RTSP流工作,但是我找不到有关如何为流实际设置隧道模式的任何信息或文档.通过将control_transport设置为RTSP_MODE_TUNNEL,源代码支持它.我的问题很简单,如何使用以下代码执行此操作?
int ret = avformat_open_input(&pFormatCtx, [@"rtsp://ip/axis-media/media.amp" UTF8String], NULL, NULL);
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法:
pFormatCtx = avformat_alloc_context();
pFormatCtx->priv_data = malloc(sizeof(RTSPState));
RTSPState *rt = pFormatCtx->priv_data;
rt->control_transport = RTSP_MODE_TUNNEL;
int ret = avformat_open_input(&pFormatCtx, [@"rtsp://ip/axis-media/media.amp" UTF8String], NULL, NULL);
Run Code Online (Sandbox Code Playgroud)
但它只是忽略了它(它仍然继续使用RTP).我试过这个
int ret = avformat_open_input(&pFormatCtx, [@"rtsp://ip/axis-media/media.amp" UTF8String], NULL, NULL);
RTSPState *rt = pFormatCtx->priv_data;
rt->control_transport = RTSP_MODE_TUNNEL;
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?我认为这很简单,因为ENUM就在那里.
工作解决方案是
AVDictionary *opts = 0;
int ret = av_dict_set(&opts, "rtsp_transport", "http", 0);
ret = avformat_open_input(&pFormatCtx, [@"rtsp://ip:80/axis-media/media.amp" UTF8String], NULL, &opts);
av_dict_free(&opts);
Run Code Online (Sandbox Code Playgroud) 我的服务器server.example.com无法从Internet访问.但是,有一个可访问的HTTP代理proxy.example.com,它可以与服务器通信.
如果用户将其浏览器配置为通过proxy.example.com获取*.example.com,或使用我提供的代理autoconfig文件,则他们可以访问服务器(在使用代理进行身份验证后).我想避免让他们完成这个手动过程.
是否可以通过编程方式执行此操作?JavaScript将通过可访问Internet的www.example.com网站提供,因此似乎没有一个安全问题会使原则上无法实现.
我的约束是proxy.example.com是一个HTTP代理,我无法触摸它.我只控制server.example.com和www.example.com,我的网络应用程序只能在server.example.com上运行.
我正在调整Python脚本以独立于操作系统并在Windows上运行.我已将其ssh系统调用更改为调用paramiko函数.我遇到了http代理身份验证的问题.在Unix(实际上是Cygwin)环境中,我会使用〜/ .ssh/config
Host *
ProxyCommand corkscrew http-proxy.example.com 8080 %h %p
Run Code Online (Sandbox Code Playgroud)
有没有办法使用或不使用开瓶器使用paramiko(或Python ssh模块)获得相同的?这篇文章似乎暗示了,但我不知道如何.
注意:我位于允许我仅使用端口80的防火墙后面.我需要控制Amazon ec2实例,因此我在这些机器上配置sshd服务器以侦听端口80.在我的cygwin + corkscrew原型中一切正常,但是我想有一个没有Cygwin的Python脚本.
python ×3
ssl ×2
botframework ×1
ffmpeg ×1
https ×1
javascript ×1
ngrok ×1
paramiko ×1
proxy ×1
proxytunnel ×1
rtsp ×1
socketserver ×1
ssh ×1
stream ×1
tunnel ×1