TL;DR: Nastavenie
- Uložiť Odorik CA certifikát platný pre port 6670 do súboru /usr/local/share/ca-certificates/sip.odorik.cz.crt
- Spustiť: sudo update-ca-certificates
- 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
- Nastaviť v Linphone pre Odorik SIP účet kolonku Transport na TLS
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
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
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
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
Kód: Vybrat vše
$ sudo update-ca-certificates
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.
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
...
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]
Š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]
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
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]
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.