Создание TLS соединения на Asterisk
SIP
/etc/asterisk/sip.conf:
[general]
transport=tls
encryption=yes
tlsenable=yes
externip=1.1.1.1
tlsbindaddr=0.0.0.0:5061
tlscertfile=/path/certificate.pem
tlscafile=/path/cabundle.pem
tlsprivatekey=/path/private.pem
tlscipher=ALL
tlsclientmethod=tlsv1
tlsdontverifyserver=yes
nat=yes
/etc/asterisk/users.conf:
[tmp-tls](!)
cid_number=
vmsecret=no
nat=yes
dtmfmode=rfc2833
callgroup=
pickupgroup=1
callwaiting=no
hasmanager=yes
hasvoicemail=no
hasagent=no
mailbox=no
hassip=yes
registersip=no
transfer=yes
host=dynamic
threewaycalling=yes
insecure=port
call-limit=100
compensate=yes
srtpcapable=no
qualify=yes
remoteregister=yes
transport=tls
encryption=yes
[200](tmp-tls)
username=200
secret=123456
context=from-internal
Открыть порт:
# firewall-cmd --zone=public --add-port=5061/tcp --permanent
# firewall-cmd --zone=public --add-port=10000-20000/tcp --permanent
# firewall-cmd --zone=public --add-port=10000-20000/udp --permanent
# firewall-cmd --reload
Перезапустить Asterisk:
# systemctl restart asterisk
Проверить сертификат на порту:
# openssl s_client -connect 127.0.0.1:5061
Файлы с конфигурацией
extensions.conf
[general]
static = yes
writeprotect = no
autofallthrough = yes
clearglobalvars = yes
priorityjumping = no
extenpatternmatchnew = no
[from-internal]
exten => _2XX,1,NoOp(from-internal)
same => n,Dial(SIP/${EXTEN}, 60)
same => n,Hangup()
exten => _[78]9XXXXXXXXX,1,NoOp(from-internal)
same => n,Dial(SIP/trunk-9123456789/${EXTEN}, 90,tT)
same => n,Hangup()
[from-external-9123456789]
exten => _.,1,NoOp(from-external-9123456789)
same => n,Dial(SIP/200, 60)
same => n,Hangup()
sip.conf
[general]
useragent=TestAts
transport=tls
encryption=yes
tlsenable=yes
externip=1.2.3.4
tlsbindaddr=0.0.0.0:5061
tlscertfile=/path/certificate.pem
tlscafile=/path/cabundle.pem
tlsprivatekey=/path/private.pem
tlscipher=ALL
tlsclientmethod=tlsv1
tlsdontverifyserver=yes
localnet=192.168.0.0/24
language=ru
allowguest=no
match_auth_username=yes
maxexpiry=3600
dtmfmode=rfc2833
minexpiry=60
defaultexpiry=120
registerattempts=0
registertimeout=20
videosupport=no
disallow=all
allow=ulaw,alaw,gsm,h261,h263,h263p,h264
notifyringing=yes
notifyhold=yes
tos=0x68
permit = 0.0.0.0/0.0.0.0
allowoverlap=yes
allowsubscribe=yes
allowtransfers=yes
alwaysauthreject=yes
subscribecontext=default
autodomain=no
callevents=yes
compactheaders=no
dumphistory=yes
g726nonstandard=no
ignoreregexpire=no
pedantic=no
promiscredir=no
recordhistory=no
relaxdtmf=no
rtcachefriends=no
rtptimeout=1800
rtsavesysname=no
rtupdate=no
sendrpid=no
sipdebug=no
srvlookup=no
trustrpid=no
usereqphone=no
progressinband=no
maxcallbitrate=384
tos_sip=cs3
tos_audio=ef
tos_video=af41
cos_sip=3
cos_audio=5
cos_video=4
constantssrc=yes
nat=yes
session-timers=accept
session-expires=1800
session-minse=90
session-refresher=uas
register => 9123456789:password@ip.beeline.ru/trunk-9123456789
users.conf
ЧТО БЫЛО ПОСЛЕ УСТАНОВКИ
...
[tmp-tls](!)
cid_number=
vmsecret=no
nat=yes
dtmfmode=rfc2833
callgroup=
pickupgroup=1
callwaiting=no
hasmanager=yes
hasvoicemail=no
hasagent=no
mailbox=no
hassip=yes
registersip=no
transfer=yes
host=dynamic
threewaycalling=yes
insecure=port
call-limit=100
compensate=yes
srtpcapable=no
qualify=yes
remoteregister=yes
transport=tls
encryption=yes
[200](tmp-tls)
username=200
secret=123456
context=from-internal
[201](tmp-tls)
username=201
secret=123456
context=from-internal
[202](tmp-tls)
username=202
secret=123456
context=from-internal
[203](tmp-tls)
username=203
secret=123456
context=from-internal
[204](tmp-tls)
username=204
secret=123456
context=from-internal
[205](tmp-tls)
username=205
secret=123456
context=from-internal
[trunk-external](!)
type = peer
displayhost = ip.beeline.ru
port = 5060
fromdomain = ip.beeline.ru
enableserver = no
host = ip.beeline.ru
disallow = all
allow = alaw,ulaw,gsm
hasiax = no
registeriax = no
hassip = yes
registersip = no
hasexten = no
call-limit = 256
trunkstyle = voip
srtpcapable = no
remoteregister = yes
insecure = port,invite
transport = udp
dtmfmode = rfc2833
qualify = yes
nat = force_rport,comedia
[trunk-9123456789](trunk-external)
username=9123456789
secret=password
context=from-external-9123456789
fullname = 9123456789
trunkname = 9123456789
authuser = 9123456789@ip.beeline.ru
ysauth = 9123456789
contact = 9123456789
callerid=trunk-9123456789
PJSIP
Скрипт создание сертификатов находится в пакете установки к примеру:
# cd asterisk-16.16.0/contrib/scripts
Создание директории для сертификатов:
# mkdir /etc/asterisk/keys
Создание само-подписанных сертификатов и ключей шифрования:
# ./ast_tls_cert -C pbx.company.ru -O "My Company" -d /etc/asterisk/keys
C — имя хоста (dns имя) или ip адрес
O — имя нашей организации
d — директория генерация сертификатов
Генерация клиентского сертификата:
# ./ast_tls_cert -m client -c /etc/asterisk/keys/ca.crt -k /etc/asterisk/keys/ca.key -C phone1.company.ru -O "My Company" -d /etc/asterisk/keys -o 100
m client — опция которая указывает на создание клиентского сертификата, не серверного
с — путь к сертификату CA
k — путь к ключу CA
С — DNS-имя или ipадрес подключаемого клиента
O — имя организации
d — путь для генерации ключей
o — имя генерируемых ключей (должно совпадать с номером пира)
/etc/asterisk/pjsip.conf добавить:
[transport-tls]
type=transport
protocol=tls
bind=0.0.0.0:5061
cert_file=/etc/asterisk/keys/asterisk.crt
priv_key_file=/etc/asterisk/keys/asterisk.key
method=sslv23
/etc/asterisk/sip.conf:
[general]
tlsenable=yes
tlsbindaddr=0.0.0.0:5061
tlscertfile=/etc/asterisk/keys/asterisk.pem
tlscafile=/etc/asterisk/keys/ca.crt
tlscipher=ALL
tlsclientmethod=tlsv1
tlsdontverifyserver=yes
Перезапустить Asterisk:
# systemctl restart asterisk
Проверить сертификат на порту:
# openssl s_client -connect 127.0.0.1:5061