4

Google App Engineアプリケーションを開発していますが、SOAPを使用してWebサービスに接続する必要があります。pysimplesoap(ここにあるコードでパッチが適用されています)を使用してxmlを解析し、クライアント側の証明書を使用してリクエストを実行しています。ローカル環境からの単純な単体テストでこれを行うと、それは機能し、Webサービスから適切な応答を受け取ります。ただし、App Engine内からまったく同じコードを実行すると、次のようになります。

  File "/Users/me/Documents/workspace/blixem/model/communicate/communication_channel.py", line 60, in generate_soap_message_pysimplesoap
    response = client.SendDocument('LA.XML', 'TESTCASE', 'data')
  File "/Users/me/Documents/workspace/blixem/lib/pysimplesoap/client.py", line 152, in <lambda>
    return lambda *args, **kwargs: self.wsdl_call(attr,*args,**kwargs)
  File "/Users/me/Documents/workspace/blixem/lib/pysimplesoap/client.py", line 320, in wsdl_call
    response = self.call(method, *params)
  File "/Users/me/Documents/workspace/blixem/lib/pysimplesoap/client.py", line 215, in call
    self.xml_response = self.send(method, self.xml_request)
  File "/Users/me/Documents/workspace/blixem/lib/pysimplesoap/client.py", line 241, in send
    location,"POST", body=xml, headers=headers )
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/httplib2/httplib2/__init__.py", line 1457, in request
    self.disable_ssl_certificate_validation)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/httplib2/httplib2/__init__.py", line 1143, in __init__
    strict, timeout, proxy_info, ca_certs, disable_ssl_certificate_validation)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/httplib2/httplib2/__init__.py", line 1092, in __init__
    raise NotSupportedOnThisPlatform()
NotSupportedOnThisPlatform

少し読んだところ、urlfetchサービスでクライアント側の証明書がまだサポートされていないことがわかりました。これはまだ当てはまりますか?もしそうなら、回避策はありますか?

4

3 に答える 3

2

クライアント側の証明書は現在、GAEではサポートされていません。HTTPS経由でURLFetchサービスを使用できます。ただし、クライアント証明書は使用できません。信頼できるテスタープログラムで現在利用可能なアウトバウンドソケットサポート機能を試す必要があります。探している機能をホワイトリストに登録する場合があります。以前、GAE/Jについても同様の質問をしました。

本当に必要な場合は、アウトバウンドソケット機能を使用するか、EC2でプロキシを実行してください。

于 2013-02-06T21:01:56.070 に答える
1

BooTooManyの答えを拡張するために、基礎となるコードがソケットを使用している限り、優れたrequestsライブラリでこれを行うことが可能になりました。次の手順に従って使用してください。

  1. ソケットは有料アプリでのみ利用できます。アプリで課金が有効になっていることを確認してください。
  2. ディレクトリにインストールrequestsしますlib/。現在、v2.21.0を使用しています。ドキュメントで推奨されているにもかかわらず、によって提供されているAppEngineアダプターを使用するためにモンキーパッチを適用しないように注意してください。これは、無料アプリで利用できるが現在クライアント側の証明書をサポートしていないソケットの代わりに使用します。requestsrequests-toolbeltrequestsurlfetch
  3. app.yamlで、SSLライブラリを有効にします。
libraries:
- name: ssl
  version: latest
  1. app.yamlで、開発サーバーのソケットを有効にします。
env_variables:
  GAE_USE_SOCKETS_HTTPLIB: 'yes'

これで、クライアント証明書を使用してリクエストを行う準備が整いました。

import requests

def make_request(url):
    cert = ('cert_file.pem', 'key_file.pem')
    server_cert_file = 'server_cert_file.pem'
    return requests.get(url=url, cert=cert, verify=server_cert_file)
于 2019-08-05T08:20:37.407 に答える
0

PythonSSLがGAEでサポートされるようになりました-https://cloud.google.com/appengine/docs/standard/python/sockets/ssl_supportを参照してください

そのため、クライアント側の証明書を使用できるようになりました。そのウェブページから:

 # Example of a dynamic key and cert.
  datastore_record_k = ndb.Key('Employee', 'asalieri', 'Address', 1)
  datastore_record = datastore_record_k.get()
  key_str = datastore_record.key_str
  cert_str = datastore_record.cert
  ssl_server = ssl.wrap_socket(server_sock,
                              server_side=False,
                              keyfile=StringIO.StringIO(key_str),
                              certfile=StringIO.StringIO(cert_str),
                              cert_reqs=ssl.CERT_REQUIRED,
                              ssl_version=ssl.PROTOCOL_SSLv23,
                              ca_certs=CERTIFICATE_FILE)
于 2018-03-20T19:26:03.317 に答える