Skip to content
BACK TO FIELD NOTES// FIELD NOTES

tutorial

Build a Secure VoIP Lab: Asterisk with SRTP and TLS

Sep 2, 20264 min read

Voice over IP is easy to stand up and easy to eavesdrop on when it is left unencrypted. This tutorial builds a small lab where you place a call twice: once over plain RTP, and once over SRTP media with TLS-protected signaling. Then you capture both in Wireshark and hear the difference for yourself.

Topology: MicroSIP (6001) and Zoiper (6002) register to an Asterisk PBX; SIP signaling runs over TLS 5061 and media over SRTP-SDES, while a Wireshark capture outside the trust boundary only sees noise.

What you will build

  • An Asterisk PBX with two extensions, 6001 and 6002.
  • A baseline call over SIP/UDP with plain RTP.
  • A secure call over SIP/TLS with SRTP-SDES media.
  • A side-by-side Wireshark comparison of the two captures.

Prerequisites

  • Ubuntu Server 22.04 running Asterisk 22 with PJSIP (a VirtualBox VM in bridged mode works well, so it shares the LAN).
  • Two softphones on the same network: MicroSIP (Windows) as 6001 and Zoiper (Android) as 6002.
  • Wireshark and OpenSSL on your host.

All devices must reach the server. Confirm with ping <asterisk-ip>.

Step 1: Baseline RTP transport

Define a plain UDP transport in pjsip.conf:

[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060

Add extension 6001 (repeat the same pattern for 6002):

[6001]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
transport=transport-udp
auth=auth6001
aors=6001

[auth6001]
type=auth
auth_type=userpass
username=6001
password=CHANGE_ME_6001

[6001]
type=aor
max_contacts=1

Create the dialplan in extensions.conf:

[from-internal]
exten => 6001,1,Dial(PJSIP/6001,30)
 same => n,Hangup()
exten => 6002,1,Dial(PJSIP/6002,30)
 same => n,Hangup()

Restart and confirm both endpoints register:

sudo systemctl restart asterisk
sudo asterisk -rvvv
pjsip show endpoints

Point MicroSIP and Zoiper at the server over UDP with encryption disabled, then place a call 6001 -> 6002.

Step 2: Capture the plain RTP call

Start a Wireshark capture on the call interface, place the call, then stop. Filter with rtp, then open:

Telephony -> RTP -> RTP Streams -> Play Streams

The conversation plays back clearly. Plain RTP gives the media no confidentiality: anyone who obtains the capture can reconstruct the audio. Save it as rtp_unencrypted.pcapng.

Step 3: Generate a TLS certificate

For a lab, a self-signed certificate is enough:

sudo mkdir -p /etc/asterisk/keys
sudo openssl req -x509 -newkey rsa:4096 -nodes \
  -keyout /etc/asterisk/keys/asterisk.key \
  -out /etc/asterisk/keys/asterisk.crt \
  -days 365 -subj "/CN=asterisk.local"

Step 4: Enable TLS and SRTP

Add a TLS transport:

[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=tlsv1_2

Switch each endpoint to TLS and require encrypted media:

[6001]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
transport=transport-tls
media_encryption=sdes
direct_media=no
auth=auth6001
aors=6001

Restart Asterisk:

sudo systemctl restart asterisk

Step 5: Configure the softphones

  • MicroSIP: server IP:5061, transport TLS, media encryption Mandatory SRTP.
  • Zoiper: host IP:5061, transport TLS, Enable SRTP.

Both accounts should return to Registered.

Step 6: Verify the secure setup

sudo asterisk -rvvv
pjsip show endpoint 6001
pjsip show transports

You want to see:

Transport        : transport-tls
Media Encryption : sdes

transport-tls    tls    0.0.0.0:5061
transport-udp    udp    0.0.0.0:5060

Step 7: Capture the secure call

Capture again while placing 6001 -> 6002. Confirm the signaling is protected with the filter tls or tcp.port == 5061.

The media will not show up under the rtp filter directly. Find it via:

Statistics -> Conversations -> UDP

Select the media conversation, use Decode As -> RTP, then try RTP Streams -> Play Streams. This time the audio is only noise. Note that "Decode As RTP" just forces Wireshark to parse the packets as RTP; it does not decrypt SRTP. Save it as srtp_encrypted.pcapng.

Results

AspectRTP (baseline)SRTP + TLS
SIP signalingUDP 5060TLS 5061
MediaRTPSRTP-SDES
Audio playback from captureClearNoise
Eavesdropping riskHighMuch lower

The call works in both cases, so encryption does not break VoIP. The difference is entirely in what someone with a packet capture can recover.

Security notes

  • Self-signed certificates are fine for a lab. For anything real, use a certificate from a trusted CA.
  • Never capture or intercept traffic you do not own or have permission to test.
  • Replace every CHANGE_ME_* placeholder with a strong local password, and keep real credentials out of any repository.

The full configs, captures, and report for this lab live in the project repo: SRTP-VoIP-Security-Implementation.