Proxy do Netcat para o serviço ssl

0

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.

    
por lager 21.09.2017 / 09:24

0 respostas