Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ambient.pyで用いられるURLにつきまして #5

Open
ESPuPy opened this issue Mar 25, 2023 · 6 comments
Open

ambient.pyで用いられるURLにつきまして #5

ESPuPy opened this issue Mar 25, 2023 · 6 comments

Comments

@ESPuPy
Copy link

ESPuPy commented Mar 25, 2023

Python用ライブラリをご提供して下さりありがとうございます。

ambient.pyを見ておりますと、接続先URLがHTTPとなっています。
Ambient様のAPIではHTTPSも接続可能なようです。
通信経路上のセキュリティを高めるために、ライブラリで使用するURL
についてはHTTPS接続の方が良いのではないでしょうか

Python用ライブラリ(ambient.py)
https://github.com/AmbientDataInc/ambient-python-lib/blob/master/ambient.py

現在の実装

L24:   self.url = 'http://ambidata.io/api/v2/channels/' + str(channelId)

改善案

L24:   self.url = 'https://ambidata.io/api/v2/channels/' + str(channelId)

以上よろしくお願いいたします

@TakehikoShimojima
Copy link
Collaborator

改善案、ありがとうございます。IoT端末は計算パワーの少ないマイコンが使われることがあります。microPythonは動いても、SSLの処理は負荷になる場合が考えられるので、Ambientライブラリはあえてhttpsではなくhttpで通信するようにしています。

@ESPuPy
Copy link
Author

ESPuPy commented Mar 26, 2023

早々にお返事くださりありがとうございます。
リソースが不足するマイコンでも安定して動作することを優先して
HTTP通信を選択しているという設計ポリシィであると理解しました。

しつこくて申し訳ありません。技術雑誌でAmbient様のサービスを
紹介させていただこうと思っており、HTTPS通信についてもう少し
相談させてください。

ご提供いただいているPython用ライブラリはラズパイ等の計算
リソースが豊富なマイコンでの利用も想定されていると思います。
本来HTTPS通信可能な実行環境に対してもHTTP通信に制限されて
しまいます。(補足)

ご提案としまして、ライブラリ呼び出し側で、HTTP/HTTPSのいずれかを
選択できる仕様案はいかがでしょうか。

Python(MicroPython)にもデフォルト引数の機能があります。
デフォルト引数を使うことで、指定がなければ従来通りのHTTP通信を
行い、SSL有効化のオプションを指定した場合はHTTPS通信を使うという
機能が実現できます。この仕様にすると、後方互換性を保ちつつ
セキュリティを高めたい利用者にはHTTPS通信を提供することが可能に
なります。

へなちょこソースですが、実装例を添付します。
(最低限のテストしかしておりません。すみません)
ご検討いただければ幸いです。

class Ambient:
    def __init__(self, channelId, writeKey, readKey=None, userKey=None, debug=False, ssl=False):
        try:
            import urequests
            self.requests = urequests
            self.micro = True
        except ImportError:
            import requests
            self.requests = requests
            self.micro = False

        self.channelId = channelId
        self.writeKey = writeKey
        self.readKey = readKey
        self.userKey = userKey
        self.debug = debug
        self.ssl = ssl

        if debug:
            self.url = 'http://192.168.33.13/api/v2/channels/' + str(channelId)
        else:
            if ssl:
                self.url = 'https://ambidata.io/api/v2/channels/' + str(channelId)
            else:
                self.url = 'http://ambidata.io/api/v2/channels/' + str(channelId)

従来からのご利用者の呼び出し方(変更不要)

am = ambient.Ambient(100, '...writeKey...')

HTTPSで通信したい人の場合(引数sslにTrueを指定すればHTTPSで通信される)

am = ambient.Ambient(100, '...writeKey...', ssl=True)

補足:ESP32+MicroPythonの場合、メモリ残量に注意が必要ですが、
   HTTPSによるPOSTは実行可能です
   (実際には、GCをまめに呼び出さないとExceptionで落ちる場合があります)

@TakehikoShimojima
Copy link
Collaborator

ssl=True が指定されたときにHTTPSでアクセスするのはよさそうですね。

MicroPython Forum の以下の投稿を見ると、MicroPythonでHTTPSはサポートされているが、certificate validationが正しく実装されてないと書かれています。2019年の投稿なので、現在どうなっているか不明です。
https://forum.micropython.org/viewtopic.php?t=6499

また、2022年の投稿ですが、httpsでアクセスできるサイトとできないサイトがあるという投稿もあります。
https://zenn.dev/yuta_enginner/scraps/5fbd35b8f70a39

GCをまめに呼び出さないと例外が発生する場合もあるとのことなので、「HTTPSのサポートは通常のPythonのみ、MicroPythonのときはサポートしない」としようと思いますが、いかがでしょうか?

@ESPuPy
Copy link
Author

ESPuPy commented Mar 28, 2023

お返事ありがとうございます。

certificate validationが正しく実装されてないと書かれています。

これは仰る通りで、MicroPythonのオンラインマニュアルにも
TLS/SSLの実装によってはサーバの正当性確認は実装されていないと
書かれています。
https://docs.micropython.org/en/latest/library/ssl.html
ですのでMicroPython では HTTPSで通信しているからと言って
安心できないですね。

また、2022年の投稿ですが、httpsでアクセスできるサイトとできない
サイトがあるという投稿もあります。

この情報は知りませんでした。普段の試作ではMircoPython+HTTPSで問題なく
通信できていますが、記事を書かれた方が使われたサイトの場合、サーバ側が
サポートする暗号スイートとMicroPythonのSSL/TLSライブラリがサポートする
暗号化方式が一致しないのかもしれません(推測ですが)。

「HTTPSのサポートは通常のPythonのみ、MicroPythonのときはサポートしない」と
しようと思いますが、いかがでしょうか?

ご提案ありがとうございます。上記改善案で良いのではないでしょうか。
どうしてもMicroPythonでHTTPS通信したいと思う人は、公開していただいているライブラリを
参照して各自で改良すれば良いと思います(補足)。

この度はソースの改善に向けてご検討くださりありがとうございました。

補足:だったら関数の引数増やさずとも各自でやったら?ということになるかもしれませんが、
ソース上に「HTTPS通信も可能」と実装例が書かれているのは、ライブラリやAPIを使う側に
とって貴重な情報と思っています。

@TakehikoShimojima
Copy link
Collaborator

HTTPS対応をリリースしました。

@ESPuPy
Copy link
Author

ESPuPy commented Mar 29, 2023

この度はHTTPSに対応してくださりありがとうございました。
ラズパイやESP32+MicroPython等で試してみます。
お手数をおかけいたしました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants