外部記憶装置

脳みそ小さすぎるからメモしとく

Android 12 で EAP-TLS の認証ができないときの対処方法

結論: 証明書の再インストール

大学に設置されている無線APではクライアント証明書による EAP-TLS 認証を利用しているが、 Android 12 にアップデートした Pixel 3a では認証できなくなったため問題を調査した。

状況

  • Android 12 にアップグレードした Pixel 3a で Wi-FiEAP-TLS 認証ができない
  • Android 11 の端末や新しく証明書をインストールした場合は認証が通る

Android のバージョン情報

f:id:PiBVT:20211112152418p:plain

問題調査

ADB shell 経由 logcat | grep wpa_supplicant で認証失敗時の wpa_supplicant のログを吸い上げた。

11-12 14:24:25.867   766   766 I wpa_supplicant: wlan0: Associated with (対象APのBSSID)
11-12 14:24:25.867   766   766 I wpa_supplicant: wlan0: CTRL-EVENT-EAP-STARTED EAP authentication started
11-12 14:24:25.868   766   766 I wpa_supplicant: wlan0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
11-12 14:24:25.882   766   766 I wpa_supplicant: wlan0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=13
11-12 14:24:25.883   766   766 I wpa_supplicant: tls_connection_set_params: Clearing pending SSL error: error:0c00009e:ASN.1 encoding routines:OPENSSL_internal:NESTED_ASN1_ERROR
11-12 14:24:25.884   766   766 W wpa_supplicant: EVP_PKEY_from_keystore2:347 Keystore backend used with legacy alias prefix - ignoring.
11-12 14:24:25.886   766   766 E wpa_supplicant: EVP_PKEY_from_keystore2:389 Failed to parse x509 certificate.
11-12 14:24:25.886   766   766 E wpa_supplicant: ENGINE: cannot load private key with id 'USRPKEY_(証明書の名前)' [error:0c0000be:ASN.1 encoding routines:OPENSSL_internal:WRONG_TAG]
11-12 14:24:25.886   766   766 I wpa_supplicant: TLS: Failed to initialize engine
11-12 14:24:25.886   766   766 I wpa_supplicant: TLS: Failed to set TLS connection parameters, error code: -2
11-12 14:24:25.886   766   766 I wpa_supplicant: EAP-TLS: Failed to initialize SSL.
11-12 14:24:25.887   766   766 I wpa_supplicant: wlan0: CTRL-REQ-PIN-0:PIN needed for SSID (対象APのSSID)
11-12 14:24:25.887   766   766 I wpa_supplicant: wlan0: EAP: Failed to initialize EAP method: vendor 0 method 13 (TLS)

まず NESTED_ASN1_ERROR について調査したが情報が見つからなかったのでスルーした。

次に、EVP_PKEY_from_keystore2:389 Failed to parse x509 certificate. について調査したところ、Android 12 で導入された keystore2 のコミットログにそのような文字列が見つかった。

android.googlesource.com

f:id:PiBVT:20211112151802p:plain

コミットログを見たところ、

Keystore 2.0 engine: Handle legacy PEM certificates.

Keystore 2.0 in Android S requires all new certificates to be stored in
DER format, however, when upgrading from R or older, there may be
certificates stored in PEM format. This patch allows keystore2-engine to
extract the public keys from certificates in either format.

とあることから、Android 12 では証明書を管理するフォーマットが変わっており、このコミットで古いフォーマットについてもハンドルするようにしたことがわかる。 しかし、手元の端末では該当コミットで削除された Failed to parse x509 certificate. が出力されていることや、システムアップデートの日時以降のコミットであることから、 現在の Android 12 では この該当コミットが取り込まれていない可能性がある。

対応

古いフォーマットの証明書が読めていない可能性が高いため、再インストールすれば問題は解決するはずである。 結果、証明書を一度削除してから再インストールしたところ、無事接続に成功するようになった。