-1

ほとんどのコンテンツをローカル データベースに保持している 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: 要求を行うと想定しています。 Python SSLは、実装が OpenSSL に基づいていると述べています。 どうやらYumは mod_ssl の依存関係を一覧表示できないようですが、インストールされているバージョンの openssl も使用していると思います。

次のコードは、(SSL_CLIENT_CERT から抽出された) ユーザーの識別名を取得し、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()

サーバーの WSGI ディレクトリでユーザー apache としてサーバー上で実行している場合、ルーチンはユーザー属性を含む dict を正しく返します。

$ python
>>> import auth
>>> dn='cn=Me,o=Company,c=US'
>>> attr = auth.get_user_info(dn)

しかし、Apache が WSGI スクリプト ( ) から同じ DN で同じ関数を呼び出すとviews.py、OSError が発生します。

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()   

OpenSSLで提案されているようにロックの調査を開始します(これらのエラーの原因となるものは他に考えられないため) が、バックエンド クエリに SSL を使用する Web サーバーがまだよく使われているとは信じがたいです。質問:

  1. マルチスレッド/ロック/再入可能性は、これらのエラーの原因として適切なツリーを吠えていますか?
  2. Web サーバーとバックエンドの接続に SSL を使用するための実際の例は既にありますか?
4

1 に答える 1