Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Apache/mod_ssl能否支持两层操作?_Python_Django_Apache_Centos_Mod Ssl - Fatal编程技术网

Python Apache/mod_ssl能否支持两层操作?

Python Apache/mod_ssl能否支持两层操作?,python,django,apache,centos,mod-ssl,Python,Django,Apache,Centos,Mod Ssl,我有一个web服务器,它在本地数据库中维护大部分内容,但需要查询后端目录服务来检索用户信息。目录查询作为独立操作可以正常工作,但当web服务器进行查询时,ssl返回错误 服务器基于CentOS 7-2.1511/Django 1.9.3/PostgreSQL 9.2.15/Apache 2.4.6-40/mod_ssl 1:2.4.6-40/OpenSSL 1:1.0.1/Python 3.4.3。Apache使用mod_ssl来服务来自客户端(浏览器)的https:请求,我假设Python的s

我有一个web服务器,它在本地数据库中维护大部分内容,但需要查询后端目录服务来检索用户信息。目录查询作为独立操作可以正常工作,但当web服务器进行查询时,ssl返回错误

服务器基于
CentOS 7-2.1511/Django 1.9.3/PostgreSQL 9.2.15/Apache 2.4.6-40/mod_ssl 1:2.4.6-40/OpenSSL 1:1.0.1/Python 3.4.3
。Apache使用mod_ssl来服务来自客户端(浏览器)的https:请求,我假设Python的ssl.py使用相同的引擎向目录服务器发出https:请求。说它的实现是基于OpenSSL的。显然不能列出mod_ssl的依赖项,但我假设它也使用已安装的openssl版本

以下代码将采用用户的可分辨名称(从SSL_客户端_证书中提取),并使用RESTful界面查询目录服务器中的用户属性:

import requests, urllib

URL = 'https://example.com/rest/user_info/'

def get_user_info(dn)
    query = URL + urllib.parse.quote(dn)
    return requests.get(query, cert=('server.crt', 'server.key'),
                        verify='ca_bundle.crt').json()
当我在服务器上以用户apache的身份在服务器的WSGI目录中运行时,例程将正确返回包含用户属性的dict:

$ python
>>> import auth
>>> dn='cn=Me,o=Company,c=US'
>>> attr = auth.get_user_info(dn)
但是,当Apache从其WSGI脚本(
views.py
)调用具有相同DN的相同函数时,会引发一个操作错误:

OSError(0, 'Error')
Line 810, /lib64/python3.4/ssl.py

803  def do_handshake(self, block=False):
804      """Perform a TLS/SSL handshake."""
805      self._check_connected()
806      timeout = self.gettimeout()
807      try:
808          if timeout == 0.0 and block:
809              self.settimeout(None)
810          self._sslobj.do_handshake()   
我将开始研究建议的锁定(因为我想不出会导致这些错误的任何其他原因),但很难相信使用SSL进行后端查询的Web服务器已经不是一条成功的道路。问题:

  • 多线程/锁定/重入是导致这些错误的正确原因吗
  • 是否已经有使用SSL进行Web服务器后端连接的示例

  • 我放弃了。以下工作可靠,以牺牲美观和效率为代价。它首先尝试一个
    请求
    查询,如果查询失败,则在子流程中punt并调用
    wget
    。它返回一个元项
    $method
    ,让页面视图知道内联请求是否失败

    def get_user_info(dn, sub=True, ttl=300):
        query = URL + urllib.parse.quote(dn)
        try:
            info = requests.get(query, cert=(SERVER_CERT, SERVER_KEY),
                                verify=CA_CERT).json()
            info['$method'] = 'requests'
            return info
        except OSError:
            if sub:
                args = ['wget', '-O', '-',
                    '--certificate=' + SERVER_CERT,
                    '--private-key=' + SERVER_KEY,
                    query]
                bytes = subprocess.check_output(args, timeout=5)
                info = json.loads(bytes.decode(encoding='utf-8'))
                info['$method'] = 'subprocess'
                return info
            else:
                raise
    

    如果OpenSSL使用上下文而不是全局变量,那当然很好。

    我看到的第一件事是:使用证书文件的相对路径。您的工作目录在Apache环境中可能会有所不同。这是一个好主意,但我简化了实际运行的示例代码。我的工作目录与服务器上运行的代码相同(Django应用程序目录
    /srv/Django/myapp
    ),并且我有服务器证书、服务器密钥和CA捆绑包的绝对路径变量。我在服务器上有一个Python虚拟环境,Apache虚拟主机WSGIDaemon命令和我的命令行实验使用该环境,正如我所说,我在user:group Apache:Apache下运行。