Как заставить 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}"
}
Клиентская часть является важной.