🗺

PythonでIMAP接続に使われた暗号化バージョンをチェックする

2023/12/12に公開

小ネタです🍣

AWSにおいて、暗号化通信に用いられるプロトコルの最小バージョンが TLS 1.2 以上となることが2022年6月にアナウンスされていましたが、これはSDKなどが利用しているAPIエンドポイントを指しており、サービス内で独自にエンドポイントを定義するものについては一部が未対応の状態になっていました

https://aws.amazon.com/jp/blogs/news/tls-1-2-required-for-aws-endpoints/

例えば、マネージドのIMAPサービスであるWorkMailにおいては上記対応の期限が2023年12月であることを通知されていました
これについて、現状で期待される要件を満たせているか、検証をおこないました

https://aws.amazon.com/jp/workmail/

以下のPythonスクリプトを稼働環境のインスタンスから実行します(作業は自己責任でお願いします)
これは、私のプロダクトにおいてIMAPサーバへの接続にPythonを用いているためで、その他の言語で実装されている場合は各言語の方法で接続する必要があるものと思います

def check():
    from pprint import pprint
    import imaplib

    imap_host = 'imap.mail.xxxxx.awsapps.com'
    imap_user = 'yyy'
    imap_pass = 'zzz'

    # IMAPサーバへのログイン
    # ここは接続方法がいくつかありますが、本番環境と同じ方法でログインをおこなってください
    imap = imaplib.IMAP4_SSL(client.imap_host)
    # トレース情報を出力
    imap.debug = 3
    imap.login(client.imap_user, client.imap_pass)

    # IMAPログ
    pprint(imap.__dict__)
    # 暗号化ネゴシエーション方法
    print(imap.ssl_context.protocol)
    # 実際に選択されたプロトコル
    print(imap.sock.version())

出力結果のサンプルは以下になります

{
  略
   '_cmd_log': {0: ("< b'* OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS "
                  'ENABLE IDLE LITERAL+ AUTH=PLAIN] Amazon WorkMail IMAP '
                  "Proxy'",
                  1702349334.135103),
              略
              },
  略
}
_SSLMethod.PROTOCOL_TLS
TLSv1.3

debug に3以上の値を設定すると _cmd_log にコマンドに対して受信したトレースログが格納されるようです

https://docs.python.org/ja/3/library/imaplib.html#imaplib.IMAP4.debug

https://docs.python.org/ja/3/library/imaplib.html#imaplib.IMAP4_SSL

PROTOCOL_TLS は暗号化バージョンを固定せず、ネゴシエーションにより最も高いバージョンを決定するとのことです

https://docs.python.org/ja/3/library/ssl.html#ssl.SSLContext

https://docs.python.org/ja/3/library/ssl.html#ssl.PROTOCOL_TLS

その結果、現在の環境では自動的に TLSv1.3 が選択されているようなので、対応は不要でよさそうです🐖

https://docs.python.org/ja/3/library/ssl.html#ssl.SSLSocket.version

https://docs.python.org/ja/3/library/ssl.html#ssl.SSLSocket

なお、Pythonは暗号化通信などの機能実現のためにOpenSSL に依存しているので、期待する結果が得られなかった場合は、利用しているインスタンスやコンテナ内のOpenSSLのバージョンアップが必要になるものと思われます

https://www.python.jp/news/wnpython310/require-openssl11.html

OpenSSLからAWSに期待する暗号化レベルで接続できるか確認する方法は以下です

# OpenSSLのバージョン確認
openssl version

# IMAPエンドポイントに TLS 1.2 で接続できるかどうか
openssl s_client -connect imap.mail.xxxxx.awsapps.com:993 -tls1_2

そんだけ😌

Discussion