POP3/IMAP Start TLS
Problem this snippet solves:
Summary: This iRule allows either clear text or TLS encrypted communication with the LTM initiating the encryption process if it sees the appropriate "starttls" command in the SMTP communication.
Code :
#imap# when CLIENT_ACCEPTED { SSL::disable } when SERVER_CONNECTED { TCP::collect } when CLIENT_DATA { set lcpayload [string tolower [TCP::payload]] if { $lcpayload contains "starttls" } { set tag [getfield [TCP::payload] " " 1] TCP::respond "$tag OK \"Begin TLS negotiation now\"\r\n" TCP::payload replace 0 [TCP::payload length] "" TCP::release SSL::enable } else { set id [getfield [TCP::payload] " " 1] TCP::respond "$id BAD \"Must issue a STARTTLS command first\"\r\n" TCP::payload replace 0 [TCP::payload length] "" TCP::release TCP::collect } } when SERVER_DATA { if { [TCP::payload] contains "* CAPABILITY" } { TCP::payload replace 12 0 " STARTTLS" TCP::release clientside { TCP::collect } } else { TCP::release TCP::collect } } #pop3# when CLIENT_ACCEPTED { SSL::disable } when SERVER_CONNECTED { TCP::collect } when CLIENT_DATA { if { [TCP::payload] contains "STLS" } { TCP::respond "+OK Begin TLS negotiation\r\n" TCP::payload replace 0 [TCP::payload length] "" TCP::release SSL::enable } else { set id [getfield [TCP::payload] " " 1] TCP::respond "-ERR Must issue STLS command first\r\n" TCP::payload replace 0 [TCP::payload length] "" TCP::release TCP::collect } } when SERVER_DATA { set lcpayload [string tolower [TCP::payload]] if { $lcpayload contains "capability" } { # assume last 3 bytes are .\r\n which is end of capability response TCP::payload replace [expr [TCP::payload length] - 3] 0 "STLS\r\n" TCP::release clientside { TCP::collect } } else { TCP::release TCP::collect } }
Published Mar 18, 2015
Version 1.0Nat_Thirasuttakorn
Employee
Joined September 25, 2004
Nat_Thirasuttakorn
Employee
Joined September 25, 2004