【opensips】使用tls协议对接asterisk的sip trunk

对接组网图

对接组网图

SIP呼叫从asterisk到opensips,对于opensips来说,是“呼入”场景。

证书

申请

证书的申请不是本文讨论的范围
申请完证书一般会有证书文件xxx.cert或者xxx.pem,以及私钥文件private.pem

部署

一般服务器持有证书,所以需要证书放在opensips上。

具体的位置在opensips.cfg中指定
如下:

loadmodule "proto_tls.so"
loadmodule "tls_mgm.so"
modparam("tls_mgm", "certificate", "/etc/opensips/certs/cert.pem")
modparam("tls_mgm", "private_key", "/etc/opensips/certs/priv.pem")
modparam("tls_mgm", "tls_method", "tlsv1_2")
modparam("tls_mgm", "verify_cert", "0")
modparam("tls_mgm", "require_cert", "0")

注意,如果这两个文件的位置存在错误,opensips启动时会报错。

启动好opensips后,我们来首先做一下tls的握手测试。

测试tls服务

如果你本机安装过openssl,可以使用openssl来测试服务器的tls是否可用。

命令如下:
connect后填写服务器域名和端口地址
servername为服务器域名,这个必须与证书一致。
CAfile是本地根证书文件,用于校验服务器证书的,如果不指定的话,会看到
unable to get local issuer certificate错误提示

openssl s_client -crlf -connect example.mydomain.com:5061 -servername example.mydomain.com -CAfile cacert.pem

如果tls握手正常,正确的返回样例如下,


verification

Asterrisk的tls配置

本文使用的asterisk版本 16.15.1,配置使用sip_chan

配置sip.conf

tlsenable=yes
;tlsbindaddr=0.0.0.0 ;作为客户端时,不需要绑定端口监听
;tlscertfile=/etc/asterisk/cert.pem ;作为客户端时,不需要指定证书
tlsprivatekey=/etc/asterisk/private.pem ;私钥时必须的!
tlsdontverifyserver=no  ; 作为客户端时,可以选择yes不做验证
;tlsclientmethod=tlsv1  ; 作为客户端时,不用指定方法;不指定时,客户端是会和服务端会协商的,除非强制要求某一个版本的tls
 

[op-callin]
type=peer
context=from-sip
host=example.mydomain.com
port=5060
;encryption=yes

[op-callin-tls]
type=peer
context=from-sip
host=example.mydomain.com
port=5061
transport=tls
;encryption=yes

可能的错误

Asterisk发起呼叫时报错

did not verify: unable to get local issuer certificate

这是因为asterisk作为客户端与opensips通信时,获取到服务器证书后,无法找到本地签发证书做验证。
一般有两种方式:

  1. 去掉验证动作
    tlsdontverifyserver=yes
  2. 增加本地查询CA证书
    asterisk安装完成后默认时没有这个证书的,不过可以生成一个
./ast_tls_cert -C pbx.mycompany.com -O "My Company" -d /etc/asterisk/keys
  • The "-C" option
    定义证书的域名
  • The "-O" option
    定义公司名称
  • The "-d" option
    定义生成证书的路径

生成后把这两个配置更新一下,

tlscertfile=/etc/asterisk/keys/asterisk.pem
tlscafile=/etc/asterisk/keys/ca.crt

sip reload就好了

验证呼叫

配置路由

exten=>2,1,Log(NOTICE, Inbound calling  ${CALLERID(all)})
exten=>2,2,Dial(SIP/op-callin-tls/123456,20)

配置一条路由,使它能够路由到opensips去

查看日志

asterisk日志里没有错误告警
opensips日志里有connection成功,样例如下

INFO:core:probe_max_sock_buff: using snd buffer of 416 kb
INFO:core:init_sock_keepalive: TCP keepalive enabled on socket 69
INFO:proto_tls:tls_accept: New TLS connection from 1.2.3.4:5061 accepted
INFO:proto_tls:tls_accept: Client did not present a TLS certificate
INFO:proto_tls:tls_dump_cert_info: tls_accept: local TLS server certificate subject: /CN=xxxx, issuer: /C=US/O=Let's Encrypt/CN=R3
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 目录 SIP SIP协议简介 基本概念介绍 SIP的功能和特点 SIP消息 SIP工作原理简介 SIP支持的传输协...
    阿七笔记阅读 2,983评论 0 2
  • 夜莺2517阅读 127,762评论 1 9
  • 版本:ios 1.2.1 亮点: 1.app角标可以实时更新天气温度或选择空气质量,建议处女座就不要选了,不然老想...
    我就是沉沉阅读 6,975评论 1 6
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,610评论 28 53
  • 兔子虽然是枚小硕 但学校的硕士四人寝不够 就被分到了博士楼里 两人一间 在学校的最西边 靠山 兔子的室友身体不好 ...
    待业的兔子阅读 2,663评论 2 9