結論: 証明書の再インストール
大学に設置されている無線APではクライアント証明書による EAP-TLS 認証を利用しているが、 Android 12 にアップデートした Pixel 3a では認証できなくなったため問題を調査した。
状況
Android のバージョン情報
問題調査
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 のコミットログにそのような文字列が見つかった。
コミットログを見たところ、
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 では この該当コミットが取り込まれていない可能性がある。
対応
古いフォーマットの証明書が読めていない可能性が高いため、再インストールすれば問題は解決するはずである。 結果、証明書を一度削除してから再インストールしたところ、無事接続に成功するようになった。