EAP-TLS Patterns
EAP-TLS authentication patterns I’ve actually used. Every entry has a date and context.
2026-04-03: Certificate CN Must Match System Identity
Problem: EAP-TLS authentication failed — cert had CN=modestus-t16g but hostname was corrected to modestus-p16g mid-deployment.
Context: P16g deployment. Initial hostname was modestus-t16g (T-series naming), corrected to modestus-p16g (P-series). Certificate issued with old name. ISE authorization checks identity against CN.
The Fix:
# Re-issue cert with correct CN
HOSTNAME="modestus-p16g"
vault write -format=json pki_int/issue/domus-client \
common_name="${HOSTNAME}.inside.domusdigitalis.dev" \
ttl=8760h \
| tee /tmp/${HOSTNAME}-vault-cert.json \
| jq '{common_name: .data.common_name, serial: .data.serial_number}' \
> /tmp/${HOSTNAME}-vault-summary.json
# Update nmcli identity to match new CN
nmcli connection modify "Domus-Wired-EAP-TLS" \
802-1x.identity "${HOSTNAME}.inside.domusdigitalis.dev"
nmcli connection modify "Domus-WiFi-EAP-TLS" \
802-1x.identity "${HOSTNAME}.inside.domusdigitalis.dev"
Rule: Certificate CN and nmcli 802-1x.identity MUST match. If hostname changes, re-issue the cert AND update nmcli. Three things must align: certificate CN, nmcli identity, and /etc/hostname.
Worklog: WRKLOG-2026-04-03
2026-04-03: Wired vs WiFi nmcli Differences
Problem: WiFi 802.1X connection creation fails with "invalid property identity-flags" when copying the wired config pattern.
Context: P16g EAP-TLS deployment, creating both wired and WiFi connections.
The Fix:
# WIRED — identity-flags 0 is valid (stores identity in connection file)
sudo nmcli connection add \
type ethernet \
con-name "Domus-Wired-EAP-TLS" \
ifname "$WIRED_IF" \
802-1x.eap tls \
802-1x.identity "modestus-p16g.inside.domusdigitalis.dev" \
802-1x.identity-flags 0 \
802-1x.ca-cert /etc/ssl/certs/DOMUS-CA-CHAIN.pem \
802-1x.client-cert /etc/ssl/certs/modestus-p16g-eaptls.pem \
802-1x.private-key /etc/ssl/private/modestus-p16g-eaptls.key \
802-1x.private-key-password-flags 4 \
connection.autoconnect yes
# WIFI — NO identity-flags (causes "invalid property" error)
sudo nmcli connection add \
type wifi \
con-name "Domus-WiFi-EAP-TLS" \
ifname wlan0 \
ssid "Domus-Secure" \
wifi-sec.key-mgmt wpa-eap \
802-1x.eap tls \
802-1x.identity "modestus-p16g.inside.domusdigitalis.dev" \
802-1x.ca-cert /etc/ssl/certs/DOMUS-CA-CHAIN.pem \
802-1x.client-cert /etc/ssl/certs/modestus-p16g-eaptls.pem \
802-1x.private-key /etc/ssl/private/modestus-p16g-eaptls.key \
802-1x.private-key-password-flags 4 \
connection.autoconnect yes
Rule: identity-flags 0 is wired-only. WiFi stores identity by default — adding identity-flags causes an error. private-key-password-flags 4 is required for passwordless keys on BOTH types.
Worklog: WRKLOG-2026-04-03
2026-04-03: WiFi Backend Switch (iwd to wpa_supplicant)
Problem: Enterprise 802.1X EAP-TLS requires wpa_supplicant, but Arch defaults to iwd as the WiFi backend.
Context: P16g deployment, NetworkManager WiFi backend configuration.
The Fix:
# Configure NetworkManager to use wpa_supplicant
sudo mkdir -p /etc/NetworkManager/conf.d
echo -e "[device]\nwifi.backend=wpa_supplicant" | \
sudo tee /etc/NetworkManager/conf.d/wifi_backend.conf
# Disable iwd completely
sudo systemctl stop iwd 2>/dev/null
sudo systemctl disable iwd 2>/dev/null
sudo systemctl mask iwd
# Enable wpa_supplicant + restart NetworkManager
sudo systemctl enable wpa_supplicant
sudo systemctl start wpa_supplicant
sudo systemctl restart NetworkManager
Rule: iwd does not support enterprise 802.1X. Switch to wpa_supplicant backend before creating EAP-TLS connections. Mask iwd to prevent it from interfering.
Worklog: WRKLOG-2026-04-03
2026-04-03: Never Bounce WiFi Over SSH
Problem: Running nmcli connection down for WiFi from an SSH session over that same WiFi kills the session instantly. connection up never runs.
Context: P16g deployment, attempting to activate WiFi EAP-TLS from SSH over iPSK WiFi.
The Fix:
# Option A: Run locally on the machine
sudo nmcli connection down "Domus-WiFi-EAP-TLS" && \
sudo nmcli connection up "Domus-WiFi-EAP-TLS"
# Option B: nohup survives the SSH disconnect
echo 'sleep 2 && sudo nmcli connection down "Domus-WiFi-EAP-TLS" && sudo nmcli connection up "Domus-WiFi-EAP-TLS"' > /tmp/bounce-wifi.sh
chmod +x /tmp/bounce-wifi.sh
nohup /tmp/bounce-wifi.sh &
# Wait 30s, then SSH back in (DHCP may reassign IP)
Rule: Never bounce a network connection from an SSH session that depends on that connection. Use nohup with a sleep, or walk to the machine.
Worklog: WRKLOG-2026-04-03