Estou tentando resolver uma tarefa na infraestrutura complexa do servidor RADIUS. O servidor central executa o servidor RADIUS e possui vários endereços IP. Outros servidores na infra-estrutura se conectam ao servidor central com o RadSec (porta tcp 2083). O servidor central também se conecta a todos os outros servidores da infra-estrutura para o Radsec. Pode ser imaginado como topologia em estrela.
O problema é que o servidor central tem vários endereços IP (como aliases em uma interface). Ao depurar problemas com outros servidores RADIUS na infraestrutura, seria muito útil poder usar openssl s_client
para se conectar à porta RadSec de outros servidores e examiná-la. Infelizmente, o openssl não fornece uma maneira de especificar o endereço de origem.
Em vez de corrigir o openssl, decidi tentar usar o netcat para criar um proxy e usar o openssl com ele. O script wrapper está disponível em: link .
Exemplo de execução do script (executado em r1nren.et.cesnet.cz):
root@r1nren:~/scripts/openssl_source_ip# ./openssl_source_ip_old.sh nren.et.cesnet.cz org1.et.cesnet.cz 2083 ~/cert/r1nren.et.cesnet.cz.crt.pem ~/cert/serverkey_nopass.pem
issuer=
countryName = NL
stateOrProvinceName = Noord-Holland
localityName = Amsterdam
organizationName = TERENA
commonName = TERENA SSL CA 3
subject=
countryName = CZ
localityName = Praha
organizationName = CESNET, z\E1jmov\E9 sdru\U017Een\ED pr\E1vnick\FDch osob
commonName = org1.et.cesnet.cz
notBefore=Aug 21 00:00:00 2017 GMT
notAfter=Aug 29 12:00:00 2018 GMT
Saída de depuração do freeradius em execução em org1.et.cesnet.cz:
(0) <<< recv TLS 1.2 [length 0002]
(0) WARNING: No data inside of the tunnel
(0) Application data status 7
Waking up in 0.2 seconds.
Closing TLS socket from client port 40471
(0) >>> send TLS 1.2 [length 0002]
Client has closed connection
... shutting down socket auth+acct from client (78.128.211.53, 40471) -> (*, 2083, virtual-server=default)
O problema com o script é, às vezes, falha (executado em r1nren.et.cesnet.cz):
root@r1nren:~/scripts/openssl_source_ip# ./openssl_source_ip_old.sh nren.et.cesnet.cz org1.et.cesnet.cz 2083 ~/cert/r1nren.et.cesnet.cz.crt.pem ~/cert/serverkey_nopass.pem
unable to load certificate
140500110750976:error:0906D06C:PEM routines:PEM_read_bio:no start line:../crypto/pem/pem_lib.c:691:Expecting: TRUSTED CERTIFICATE
unable to load certificate
139758493082880:error:0906D06C:PEM routines:PEM_read_bio:no start line:../crypto/pem/pem_lib.c:691:Expecting: TRUSTED CERTIFICATE
Saída de depuração do freeradius em execução em org1.et.cesnet.cz:
... new connection request on TCP socket
Listening on auth+acct from client (78.128.211.53, 53703) -> (*, 2083, virtual-server=default)
Waking up in 0.2 seconds.
(0) Initiating new EAP-TLS session
(0) Setting verify mode to require certificate from client
(0) Non-TLS data sent to TLS socket: closing
Closing TLS socket from client port 53703
Client has closed connection
... shutting down socket auth+acct from client (78.128.211.53, 53703) -> (*, 2083, virtual-server=default)
Waking up in 2.9 seconds.
... new connection request on TCP socket
Listening on auth+acct from client (78.128.211.53, 59943) -> (*, 2083, virtual-server=default)
Waking up in 0.2 seconds.
Waking up in 2.7 seconds.
EDITAR: quando o script é modificado ( link ) a saída é:
root@r1nren:~/scripts/openssl_source_ip# ./openssl_source_ip_old.sh nren.et.cesnet.cz org1.et.cesnet.cz 2083 ~/cert/r1nren.et.cesnet.cz.crt.pem ~/cert/serverkey_nopass.pem
140657420121344:error:0200206F:system library:connect:Connection refused:../crypto/bio/b_sock2.c:108:
140657420121344:error:2008A067:BIO routines:BIO_connect:connect error:../crypto/bio/b_sock2.c:109:
connect:errno=111
Saída de depuração do freeradius em execução em org1.et.cesnet.cz:
... new connection request on TCP socket
Listening on auth+acct from client (78.128.211.53, 38291) -> (*, 2083, virtual-server=default)
Waking up in 0.2 seconds.
(0) Initiating new EAP-TLS session
(0) Setting verify mode to require certificate from client
(0) Non-TLS data sent to TLS socket: closing
Closing TLS socket from client port 38291
Client has closed connection
... shutting down socket auth+acct from client (78.128.211.53, 38291) -> (*, 2083, virtual-server=default)
Waking up in 2.9 seconds.
... new connection request on TCP socket
Listening on auth+acct from client (78.128.211.53, 48169) -> (*, 2083, virtual-server=default)
Waking up in 0.2 seconds.
Waking up in 2.7 seconds.
EDIT 2:
Quando o servidor r1.nren.et.cesnet.cz está usando apenas o enderço IP 78.128.211.53, o comando openssl s_client -connect org1.et.cesnet.cz:2083 -cert /root/cert/r1nren.et.cesnet.cz.crt.pem -key /root/cert/serverkey_nopass.pem < /dev/null >/dev/null
é executado sem problemas.
Ao executar o script com apenas um endereço IP, o problema também existe (mesmo na saída abaixo).
Quando a saída do comando openssl no script não é redirecionada do / dev / null (estado original com múltiplos endereços ip), quando o estado problemático ocorre, a saída é:
root@r1nren:~/scripts/openssl_source_ip# ./openssl_source_ip_old.sh nren.et.cesnet.cz org1.et.cesnet.cz 2083 ~/cert/r1nren.et.cesnet.cz.crt.pem ~/cert/serverkey_nopass.pem
CONNECTED(00000003)
write:errno=0
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 176 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1505988383
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
---
Saída de depuração do freeradius em execução em org1.et.cesnet.cz:
... new connection request on TCP socket
Listening on auth+acct from client (78.128.211.53, 35231) -> (*, 2083, virtual-server=default)
(0) Initiating new EAP-TLS session
(0) Setting verify mode to require certificate from client
(0) Non-TLS data sent to TLS socket: closing
Closing TLS socket from client port 35231
Client has closed connection
... shutting down socket auth+acct from client (78.128.211.53, 35231) -> (*, 2083, virtual-server=default)
Waking up in 2.7 seconds.
... new connection request on TCP socket
Listening on auth+acct from client (78.128.211.53, 45367) -> (*, 2083, virtual-server=default)
Waking up in 2.6 seconds.
O que me parece que o freeradius não enviou seu certificado para o openssl.
Não sei ao certo onde está o problema. É possível resolver esse problema usando apenas essa abordagem?
Importa que o nc não tenha suporte SSL se apenas cria um proxy (veja o script)? No meu entender, ele simplesmente move os dados de um lado para outro do canal, então isso não deve importar, mas eu não entendo porque às vezes ele falha.
Obrigado pela ajuda.