Как заставить 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 в клиент, как показано на рисунке.

Пример конфигурации

Сейчас:

  • если клиент предоставит ложный сертификат, соединение будет отклонено
  • Если клиент-клиент предоставил хороший сертификат, соединение принято
  • Но если клиент не предоставит сертификат, соединение также будет принято

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

Я также пытался раскомментировать, в модах включен / 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 и хочет мне помочь, это было бы здорово.

Спасибо

1 ответ

Решение

Да я нашел ожидание

Я должен включить 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}"
            }

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

Другие вопросы по тегам