0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Tornado SSL(https)で起動させる

Last updated at Posted at 2024-11-22

はじめに

MH ソフトウェア & サービスが開発・公開している、Webアプリケーションサーバ AiRの便利かな?と思われるコードの紹介です。
Webアプリケーションサーバ AiRはPython、Tornado(Webフレームワーク、Webサーバ)、JavaScript、その他のモジュールで構成されています。


TornadoはSSL(https)で起動できます。
Let's Encryptの例では、RAS秘密鍵が private.key に、fullchain.pem が certificate.crt になります。
private.keyとcertificate.crtをデータフォルダに作成します。


SSL(https)用のファイルが存在するか確認し、存在すればTrueとSSLContextを返します。

def _check_ssl() -> tuple[bool, Union[ssl.SSLContext, None]]:
    """SSL Check.

    :sig: () -> tuple(bool, ssl.SSLContext)
    """
    crt_files = glob.glob("./*.crt")
    key_files = glob.glob("./*.key")
    ssl_ctx: Union[ssl.SSLContext, None] = None

    result = False
    if (len(crt_files) > 0) & (len(key_files) > 0):
        ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
        # NOTE: If ssl_ctx.load_cert_chain ahs error, crt or key is wrong format.
        try:
            ssl_ctx.load_cert_chain(crt_files[0], key_files[0])
            result = True
        except ssl.SSLError:
            print("crt or key file is wrong format.\n")
            result = False
    return (result, ssl_ctx)

その戻り値を使って、_http_serverからtornado.httpserver.HTTPServerとportを取得して、http_serverを起動します。

    ssl_enabled, ssl_ctx = _check_ssl()

    hat = Hat(system_name, __version__, tornado.options.options)
    http_server, port = _http_server(ssl_enabled, hat, ssl_ctx)

    try:
        http_server.listen(port)
    except OSError:
        _alert_message()
        http_server.listen(81)

hatは特別なクラスです。

def _http_server(
    ssl_enabled: bool, hat_: Hat, ssl_ctx: Union[ssl.SSLContext, None],
) -> tuple[tornado.httpserver.HTTPServer, int]:
    """Retrun http sever.

    # pylint: disable=line-too-long
    :sig: (bool, Hat, Union[ssl.SSLContext, None]) -> tuple[tornado.httpserver.HTTPServer, int]
    """
    result: tornado.httpserver.HTTPServer
    if ssl_enabled:
        result = tornado.httpserver.HTTPServer(
            Application(hat_),
            ssl_options=ssl_ctx,
        )
        # これはhttpsサーバのポート番号です
        port = 443
    else:
        result = tornado.httpserver.HTTPServer(
            Application(hat_),
            decompress_request=True,
        )
        # これはhttpサーバのポート番号です
        port = 80
    return (result, port)

Webアプリケーションサーバ AiR


弊社webページ: AiR

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?