用于Android开发的Kivy中的SSL

时间:2017-10-26 17:59:12

标签: android python ssl kivy buildozer

我正在开发一个可以向AWS Iot发送mqtt消息的移动应用程序。它需要paho-mqtt库。它可以包含在buildozer.spec要求中。我的问题出在SSL部分,因为我需要在代码中导入SSL,这似乎与在python-for-android中运行的python版本有问题,即2.7.2。

代码如下,在PC上工作正常,但在手机上却无法正常工作。

from kivy.lang import Builder
from kivy.app import App
from kivy.uix.label import Label


import paho.mqtt.publish as mqtt
import paho.mqtt.client as mqttclient  
#


class MqttTest(App):
    def build(self):
        topic = "topic1"
        my_ca_cert  = "RootCA.pem"
        my_pri_cert = "my.cert.pem"
        my_key_cert = "my.private.key"


        try:
            import ssl
            mqttc = mqttclient.Client("Python_Ex_Pub")
            mqttc.tls_set(my_ca_cert, 
                certfile=my_pri_cert, 
                keyfile=my_key_cert,
                cert_reqs=ssl.CERT_REQUIRED, 
                tls_version=ssl.PROTOCOL_TLSv1_2, 
                ciphers=None)
            mqttc.connect("myaddress", 8883)
            mqttc.publish(topic, "This is a test pub from Python.")

            return Label(text="Hi it works!")
        except Exception as e:
            import traceback
            a=traceback.format_exc()
            try:
                f1=open("/storage/emulated/0/Download/err.txt","w")
                f1.write(str(a))
                f1.close()
            except:
                pass
            return Label(text=str (a))

if __name__ == '__main__':
    MqttTest().run()

在buildozer.spec要求中没有添加任何与SSL相关的内容,我收到以下错误:

no module named _ssl

如果我添加了openssl作为其中一项要求,那么我会收到以下错误:

'module' object has no attribute 'PROTOCOL_TLSv1_2'

2 个答案:

答案 0 :(得分:1)

如前所述PROTOCOL_TLSv1_2在后​​来的Python 2版本中添加了比p4a提供的版本。

您可以尝试使用Python 3构建apk:

  1. 使用requirements
  2. 更改您的构建器的python2行替换python3crystax
  3. 下载并解压缩crystax ndk here
  4. 将您的构建器android.ndk_path更改为指向解压缩的crystax ndk目录
  5. 运行buildozer android debug
  6. 如果你足够幸运,你将能够使用Python 3构建apk而无需任何其他操作。

答案 1 :(得分:0)

我遇到了类似的问题。我试图在没有做任何事情的情况下导入pydrive。以下是来自logcat。

我尝试了3 os环境,osx,ubuntu,推土机vm。所有人都给了我同样的错误。

I / python(13323):文件“/Users/macuser/test/.buildozer/android/platform/build/dists/myapp/private/lib/python2.7/site-packages/httplib2/init .py“,第960行,in I / python(13323):AttributeError:'module'对象没有属性'HTTPSConnection'

在httplib.py中,我找到了以下代码。

try:
    import ssl
except ImportError:
    pass
else:
    class HTTPSConnection(HTTPConnection):
        "This class allows communication via SSL."

所以我怀疑ssl无法成功导入。然后,检查ssl.py并发现PROTOCOL_SSLv3无法成功导入。

from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1

直到这里我无法继续前进。我正在使用python3crystax,它仍然不能在这篇文章中作为声明。

由于buildozer将单独下载所有库,我怀疑bulldozer自动下载的python是一个不包含ssl3支持的python版本。