ほとんどのコンテンツをローカル データベースに保持している 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 サーバーがまだよく使われているとは信じがたいです。質問:
- マルチスレッド/ロック/再入可能性は、これらのエラーの原因として適切なツリーを吠えていますか?
- Web サーバーとバックエンドの接続に SSL を使用するための実際の例は既にありますか?