IO::Soc...tercept(3)
π IO::Socket::SSL::Intercept β SSL interception (man in the middle) π
okay bestie, welcome to the section 3 manual page for IO::Socket::SSL::Intercept β yes, the Perl module one, not some random binary, we're doing modules today π
. This is the "man in the middle" page and it is so much cooler than it sounds, I promise. Buckle up, hydrate, and let's get into it. β¨
πΈ NAME πΈ
IO::Socket::SSL::Intercept β SSL interception (man in the middle)
That's it, that's the whole name. Short, iconic, does exactly what it says on the tin. π
π¦ SYNOPSIS π¦
use IO::Socket::SSL::Intercept;
# create interceptor with proxy certificates
my $mitm = IO::Socket::SSL::Intercept->new(
proxy_cert_file => 'proxy_cert.pem',
proxy_key_file => 'proxy_key.pem',
...
);
my $listen = IO::Socket::INET->new( LocalAddr => .., Listen => .. );
while (1) {
# TCP accept new client
my $client = $listen->accept or next;
# SSL connect to server
my $server = IO::Socket::SSL->new(
PeerAddr => ..,
SSL_verify_mode => ...,
...
) or die "ssl connect failed: $!,$SSL_ERROR";
# clone server certificate
my ($cert,$key) = $mitm->clone_cert( $server->peer_certificate );
# and upgrade client side to SSL with cloned certificate
IO::Socket::SSL->start_SSL($client,
SSL_server => 1,
SSL_cert => $cert,
SSL_key => $key
) or die "upgrade failed: $SSL_ERROR";
# now transfer data between $client and $server and analyze
# the unencrypted data
...
}
like, that's the whole vibe right there. accept the client, connect to the server, steal the server's certificate, make your own little clone of it, upgrade the client's socket to SSL with the clone, and now you're sitting in the middle reading everything in plaintext. main character energy fr fr π«Ά
π DESCRIPTION π
This module provides functionality to clone certificates and sign them with a proxy certificate, thus making it easy to intercept SSL connections (man in the middle). It also manages a cache of the generated certificates.
ngl that's the whole pitch. Clone the cert, sign it with your proxy cert, boom, you're in the middle. And it keeps a little cache of everything it made so it doesn't have to redo the work like a fool. π
π How Intercepting SSL Works π
Intercepting SSL connections is useful for analyzing encrypted traffic for security reasons or for testing. It does not break the end-to-end security of SSL, e.g. a properly written client will notice the interception unless you explicitly configure the client to trust your interceptor. Intercepting SSL works the following way:
lowkey important, bestie: this does not break SSL's end-to-end security. A properly written client will notice you. The only way this works is if you go out of your way and explicitly tell the client to trust your interceptor. No sneaky sneaky. π¨
- Create a new CA certificate, which will be used to sign the cloned certificates. This proxy CA certificate should be trusted by the client, or (a properly written client) will throw error messages or deny the connections because it detected a man in the middle attack. Due to the way the interception works there no support for client side certificates is possible.
Using openssl such a proxy CA certificate and private key can be created with:
openssl genrsa -out proxy_key.pem 1024
openssl req -new -x509 -extensions v3_ca -key proxy_key.pem -out proxy_cert.pem
# export as PKCS12 for import into browser
openssl pkcs12 -export -in proxy_cert.pem -inkey proxy_key.pem -out proxy_cert.p12
also just so you know: because of how the interception works, there is no support for client side certificates. Like, at all. Don't come for me. π
- Configure client to connect to use intercepting proxy or somehow redirect connections from client to the proxy (e.g. packet filter redirects, ARP or DNS spoofing etc).
- Accept the TCP connection from the client, e.g. don't do any SSL handshakes with the client yet.
- Establish the SSL connection to the server and verify the servers certificate as usually. Then create a new certificate based on the original servers certificate, but signed by your proxy CA. This is the step where
IO::Socket::SSL::Intercepthelps. β - Upgrade the TCP connection to the client to SSL using the cloned certificate from the server. If the client trusts your proxy CA it will accept the upgrade to SSL.
- Transfer data between client and server. While the connections to client and server are both encrypted with SSL you will read/write the unencrypted data in your proxy application. π₯
π METHODS π
IO::Socket::SSL::Intercept helps creating the cloned certificate with the following methods:
$mitm = IO::Socket::SSL::Intercept->new(%args)β This creates a new interceptor object.%argsshould be:proxy_cert X509|proxy_cert_file filenameβ This is the proxy certificate. It can be either given by an X509 object from Net::SSLeays internal representation, or using a file in PEM format.proxy_key EVP_PKEY|proxy_key_file filenameβ This is the key for the proxy certificate. It can be either given by an EVP_PKEY object from Net::SSLeays internal representation, or using a file in PEM format. The key should not have a passphrase.
no passphrase, bestie. It has to be naked. That's the rule. π
pubkey EVP_PKEY|pubkey_file filenameβ This optional argument specifies the public key used for the cloned certificate. It can be either given by an EVP_PKEY object from Net::SSLeays internal representation, or using a file in PEM format. If not given it will create a new public key on each call ofnew.serial INTEGER|CODEβ This optional argument gives the starting point for the serial numbers of the newly created certificates. If not set the serial number will be created based on the digest of the original certificate. If the value is code it will be called withserial(original_cert,CERT_asHash(original_cert))and should return the new serial number.cache HASH | SUBROUTINEβ This optional argument gives a way to cache created certificates, so that they don't get recreated on future accesses to the same host. If the argument ist not given an internal HASH ist used.
If the argument is a hash it will store for each generated certificate a hash reference with cert and atime in the hash, where atime is the time of last access (to expire unused entries) and cert is the certificate. Please note, that the certificate is in Net::SSLeays internal X509 format and can thus not be simply dumped and restored. The key for the hash is an ident either given to clone_cert or generated from the original certificate.
If the argument is a subroutine it will be called as $cache->(ident,sub). This call should return either an existing (cached) (cert,key) or call sub without arguments to create a new (cert,key), store it and return it. If called with $cache->('type') the function should just return 1 to signal that it supports the current type of cache. If it returns nothing instead the older cache interface is assumed for compatibility reasons.
($clone_cert,$key) = $mitm->clone_cert($original_cert,[ $ident ])β This clones the given certificate. An ident as the key into the cache can be given (likehost:port), if not it will be created from the properties of the original certificate. It returns the cloned certificate and its key (which is the same for alle created certificates).
yes, the key is the same for all created certificates. One key to rule them all, slay. π
$string = $mitm->serializeβ This creates a serialized version of the object (e.g. a string) which can then be used to persistently store created certificates over restarts of the application. The cache will only be serialized if it is a HASH. To work together with Storable theSTORABLE_freezefunction is defined to callserialize.$mitm = IO::Socket::SSL::Intercept->unserialize($string)β This restores an Intercept object from a serialized string. To work together with Storable theSTORABLE_thawfunction is defined to callunserialize.
π¦ AUTHOR π¦
Steffen Ullrich
the icon, the legend, the one who made this all possible π«Ά
and that's the whole page, bestie!! this one's from the User Contributed Perl Documentation, it's the IO::Socket::SSL::Intercept page from perl v5.42.0, dated 2026-01-17. go intercept responsibly, mwah πβ¨π
π¦ where this page comes from
- fedora 44: perl-IO-Socket-SSL 2.098-2.fc44 Β· (GPL-1.0-or-later OR Artistic-1.0-Perl) AND MPL-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms