Python请求在一台Windows计算机上导致SSL验证错误,但在另一台计算机上不会

hyrbngr7  于 2023-02-20  发布在  Python
关注(0)|答案(1)|浏览(205)

我正在一个anaconda虚拟环境中用Python 3.6构建一个windows服务,我用python请求发出一个post请求:requests.post(url, files=files, data=data, headers=headers)
创建服务后,在我的Windows机器(拥有创建服务的源代码的机器)上,它立即工作。当我在另一台Windows机器上安装此服务时,我不断获得SSL:CERTIFICATE_VERIFY_FAILED.我在第三台Windows机器上安装了它,它工作正常(但不幸的是,这不是我们需要它工作的机器)。
我尝试过的事情:
1.在创建服务之前,在我的虚拟环境中安装了带有conda的python-certifi-win32
1.指定一个. pem文件的路径,该文件包含url的证书链,并使用verify参数添加该文件,因此我的请求如下:requests.post(url, files=files, data=data, headers=headers, verify='path\to\pemfile')。这在我的机器上有效,但在另一台上无效。
我在两台电脑上都打印出了requests.certs.where(),它们都说C:\Windows\TEMP\_MEXXXX\certifi\cacert.pem
如何使我的服务在所有计算机上运行相同的服务?
更新:可重现示例:

# debugFile.py
import servicemanager
import socket
import win32event
import win32service
import win32serviceutil
import traceback
import sys, getopt
import requests

class SCPWorker:
    def __init__(self):
        self.running = True

    def test_function(self):
        data = {}
        token = 'auth token for url'
        response = requests.post(custom_url, data=data, headers={'Authorization': "Token " + token})
                

class StoreScp(win32serviceutil.ServiceFramework):
    _svc_name_ = "Service"
    _svc_display_name_ = "Debug Service"
    _svc_description_ = "description"

 
    def __init__(self, args):
        self.worker = SCPWorker()
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        socket.setdefaulttimeout(60)

    def SvcStop(self):
        try:
            self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
            win32event.SetEvent(self.hWaitStop)
            self.worker.stop()
            self.running = False
        except:
            servicemanager.LogErrorMsg(traceback.format_exc())

    def SvcDoRun(self):
        try:
            self.worker.test_function()
           
            while rc != win32event.WAIT_OBJECT_0 and rc != win32event.WAIT_FAILED and rc != win32event.WAIT_TIMEOUT and rc != win32event.WAIT_ABANDONED:
                rc = win32event.WaitForSingleObject(self.hWaitStop, 5000)

            if rc == win32event.WAIT_OBJECT_0:
                servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                                      servicemanager.PYS_SERVICE_STARTED,
                                      ('Service stopped', ''))
            else:
                servicemanager.LogMsg(servicemanager.EVENTLOG_ERROR_TYPE,
                                      servicemanager.PYS_SERVICE_STOPPED,
                                      ('Service quit unexpectedly with status %d' % rc, ''))
        except:
            servicemanager.LogErrorMsg(traceback.format_exc())

if __name__ == '__main__':
    if len(sys.argv) == 1:
        servicemanager.Initialize()
        servicemanager.PrepareToHostSingle(StoreScp)
        servicemanager.StartServiceCtrlDispatcher()
    else:
        win32serviceutil.HandleCommandLine(StoreScp)

然后运行pyinstaller -F --hidden-import=win32timezone DebugFile.py创建exe,然后在计算机上安装exe。

wlzqhblo

wlzqhblo1#

我一直不明白为什么它在另一台电脑上不起作用,但我确实设法使一个变通方案起作用。首先我确保我的pyinstaller至少是4.10,然后我安装了pip-system-certs。最后我在我的python文件的顶部添加了import pip_system_certs.wrapt_requests。这个库意味着我必须使用pip而不是conda安装所有东西。

相关问题