Freeradius CRL Problem - combined CA and CRL dont work
PiotrChm
piotrchm93 at gmail.com
Sat Jun 29 13:10:47 UTC 2024
Hello and welcome,
Dear community, I am asking for help. I've been struggling with
configuring Freeradius in my home lab for several days. And I've reached
a wall that I can't overcome.
What does the architecture look like:
AD Controller dc1.lab.lan
Freeradius 3.0.21 (Debian 11 bullseye)
Unifi Controller (on Debian)
AP Unifi
CA (using xCA - issuing certificates manually)
Everything is on one local network 192.168.80.x/24, Gateway 192.168.80.1
DNS 192.168.80.21 (dc1).
And so the goal is to authorize users using AD credentials or
certificates issued from xCA. Certificates in pem12 (for android). I
tested on Android 9 and 13.
What works - user authorization using login and password from AD.
EAP-PEAP
MSCHAPv2
Certificate – Imported p12 User+rootCA
Variant 2
EAP-PEAP
MSCHAPv2
Certificate – don't check
Certificates
user authorization through issued certificates works (signed directly by
rootCA for now, without an intermediate authority).
EAP-TLS
Device certificate - Imported p12 User+rootCA
User certificate - Imported p12 User+rootCA
Username: cannot be empty, I have to enter something to make it work,
e.g. AAA (in radius, if the check CN option is selected, it is required
to enter the correct username).
Case two
EAP-TLS
Device cert: labrootca (imported separately – rootCA)
User certificate – user1
Username: whatever
Password: blank
(user1 does not exist in AD or local configuration files and yet
freeradius authorizes it)
My main problem is the CRL not working.
I made a combined rootCA+CRL certificate in pem.
I deleted the .cnf files in /etc/freeradius/3.0/certs because I don't
want to use an external CA (xCA).
I only left bootstrap and dh. I did this before turning on freeradius
C_rehash /etc/freeradius/3.0/certs
New files (links) have appeared.
sudo freeradius -XC => Configuration appears to be OK
Then start freeradius -X => shows no errors
Here is my second question - is it possible to set double authorization,
i.e. the user must have an installed certificate and then provide the
login and password from AD to connect to WiFi?
First of all, please tell me what I can do wrong with this CRL list.
Below are the configuration files (most # comments removed, I left a few
for example)
Labrootca.crt
-----BEGIN CERTIFICATE-----
MIIDljCCAn6gAwIBAgIIWSbrdC7xrG0wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE
BhMCUEwxFjAUBgNVBAoTDWxhYi5wYy1pdC5sYW4xFjAUBgNVBAsTDWxhYi5wYy1p
(rest of cert)
sUTnIqKeufo9rhrL3V/1UPAJK0+2gj+RaXuJcwjrs5pDIiN0NWitepTPZdsl5TaM
NviIhB0RA14UhQ==
-----END CERTIFICATE-----
Labrootcacrl_and_CA.pem
-----BEGIN CERTIFICATE-----
MIIDljCCAn6gAwIBAgIIWSbrdC7xrG0wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE
BhMCUEwxFjAUBgNVBAoTDWxhYi5wYy1pdC5sYW4xFjAUBgNVBAsTDWxhYi5wYy1p
(rest of cert)
sUTnIqKeufo9rhrL3V/1UPAJK0+2gj+RaXuJcwjrs5pDIiN0NWitepTPZdsl5TaM
NviIhB0RA14UhQ==
-----END CERTIFICATE-----
-----BEGIN X509 CRL-----
MIIB4zCBzAIBATANBgkqhkiG9w0BAQsFADBRMQswCQYDVQQGEwJQTDEWMBQGA1UE
ChMNbGFiLnBjLWl0LmxhbjEWMBQGA1UECxMNbGFiLnBjLWl0LmxhbjESMBAGA1UE
(rest of CRL)
9xWxqQIS5Q==
-----END X509 CRL-----
---------EAP FILE---------
eap {
default_eap_type = peap
timer_expire = 60
ignore_unknown_eap_types = no
cisco_accounting_username_bug = no
max_sessions = ${max_requests}
#md5 {
#}
#leap {
#}
#gtc {
#challenge = "Password: "
#auth_type = PAP
#}
tls-config tls-common {
#freerad and key are in the same file so duplicated
private_key_file = /etc/certyfikaty/freerad.pem
certificate_file = /etc/certyfikaty/freerad.pem
ca_file = /etc/freeradius/3.0/certs/labrootcacrl_and_CA.pem
#auto_chain = yes
dh_file = ${certdir}/dh
#random_file = /dev/urandom
#fragment_size = 1024
#include_length = yes
#Check the Certificate Revocation List
#
#1) Copy CA certificates and CRLs to same directory.
#2) Execute 'c_rehash <CA certs&CRLs Directory>'.
#'c_rehash' is OpenSSL's command.
#3) uncomment the lines below.
#5) Restart radiusd
check_crl = yes
# Check if intermediate CAs have been revoked.
check_all_crl = yes
ca_path = /etc/freeradius/3.0/certs/labrootcacrl_and_CA.pem
allow_expired_crl = yes
#check_cert_issuer = "/C=GB/ST=Berkshire/L=Newbury/O=My Company Ltd"
#check_cert_cn = %{User-Name}
cipher_list = "DEFAULT"
cipher_server_preference = no
#disable_tlsv1_2 = no
#disable_tlsv1_1 = yes
#disable_tlsv1 = yes
tls_min_version = "1.2"
tls_max_version = "1.2"
ecdh_curve = "prime256v1"
cache {
enable = no
lifetime = 24 # hours
#name = "EAP module"
#persist_dir = "${logdir}/tlscache"
store {
Tunnel-Private-Group-Id
}
}
verify {
#skip_if_ocsp_ok = no
#tmpdir = /tmp/radiusd
#client = "/path/to/openssl verify -CApath ${..ca_path}
%{TLS-Client-Cert-Filename}"
}
ocsp {
enable = no
override_cert_url = yes
url = "http://127.0.0.1/ocsp/"
#use_nonce = yes
#timeout = 0
#softfail = no
}
}
tls {
tls = tls-common
#virtual_server = check-eap-tls
}
ttls {
tls = tls-common
default_eap_type = md5
copy_request_to_tunnel = no
use_tunneled_reply = no
virtual_server = "inner-tunnel"
#include_length = yes
require_client_cert = yes
}
peap {
tls = tls-common
default_eap_type = mschapv2
copy_request_to_tunnel = no
use_tunneled_reply = no
#proxy_tunneled_request_as_eap = yes
virtual_server = "inner-tunnel"
#soh = yes
#soh_virtual_server = "soh-server"
#require_client_cert = yes
}
mschapv2 {
#send_error = no
#identity = "FreeRADIUS"
}
}
----- SITES DEFAULT ---
server default {
listen {
type = auth
ipaddr = *
port = 0
limit {
max_connections = 16
lifetime = 0
idle_timeout = 30
}
}
listen {
ipaddr = *
#ipv6addr = ::
port = 0
type = acct
limit {
}
}
listen {
type = auth
ipv6addr = ::# any.::1 == localhost
port = 0
limit {
max_connections = 16
lifetime = 0
idle_timeout = 30
}
}
listen {
ipv6addr = ::
port = 0
type = acct
limit {
}
}
authorize {
filter_username
preprocess
chap
mschap
digest
suffix
ntdomain
eap {
ok = return
#updated = return
}
files
-sql
-ldap
expiration
logintime
pap
}
authenticate {
ntlm_auth
Auth-Type PAP {
pap
}
Auth-Type CHAP {
chap
}
Auth-Type MS-CHAP {
mschap
}
mschap
digest
#Auth-Type LDAP {
#ldap
#}
eap
}
preacct {
preprocess
acct_unique
suffix
#ntdomain
files
}
accounting {
detail
unix
-sql
exec
attr_filter.accounting_response
}
session {
}
post-auth {
if (session-state:User-Name && reply:User-Name && request:User-Name &&
(reply:User-Name == request:User-Name)) {
update reply {
&User-Name !* ANY
}
}
update {
&reply: += &session-state:
}
-sql
exec
remove_reply_message_if_eap
Post-Auth-Type REJECT {
# log failed authentications in SQL, too.
-sql
attr_filter.access_reject
eap
remove_reply_message_if_eap
}
Post-Auth-Type Challenge {
#remove_reply_message_if_eap
#attr_filter.access_challenge.post-auth
}
}
pre-proxy {
}
post-proxy {
eap
}
}
---INNER TUNNEL
server inner-tunnel {
listen {
ipaddr = 127.0.0.1
port = 18120
type = auth
}
authorize {
filter_username
chap
mschap
suffix
#ntdomain
update control {
&Proxy-To-Realm := LOCAL
}
eap {
ok = return
}
files
-sql
-ldap
expiration
logintime
pap
}
authenticate {
ntlm_auth
Auth-Type PAP {
pap
}
Auth-Type CHAP {
chap
}
Auth-Type MS-CHAP {
mschap
}
mschap
#Auth-Type LDAP {
#ldap
#}
eap
}
session {
radutmp
}
post-auth {
-sql
#ldap
if (0) {
update reply {
User-Name !* ANY
Message-Authenticator !* ANY
EAP-Message !* ANY
Proxy-State !* ANY
MS-MPPE-Encryption-Types !* ANY
MS-MPPE-Encryption-Policy !* ANY
MS-MPPE-Send-Key !* ANY
MS-MPPE-Recv-Key !* ANY
}
update {
&outer.session-state: += &reply:
}
}
Post-Auth-Type REJECT {
# log failed authentications in SQL, too.
-sql
attr_filter.access_reject
update outer.session-state {
&Module-Failure-Message := &request:Module-Failure-Message
}
}
}
pre-proxy {
}
post-proxy {
eap
}
} # inner-tunnel server block
More information about the Freeradius-Users
mailing list