0

Since I upgraded to Debian 10 I am unable to connect to eduroam. As it turns out my employer decided to use EAP-TLS with client certificates signed using the MD5 hash function.

From what I can find on the web, MD5 signed certificates are disabled in OpenSSL version 1.1 and the wpa_supplicant logs seem to confirm it:

wpa_supplicant[718]: EAP: EAP entering state RECEIVED
wpa_supplicant[718]: EAP: Received EAP-Request id=3 method=13 vendor=0 vendorMethod=0
wpa_supplicant[718]: EAP: EAP entering state GET_METHOD
wpa_supplicant[718]: wlp4s0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=13
wpa_supplicant[718]: EAP: Status notification: accept proposed method (param=TLS)
wpa_supplicant[718]: EAP: Initialize selected EAP method: vendor 0 method 13 (TLS)
wpa_supplicant[718]: TLS: using phase1 config options
wpa_supplicant[718]: TLS: Trusted root certificate(s) loaded
wpa_supplicant[718]: OpenSSL: tls_connection_client_cert - SSL_use_certificate_file failed error:140C618E:SSL routines:SSL_use_certificate:ca md too weak
wpa_supplicant[718]: TLS: Failed to set TLS connection parameters
wpa_supplicant[718]: ENGINE: engine deinit
wpa_supplicant[718]: EAP-TLS: Failed to initialize SSL.
wpa_supplicant[718]: wlp4s0: EAP: Failed to initialize EAP method: vendor 0 method 13 (TLS)

Is there a way in OpenSSL 1.1 to enable MD5, preferably only for wpa_supplicant?

0

For posterity's sake, I'll ended up reading the source code of OpenSSL and wpa_supplicant and found a (partial) solution.

The problem is caused by OpenSSL's default security callback, which (reasonably) disable the usage of MD5 on every level: certificate signature and tunnel cipher suite. I would like to disable this check for client certificates, since this does not give any security risk on my part (the other endpoint should be concerned). However this can not be done without replacing the security callback, which is not a clean solution.

Therefore the only way to use a weak client certificate in wpa_supplicant is to decrease the security level to 0. While most Google searches for "ca md too weak" end up suggesting to modify the default OpenSSL configuration to include:

openssl_conf = <section_default_conf>

[<section_default_conf>]
ssl_conf = <section_ssl_conf>

[<section_ssl_conf>]
system_default = <section_system_default>

[<section_system_default>]
MinProtocol = TLSv1
CipherString = DEFAULT@SECLEVEL=0

where <section_default_conf>, <section_ssl_conf> and <section_system_default> are arbitrary names, this will not work with wpa_supplicant, which overrides the default configuration.

In order to decrease the security level for wpa_supplicant I had to provide him with a configuration file (/etc/wpa_supplicant/wpa_supplicant.conf) which contains:

openssl_ciphers=DEFAULT@SECLEVEL=0

This setting is used only if wpa_supplicant is called with an interface parameter (-i <interface>). As most users, I don't use wpa_supplicant directly, but I use NetworkManager to do it. On Debian the two are run as services and communicate through DBus (or a Unix socket).

Since NetworkManager is not able to pass the openssl_ciphers parameter to wpa_supplicant, this must be done for all WiFi connections by modifying the wpa_supplicant.service (through systemctl edit --full wpa_supplicant.service), so that the exec instruction from:

ExecStart=/sbin/wpa_supplicant -u -s -O /run/wpa_supplicant

reads:

ExecStart=/sbin/wpa_supplicant -u -s -O /run/wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf

where wlan0 is the name of the (only) WiFi interface.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.