美文网首页
【opensips】使用tls协议对接asterisk的sip

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

作者: 安安爸Chris | 来源:发表于2021-04-02 12:58 被阅读0次

    对接组网图

    对接组网图

    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
    

    相关文章

      网友评论

          本文标题:【opensips】使用tls协议对接asterisk的sip

          本文链接:https://www.haomeiwen.com/subject/ylbfkltx.html