使用Python连接Splunk时出现ConnectionResetError: [Errno 104] Connection reset by peer错误的解决请求
解决Splunk连接时的ConnectionResetError问题
我来帮你分析下这个问题——curl能正常连接但Python代码报错,大概率是httplib2在处理SSL/TLS握手或者请求头时,和curl的默认行为不一致导致的。下面是几个可行的解决方向:
1. 改用Splunk官方Python SDK(最推荐)
httplib2属于底层HTTP库,不如官方SDK适配性好。Splunk专门提供了Python SDK,能帮你避开很多手动配置的坑:
import splunklib.client as client username = '*********' password = '******' # 初始化客户端,禁用SSL验证(和你之前的设置一致) service = client.connect( host='xyz.splunkcloud.com', port=8089, username=username, password=password, verify=False ) # 测试连接,打印服务信息 print(service.info)
先安装SDK:pip install splunk-sdk
2. 调整httplib2配置,对齐curl的行为
curl默认会自动处理很多TLS细节,还会带上标准请求头,而你的httplib2代码可能缺少这些配置。可以尝试:
- 添加模拟curl的User-Agent头(部分服务器会拒绝陌生UA)
- 显式指定TLS版本(Splunk Cloud通常要求TLSv1.2)
修改后的代码:
import urllib import httplib2 import ssl username = '*********' password = '******' baseurl = 'https://xyz.splunkcloud.com:8089' # 配置SSL上下文,指定TLSv1.2版本 context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) context.check_hostname = False context.verify_mode = ssl.CERT_NONE myhttp = httplib2.Http(disable_ssl_certificate_validation=True, ssl_context=context) myhttp.add_credentials(username, password) # 添加上curl风格的User-Agent头(可通过curl --version查看自己的版本) headers = { 'User-Agent': 'curl/7.68.0' } servercontent = myhttp.request( baseurl + '/services/auth/login', 'POST', headers=headers, body=urllib.parse.urlencode({'username':username, 'password':password}) )[1] print(servercontent)
3. 检查代理配置差异
虽然curl能通,但Python程序可能继承了系统不同的代理设置。可以在httplib2中显式禁用代理:
myhttp = httplib2.Http( disable_ssl_certificate_validation=True, proxy_info=httplib2.ProxyInfo(httplib2.socks.PROXY_TYPE_NO_PROXY) )
为什么curl能成功?
curl默认会自动协商符合服务器要求的TLS版本,并且自带标准的请求头,而httplib2的默认配置可能不够适配Splunk Cloud的服务器规则,导致握手阶段被重置连接。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

