Návod: TLS v Linphone na Debian 10

tls,srtp,zrtp a bezpečnostní potíže VoIP
Odpovědět
pali
Příspěvky: 100
Registrován: čtv 08. srp 2019 20:20:55

Návod: TLS v Linphone na Debian 10

Příspěvek od pali »

Zdravím. Po dlhšom čase sa mi podarilo rozbehať TLS šifrovanie so SIP serverom Odorik v SIP klientovi Linphone na Debiane 10. Nižšie popíšem všetky problémy a moje riešenie. Dúfam, že to niektomu pomože.

TL;DR: Nastavenie
  1. Uložiť Odorik CA certifikát platný pre port 6670 do súboru /usr/local/share/ca-certificates/sip.odorik.cz.crt
  2. Spustiť: sudo update-ca-certificates
  3. Spustit: sudo iptables -t nat -A OUTPUT -d 81.31.45.51 -p tcp --dport 5061 -j DNAT --to-destination 81.31.45.51:6670
  4. Nastaviť v Linphone pre Odorik SIP účet kolonku Transport na TLS
Prvý problém: Odorik TLS certifikát na štandardnom porte 5061 je nepoužiteľný certifikát

Odorik SIP server sip.odorik.cz na štandardnom TLS porte 5061 používa certifikát so slabým kľúčom a nová verzia openssl knižnice, ktorá je v Debian 10, sa už úplne odmietne s takýmto serverom spojiť. Tzn. TLS certifikát na sip.odorik.cz:5061 je pre všetky aplikácie v nových systémoch už nepoužiteľný. Naozaj linphone a ani žiadna iná aplikácia na Debian 10 už nevie sa so serverom sip.odorik.cz na porte 5061 dohovoriť

Dá sa to overiť openssl príkazom:

Kód: Vybrat vše

$ openssl s_client -verify_return_error -verify_hostname sip.odorik.cz -connect sip.odorik.cz:5061 < /dev/null
Ten skončí s návratovým kódom 1 (error) a vypíše chybu:

Kód: Vybrat vše

depth=0 C = CZ, ST = Czech Republic, O = miniTEL s.r.o., OU = odorik.cz, CN = sip.odorik.cz, emailAddress = kontakt@odorik.cz
verify error:num=66:EE certificate key too weak
139697721169024:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:../ssl/statem/statem_clnt.c:1915:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 1753 bytes and written 312 bytes
Verification error: EE certificate key too weak
Linphone pri pokuse o spojenie vypíše chybu:

Kód: Vybrat vše

message: 2019-12-29 10:54:35:307 Found certificate depth=[0], flags=[unacceptable-key ]:
cert. version     : 3
serial number     : 01
issuer name       : CN=OdorikCA, ST=Czech Republic, C=CZ, emailAddress=kontakt@minitel.cz, O=miniTEL s.r.o.
subject name      : C=CZ, ST=Czech Republic, O=miniTEL s.r.o., OU=odorik.cz, CN=sip.odorik.cz, emailAddress=kontakt@odorik.cz
issued  on        : 2016-04-26 14:24:51
expires on        : 2055-09-29 14:24:51
signed using      : RSA with SHA1
RSA key size      : 512 bits
basic constraints : CA=true

