Назад | Перейти на главную страницу

Как заставить freeradius проверять действительность сертификатов?

Я пытаюсь установить сервер freeradius на свой компьютер с debian 9. Мне удалось установить его с помощью apt. Мне также удалось запустить его, принять пользователя и пароль и отклонить соединение, если вы не укажете хорошего пользователя и пароль.

Но мне нужно внедрить проверку сертификатов. Я следил за официальной документацией https://wiki.freeradius.org/guide/WPA%20HOWTO

cd /etc/freeradius/3.0/certs/
make

Он сгенерировал несколько сертификатов, и я изменил /etc/freeradius/3.0/mods-enabled/eap

tls-config tls-common {
            private_key_password = whatever
            private_key_file = /etc/freeradius/3.0/certs/server.key

            #  If Private key & Certificate are located in
            #  the same file, then private_key_file &
            #  certificate_file must contain the same file
            #  name.
            #

#  If ca_file (below) is not used, then the
            #  certificate_file below MUST include not
            #  only the server certificate, but ALSO all
            #  of the CA certificates used to sign the
            #  server certificate.
            certificate_file = /etc/freeradius/3.0/certs/server.pem

            #  Trusted Root CA list
            #
            #  ALL of the CA's in this list will be trusted
            #  to issue client certificates for authentication.
            #
            #  In general, you should use self-signed
            #  certificates for 802.1x (EAP) authentication.
            #  In that case, this CA file should contain
            #  *one* CA certificate.
            #
            ca_file = /etc/freeradius/3.0/certs/ca.pem

Затем я настроил файл пользователя и client.conf, как указано в официальной документации. Я установил ca.pem в клиент, как показано на рисунке.

config Пример

Сейчас:

И я хотел бы настроить freeradius, чтобы отклонять соединение, когда клиент не представляет действительный сертификат.

Я также попытался раскомментировать в mods-enabled / eap

#       require_client_cert = yes

Но тогда freeradius больше не принимает соединения.

Вот журнал, который у меня есть, когда я пытаюсь использовать этот параметр

(5) eap_ttls: Authenticate
(5) eap_ttls: Continuing EAP-TLS
(5) eap_ttls: [eaptls verify] = ok
(5) eap_ttls: Done initial handshake
(5) eap_ttls: TLS_accept: SSLv3/TLS write server done
(5) eap_ttls: <<< recv TLS 1.2  [length 0007] 
(5) eap_ttls: >>> send TLS 1.2  [length 0002] 
(5) eap_ttls: ERROR: TLS Alert write:fatal:handshake failure
tls: TLS_accept: Error in error
(5) eap_ttls: ERROR: Failed in __FUNCTION__ (SSL_read): error:1417C0C7:SSL                 routines:tls_process_client_certificate:peer did not return a certificate
(5) eap_ttls: ERROR: System call (I/O) error (-1)
(5) eap_ttls: ERROR: TLS receive handshake failed during operation
(5) eap_ttls: ERROR: [eaptls process] = fail
(5) eap: ERROR: Failed continuing EAP TTLS (21) session.  EAP sub-module failed
(5) eap: Sending EAP Failure (code 4) ID 5 length 4
(5) eap: Failed in EAP select
(5)     [eap] = invalid
(5)   } # authenticate = invalid
(5) Failed to authenticate the user

Итак, мой вопрос: как мне заставить freeradius проверять, присутствует ли сертификат и является ли он правильным?

Пробовал несколько дней. Так что, если кто-то уже установил сервер freeradius и готов мне помочь, было бы здорово.

Спасибо

Да я нашел ждать

Я должен включить EAP-TLS

Тогда вы должны дать Сертификат CA и сертификат пользователя

Сертификат Ca используется только для защиты соединения, а не для идентификации. Дело в том, что у клиента может не быть сертификата CA, и он все равно будет работать.

Это когда сертификат пользователя приходит на помощь. Вы можете использовать его для идентификации пользователя.

В файле

mods-enabled/eap

вы можете реализовать настраиваемую проверку. Таким образом, вы можете реализовать свой собственный сценарий. И вы можете использовать

%{TLS-Client-Cert-Filename}

переменная для получения сертификата пользователя.

Затем вы передаете его своему сценарию и выполняете проверку самостоятельно. Ты можешь использовать:

openssl verify 

Сделать это или что-нибудь еще. Мой сценарий:

/etc/freeradius/3.0/scripts/log.sh

Это выход 0 при успехе и выход 1 при неудаче. И таким образом разрешить или запретить доступ пользователю.

Вот мой файл конфигурации с поддержкой модов / eap для тех, кому может понадобиться

verify {
                    #  If the OCSP checks succeed, the verify section
                    #  is run to allow additional checks.
                    #
                    #  If you want to skip verify on OCSP success,
                    #  uncomment this configuration item, and set it
                    #  to "yes".
                    #skip_if_ocsp_ok = no

                    #  A temporary directory where the client
                    #  certificates are stored.  This directory
                    #  MUST be owned by the UID of the server,
                    #  and MUST not be accessible by any other
                    #  users.  When the server starts, it will do
                    #  "chmod go-rwx" on the directory, for
                    #  security reasons.  The directory MUST
                    #  exist when the server starts.
                    #
                    #  You should also delete all of the files
                    #  in the directory when the server starts.
                    tmpdir = /tmp/radiusd

                    #  The command used to verify the client cert.
                    #  We recommend using the OpenSSL command-line
                    #  tool.
                    #
                    #  The ${..ca_path} text is a reference to
                    #  the ca_path variable defined above.
                    #
                    #  The %{TLS-Client-Cert-Filename} is the name
                    #  of the temporary file containing the cert
                    #  in PEM format.  This file is automatically
                    #  deleted by the server when the command
                    #  returns.
                    client = "/bin/bash /etc/freeradius/3.0/scripts/log.sh %{TLS-Client-Cert-Filename} %{Client-IP-Address}"
            }

Клиентская часть важна.