error: 2019-12-29 10:54:35:307 Channel [0x55875a4d0090]: SSL handshake failed : X509 - Certificate verification failed, e.g. CRL, CA or signature check failed
error: 2019-12-29 10:54:35:307 Cannot connect to [TLS://sip.odorik.cz:5061]
message: 2019-12-29 10:54:35:307 channel 0x55875a4d0090: state ERROR
Na stránke http://www.odorik.cz/w/srtp sa píše, že Odorik má nový certifikát na porte 6670. Ten už nepoužíva slabé kľúče ale stále nejde.

Druhý problém: Odorik TLS certifikát je self-signed

Jediné riešenie je teda použiť TLS port 6670 na serveri sip.odorik.cz. Pri pokuse o spojenie ale openssl knižnica vyhodí inú chybu. Konkrétne ten Odorik certifikát nie je podpísaný žiadnou certifikačnou autoritou, ktorá by bola zahrnutá v Debian 10 a openssl odmietne s takýmto serverom spojenie. Odorik certifikát je self-sign.

Kód: Vybrat vše

$ openssl s_client -verify_return_error -verify_hostname sip.odorik.cz -connect sip.odorik.cz:6670 < /dev/null

Kód: Vybrat vše

depth=1 CN = OdorikCA, ST = Czech Republic, C = CZ, emailAddress = kontakt@minitel.cz, O = miniTEL s.r.o.
verify error:num=19:self signed certificate in certificate chain
140200320238720:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:../ssl/statem/statem_clnt.c:1915:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 1953 bytes and written 312 bytes
Verification error: self signed certificate in certificate chain
Riešenie tohto problému je našťastie možné a to pridať certifikačnú autoritu Odorik do systému. CA certifikát je uvedený na stránke http://www.odorik.cz/w/srtp v časti Silnejsi certifikat na portu 6670. Platny do 17.10.2056. Na Debiane ho treba skopírovať do súboru /usr/local/share/ca-certificates/sip.odorik.cz.crt a následne spustiť príkaz:

Kód: Vybrat vše

$ sudo update-ca-certificates
Ten by mal vypísať niečo ako:

Kód: Vybrat vše

Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...

Adding debian:sip.odorik.cz.pem
done.
done.
Potom už openssl sa so sip.odorik.cz:6670 spojí:

Kód: Vybrat vše

$ openssl s_client -verify_return_error -verify_hostname sip.odorik.cz -connect sip.odorik.cz:6670 < /dev/null
CONNECTED(00000003)
depth=1 CN = OdorikCA, ST = Czech Republic, C = CZ, emailAddress = kontakt@minitel.cz, O = miniTEL s.r.o.
verify return:1
depth=0 C = CZ, ST = Czech Republic, O = miniTEL s.r.o., OU = odorik.cz, CN = sip.odorik.cz, emailAddress = kontakt@odorik.cz
verify return:1
...
Žiadna chyba a návratový kód je 0 (success).

Tretí problém: Linphone numožnuje zmeniť port ak server používa SRV záznamy

Linphone z nejakých neznámych dôvodov ignoruje užívateľské nastavenie, že sa má používať iný port ako 5061. Vyzerá to tak, že v DNS si nájde SRV záznam s portom 5061 a táto informácia prebije aj užívateľské nastavenie. Do Linphone som zadával pre Odorik SIP účet v kolonke SIP proxy address hodnotu <sip:sip.odorik.cz:6670;transport=tls>.

V logu linphone je:

Kód: Vybrat vše

message: 2019-12-29 11:26:30:595 SRV _sips._tcp.sip.odorik.cz resolved to [target:sip.odorik.cz. port:5061 prio:0 weight:10]
message: 2019-12-29 11:26:30:595 Starting A/AAAA query for srv result [sip.odorik.cz.]
message: 2019-12-29 11:26:30:595 Resolver is using DNS server(s):
message: 2019-12-29 11:26:30:595 	127.0.0.1
message: 2019-12-29 11:26:30:595 resolver_process_data dns_res_check() in progress
message: 2019-12-29 11:26:30:595 DNS resolution awaiting response, queued to main loop
message: 2019-12-29 11:26:30:595 Resolver is using DNS server(s):
message: 2019-12-29 11:26:30:595 	127.0.0.1
message: 2019-12-29 11:26:30:595 resolver_process_data dns_res_check() in progress
message: 2019-12-29 11:26:30:595 DNS resolution awaiting response, queued to main loop
message: 2019-12-29 11:26:30:626 sip.odorik.cz. resolved to 81.31.45.51
message: 2019-12-29 11:26:30:626 A query finished for srv result [sip.odorik.cz.]
message: 2019-12-29 11:26:30:626 All A/AAAA results for combined resolution have arrived.
message: 2019-12-29 11:26:30:626 channel 0x55875a551250: state RES_DONE
message: 2019-12-29 11:26:30:626 transaction [0x55875a5cdbc0] channel state changed to [RES_DONE]
message: 2019-12-29 11:26:30:626 channel 0x55875a551250: state CONNECTING
message: 2019-12-29 11:26:30:626 transaction [0x55875a5cdbc0] channel state changed to [CONNECTING]
message: 2019-12-29 11:26:30:626 Trying to connect to [TLS://::ffff:81.31.45.51:5061]
A následne chyba ako u prvého problému (na porte 5061 je nepoužiteľný certifikát so slabým kľúčom).

Štvrtý problém: Linphone overuje hostname aj pri TLS spojení s IP adresou

Keď nie je možné zadať serverový port kvôli tomu, že port z DNS záznamu prebije užívateľom zadaný, tak som skúsil zadať priamo IPv4 adresu SIP Odorik servera. Tzn.: <sip:81.31.45.51:6670;transport=tls>. To už prešlo ale skončilo to na inú ešte podivnejšiu chybu:

Kód: Vybrat vše

message: 2019-12-29 11:47:21:903 Found certificate depth=[0], flags=[CN-mismatch ]:
cert. version     : 3
serial number     : 01
issuer name       : CN=OdorikCA, ST=Czech Republic, C=CZ, emailAddress=kontakt@minitel.cz, O=miniTEL s.r.o.
subject name      : C=CZ, ST=Czech Republic, O=miniTEL s.r.o., OU=odorik.cz, CN=sip.odorik.cz, emailAddress=kontakt@odorik.cz
issued  on        : 2017-05-15 08:43:58
expires on        : 2056-10-17 08:43:58
signed using      : RSA with SHA-256
RSA key size      : 2048 bits
basic constraints : CA=true

error: 2019-12-29 11:47:21:903 Channel [0x55f49a1ee800]: SSL handshake failed : X509 - Certificate verification failed, e.g. CRL, CA or signature check failed
error: 2019-12-29 11:47:21:903 Cannot connect to [TLS://81.31.45.51:6670]
CN-mismatch znamená, že nesedí hostname v TLS certifikáte poslaný serverom a hostname zadaný užívateľom. Vyzerá to tak, že Linhpone berie ako hostname to čo je zadané v adresnom poli, tzn. 81.31.45.51 (ip adresu) a sťažuje sa, že reťazec "81.31.45.51" nie je zhodný s hosname (CN) uvedený v serverovom certifikáte, tzn. s "sip.odorik.cz". Takto sa nespojí.

Riešenie

Zhrnutie: Užívateľom zadaný serverový port sa ignoruje, lebo v DNS je už port pre sip.odorik.cz uvedený. Na štandardný port sa pripojiť nedá, je tam nepoužiteľný certifikát. Na IP adresu sa pripojiť nedá, lebo certifikát nemá v CN uvedenú IP adresu ale hostname.

Bez zásahu na strane Odorik (či už DNS záznamov alebo výmenou certifikátov) vidím jediné riešenie: Donútiť systém aby pri pokuse o pripojenie na 81.31.45.51:5061 sa v skutočnosti pripojil na 81.31.45.51:6670. A v Linhpone vôbec port nenastavovať (nech sa použije 5061 z DNS) a použit hostname sip.odorik.cz aby sa správne overil CN certifikátu.

Nastaviť aby systém posielal TCP pakety na port 6670 namiesto 5061 pre IPv4 adresu 81.31.45.51 ide pomocou iptables, konkrétne s DNAT pravidlom:

Kód: Vybrat vše

$ sudo iptables -t nat -A OUTPUT -d 81.31.45.51 -p tcp --dport 5061 -j DNAT --to-destination 81.31.45.51:6670
Po tomto nastavení sa Linphone konečne so serverom sip.odorik.cz cez TLS spojil. Pozor na to, že iptables nie je perzistentné a treba ho spustiť pri každom štarte systému.

Kód: Vybrat vše

message: 2019-12-29 12:02:33:648 SRV _sips._tcp.sip.odorik.cz resolved to [target:sip.odorik.cz. port:5061 prio:0 weight:10]
message: 2019-12-29 12:02:33:648 Starting A/AAAA query for srv result [sip.odorik.cz.]
message: 2019-12-29 12:02:33:649 Resolver is using DNS server(s):
message: 2019-12-29 12:02:33:649 	127.0.0.1
message: 2019-12-29 12:02:33:649 resolver_process_data dns_res_check() in progress
message: 2019-12-29 12:02:33:649 DNS resolution awaiting response, queued to main loop
message: 2019-12-29 12:02:33:649 Resolver is using DNS server(s):
message: 2019-12-29 12:02:33:649 	127.0.0.1
message: 2019-12-29 12:02:33:649 resolver_process_data dns_res_check() in progress
message: 2019-12-29 12:02:33:649 DNS resolution awaiting response, queued to main loop
message: 2019-12-29 12:02:33:679 sip.odorik.cz. resolved to 81.31.45.51
message: 2019-12-29 12:02:33:679 A query finished for srv result [sip.odorik.cz.]
message: 2019-12-29 12:02:33:679 All A/AAAA results for combined resolution have arrived.
message: 2019-12-29 12:02:33:680 channel 0x55f49a279ff0: state RES_DONE
message: 2019-12-29 12:02:33:680 transaction [0x55f49a127d90] channel state changed to [RES_DONE]
message: 2019-12-29 12:02:33:680 channel 0x55f49a279ff0: state CONNECTING
message: 2019-12-29 12:02:33:680 transaction [0x55f49a127d90] channel state changed to [CONNECTING]
message: 2019-12-29 12:02:33:680 Trying to connect to [TLS://::ffff:81.31.45.51:5061]
message: 2019-12-29 12:02:33:710 Channel [0x55f49a279ff0]: Connected at TCP level, now doing TLS handshake with cname=sip.odorik.cz
message: 2019-12-29 12:02:33:710 Channel [0x55f49a279ff0]: SSL handshake in progress...
message: 2019-12-29 12:02:33:740 Found certificate depth=[1], flags=[]:
cert. version     : 3
serial number     : 85:6C:3F:28:AB:61:64:A1
issuer name       : CN=OdorikCA, ST=Czech Republic, C=CZ, emailAddress=kontakt@minitel.cz, O=miniTEL s.r.o.
subject name      : CN=OdorikCA, ST=Czech Republic, C=CZ, emailAddress=kontakt@minitel.cz, O=miniTEL s.r.o.
issued  on        : 2017-05-15 08:43:16
expires on        : 2056-10-17 08:43:16
signed using      : RSA with SHA-256
RSA key size      : 2048 bits
basic constraints : CA=true
subject alt name  : 

message: 2019-12-29 12:02:33:740 Found certificate depth=[0], flags=[]:
cert. version     : 3
serial number     : 01
issuer name       : CN=OdorikCA, ST=Czech Republic, C=CZ, emailAddress=kontakt@minitel.cz, O=miniTEL s.r.o.
subject name      : C=CZ, ST=Czech Republic, O=miniTEL s.r.o., OU=odorik.cz, CN=sip.odorik.cz, emailAddress=kontakt@odorik.cz
issued  on        : 2017-05-15 08:43:58
expires on        : 2056-10-17 08:43:58
signed using      : RSA with SHA-256
RSA key size      : 2048 bits
basic constraints : CA=true

message: 2019-12-29 12:02:33:742 Channel [0x55f49a279ff0]: SSL handshake in progress...
message: 2019-12-29 12:02:33:770 Channel [0x55f49a279ff0]: SSL handshake finished, SSL version is [TLSv1.2], selected ciphersuite is [TLS-RSA-WITH-AES-256-GCM-SHA384]
Linphone si myslí, že komunikuje so serverom na porte 5061 ale v skutočnosti kernel komunikuje so serverom na porte 6670.

A teraz otázka na Odorik:

Plánujete robiť niečo s tým, že TLS certifikát na štandardnom porte 5061 je nepoužiteľný na nových systémoch? Neviem či je reálne niečo s tým spraviť bez toho aby sa niečo nepokazilo, viem si predstaviť že kopa starých SIP klientov napr. nepodporuje nové TLS certifikáty. Zas konfigurácia na nových systémoch je naozaj pre netechnického užívateľa takmer nemožná. Už len pochopiť tie chybové hlášky z openssl je umenie.

Minimálne v dnešnej dobe fungujú Let's Encrypt certifikáty, čo by mohlo odstrániť krok ručného importovania Odorik CA do systému.
Uživatelský avatar
xsouku04
Administrátor
Příspěvky: 8146
Registrován: pát 15. říj 2010 11:11:44
Bydliště: Brno
Kontaktovat uživatele:

Re: Návod: TLS v Linphone na Debian 10

Příspěvek od xsouku04 »

No problém je v tom, že když vyměníme certifikát na portu 5061, mohlo by to přestat fungovat některým z těch, kterým to na portu 5061 nyní funguje. Nebude jich nejspíše žádné obrovské množství a řešením by mohlo být prostě tyto případy zjistit a obeslat dané uživatele emailem.

Většina SIP klientů a sip telefonů ještě nedávno žádné opravdové autority neznala a překvapivě akceptovala přihlášení bez jakéhokoli ověření. Případně bylo třeba autoritu stejně nahrát ručně. Tedy stejně hrozí, že si někteří budou muset nahrát autoritu let's encrypt ručně.

Co se týče SRV záznamů, většina SIP telefonů umožňuje používání SRV záznamů vypnout.

Připravujeme nyní nějaké outbound proxy, aby bylo sip.odorik.cz lépe škálovatelné a stěhovatelné. Při té příležitosti bychom opravili i ten certifikát.
alfi
Příspěvky: 718
Registrován: čtv 03. led 2013 15:31:10

Re: Návod: TLS v Linphone na Debian 10

Příspěvek od alfi »

xsouku04 píše:No problém je v tom, že když vyměníme certifikát na portu 5061,
Zrovna certifikátů může mít každý server kolik chce, od různých autorit apod. :-)

Problém je spíš ve velikosti klíče a podepisovacím aloritmu. SHA1 není podporované už od roku 2016 (např. https://blog.qualys.com/ssllabs/2014/09 ... ed-to-know), stejně tak klíč < 2048 bitů už je považován za dešifrovatelný (https://cs.wikipedia.org/wiki/D%C3%A9lk ... %AD%C4%8De, "RSA tvrdí, že 1024bitové klíče se pravděpodobně stanou prolomitelné zhruba mezi lety 2006 a 2010 a 2048bitové klíče budou dostatečné až do roku 2030. RSA klíč o délce 3072 bitů by měl být použit pro zajištění bezpečnosti až po roce 2030.")

Kód: Vybrat vše

issued  on        : 2016-04-26 14:24:51
signed using      : RSA with SHA1
RSA key size      : 512 bits

issued  on        : 2017-05-15 08:43:58
signed using      : RSA with SHA-256
RSA key size      : 2048 bits
Jestli jde současně použít víc privátních klíčů netuším, spíše ne. Podobná změna v distribuovaném prostředí je dost nepříjemná (viz taky stejné změny třeba u EET serverů https://www.etrzby.cz/cs/oznameni-pro-vyvojare).

sip.odorik.cz:5061, https://www.immuniweb.com/ssl/?id=wl3N7BcS :
The server's private RSA key is weak.
The server's RSA certificate was signed using a weak algorithm.
The server supports encryption protocols that are insecure and have known security flaws or weaknesses.
The server has TLS 1.0 enabled. Since the 30th of June 2018 it is non-compliant with PCI DSS.
The server is vulnerable to POODLE over SSL.
Jinak ani port 6670 není žádná sláva = něco, kde se na šifrování dá spolehnout.
sip.odorik.cz:6670, https://www.immuniweb.com/ssl/?id=Kelbb5mO :
The server supports encryption protocols that are insecure and have known security flaws or weaknesses.
The server has TLS 1.0 enabled. Since the 30th of June 2018 it is non-compliant with PCI DSS.
The server is vulnerable to POODLE over SSL.
Na druhou stranu, pokud většina uživatelů stejně pořád používá nešifrovaný SIP na 5060, kde se heslo louská hodně snadno, pak dávno nepodporované ssl/tls asi nikoho moc netrápí. Nehledě na to, že spoustu HW telefonů ani nepůjde upgradovat, aby zvládaly TLS>v1 nebo SHA256 certifikáty :-(
Odpovědět