What is SSL and TLS?
- The SSL protocols define a set of rules about when to send and not send messages
- SSL provides confidentiality, authentication and message integrity
- Utilizes cryptographically sound message digests and symmetric encryption algorithms
- Provides the ability to resume sessions (SSL session IDs allow this)
- SSLv1 and SSLv2 were developed by Netscape
- SSLv3 and TLSv1 devloped by a community
- Defines two roles: client and server
How Does SSL Work?
- SSL works on a message passing paradigm
- Client initates connection, proposing ciphers and digest algorithms (specified in ClientHello)
- Server selects the cipher/MD/SSL version to be used (specified in ServerHello)
- ChangeCipherSpec is used to enable the negotiated security services
What is an x.509 Certificate?
- Digital equivalent of a drivers license
- Attests to the truth of an individual or Organization
- Usually issued by a certificate authority
Come in three flavors: Personal, Code signing and Web Site certificates
- CA certificates are special, the issuer and subject are the same
- Certificate Authorities certify their own identity
- Digital certificates contain a variety of information, including:
- Version
- Serial Number
- Issuer
- Subject
- Algorithm Identifier
- Extensions
- Signature
- Period Of Validity
- Subject's Public Key
- Subject Unique ID
- Issuer Unique ID
What is a Certificate Authority?
- Establishes trust (You trust the big CAS, don't you? )
- When a CA “ signs” your certificate, they are vouching that you are who you say you are
- ( Verisign accidentally issued two certs to a hacker claiming to be MSFT, oops )
- Two forms of Certificate Authorities: Private and Public
- Public Certificate Authorities (Verisign, Thawte, etc.) issue certficates to the world
- Private Certificate Authorities (OpenCA, Entrust CA) issue certificates to an organization
- Certificate delegation/chaining allows a CA to delegate signing capabilities
What Tools Are Available To Work With SSL And TLS?
OpenSSL
- Set of opensource cryptographic libraries
- Implements SSLv2, SSLv3 and TLSv1
- Support for OCSP Version 1 and 2
- Support Certificate Revocation Lists
- APIs and CLI can be used to encrypt and sign data
- If you have a recent version of Linux or FreeBSD/OpenBSD, openssl is included
- Configurable via a single configuration file (Default openssl.cnf)
- Can be configured to use hardware cryptographic accelerators
- Previously known as SSLeay (Eric A. Young was original maintainer)
- Current version as of this writing is 0.9.7b
- You can find the software at: openssl.org
Stunnel (Universal Secure Tunnel)
- Works as a wrapper for insecure services
- Adds wire-level security for POP3, IMAP, HTTP and NNTP and SMTP
- Supports client and server certificates
- Stunnel version 4.X uses a runtime configuration file
- Supports chroot() jails
- Current version as of this writing is 4.04
- You can find the software at: stunnel.org
SSL Dump
- SSLv3/TLS network protocol analyzer
- Packet Capture (PCAP) is used to intercept packets on the wire
- Works on most UNIX platforms (FreeBSD, Linux, Solaris, HP-UX, etc)
- Provides facilities to view SSL messages, application data and state changes
- Syntax is similar to tcpdump
- The current version as of this writing is 0.9b3
- You can find the software at: rtfm.com/ssldump
Fun Things To Do With OpenSSL And Friends
Creating RSA & DSA Keys
- “ genrsa” and “ gendsa” allow you to create RSA and DSA private keys - “ rsa” and “ dsa” allow you to extract public keys from the private key - “ rsautl” allows you to encrypt, decrypt and sign data (it is not intended for this purpose) - Examples:
Generate a set of DSA parameters
openssl dsaparam -out dsaparam 2048
Generate a DSA key
openssl gendsa -out dsaprivkey.pem -des3 dsaparam
Print the DSA public key associated with the private key above
openssl dsa -in dsaprivkey.pem -pubout -out dsapubkey.pem
Generate an RSA private key and encrypt it with 3DES
openssl genrsa -des3 -out rsa.key 2048
Print the public key associated with the RSA private key
openssl rsa -in rsa.key -pubout
Creating X.509 Certificates
- openssl allows you to create CSRs and x.509 certificates
- Support DSA and RSA keys
- Supports PEM and DER formatted certificates
- nodes can be used to strip passwords from private keys (not recommended!)
- Default certificate fields can be specified in openssl.cnf
- Example:
openssl req -x509 -outform PEM -keyform PEM -keyout cert.key -days 500 \
-out cert.crt -newkey rsa:2048
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Country Name (2 letter code) [GB]:US
State or Province Name (full name) [Berkshire]:Georgia
Locality Name (eg, city) [Newbury]:Atlanta
Organization Name (eg, company) [My Company Ltd]: H8x0R Computing
Organizational Unit Name (eg, section) []: IT
Common Name (eg, your name or your server's hostname) []: www.h8x0r.com
Email Address []: postmaster@h8x0r.com
Printing The Contents Of A Certificate
- The “x509” and “req” options allow you to print certificates
- Individual options to print issuer, serial number, hash, subject, fingerprint etc. etc.
- Examples:
Print the contents on an x509 certificate
openssl x509 -in cert.crt -text
Print the Subject Field on a certificate
openssl x509 -subject -in cert.crt -noout
Print the Issuer of the certificate
openssl x509 -issuer -in cert.crt -noout
Print the date the certificate will expire
openssl x509 -enddate -in cert.crt -noout
Print out the contents of a server certificate
openssl s_client -connect www.giddie-up.net:443 -showcerts
Becoming A Certificate Authority
- Create supporting files and directories
- Create a key pair for signing certificates
- Protect your private key with your life
- Example:
Setup directories and files
mkdir /etc/ca
mkdir /etc/ca/certs
mkdir /etc/ca/keys
chmod 700 /etc/ca /etc/ca/keys
echo '1' > /etc/ca/serial.txt
touch /etc/ca/index.txt
Create your certifcate and self-sign it
openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM - -keyout cakey.pem -keyform PEM
Generate a certificate signing request
openssl req -newkey rsa:1024 -keyout testkey.pem -keyform PEM - -out testreq.pem -outform PEM
Sign the CSR
openssl ca -in testreq.pem
Revoking Certifcates
- Allows your CA to revoke certs who have lost keys or certs - Examples:
Revoke a bad certificate
openssl ca -revoke testcert.pem
Generate a CRL to post to our website/OCSP
openssl ca -gencrl -out certs.crl
Encrypting And Decrypting Data
- Supports various symmetric ciphers (AES, 3DES, Blowfish, RC4, Cast5)
- Encrypted data can be Base64 encoded for easy trasport
- Supports CBC, CFB, ECB and OFB modes of encryption
- Data can be left as 0s and 1s for easy storage
- Example:
Encrypt /etc/services
openssl enc -in /etc/services -out /tmp/services.enc.blfsh -base64 -blowfish
Use a horrible encryption algorithm so others can view my data
openssl enc -in Finances.xls -out Finances.xls.enc.rc4 -rc4-40
Let's base64 encode /etc/services so I can send it to someone
openssl enc -in file.bin -out file.bin.b64 -base64
Decrypt a blowfish encrypted file
openssl enc -d -in services.enc.blfsh -blowfish -base64
Generating Message Digests
- Generates MD5, SHA1 and RIPEMD160 checksums
- Can produce colon delimited checksums for easy parsing
- Can verify a checksum using an existing public key
- Can verify a checksum using a private key
- Can sign a message digest with your private key
- Can output checksum as binary or hex
- Example:
Generate a SHA1 checksum of /etc/services
openssl dgst sha1 /etc/services
Generate an MD5 checksum of /etc/services
openssl md5 /etc/services
Generate a RIPEMD160 Checksum of /etc/services
openssl rmd160 /etc/services
Testing An SSL-Enabled Server
- s_server option can mimic an SSL-enabled server
- s_client option can mimic an SSL client
- Supports SSLv2/SSLv3 and TLSv1
- Allows for client and server side certificates
- s_client can be used to make sure your web servers are up and running
- Example:
#!/bin/sh
HOST="localhost"
OPENSSL_BINARY= "/usr/local/ssl/bin/openssl"
PORT="443"
LOG_ERROR_MESSAGE="apache_connect_failure"
TMP=/tmp/connect.$$
OPT=” s_client -tls1 -quiet”
${OPENSSL_BINARY} ${OPT} -connect ${HOST}:${PORT} > ${TMP} 2>&1 << EOF
GET / HTTP/1.0
EOF
if egrep "Server:" ${TMP} > /dev/null; then
:
else
logger -p daemon.notice "WEB_SERVER_ERROR (${LOG_ERROR_MESSAGE}):
Could not connect to ${HOST} on TCP Port ${PORT}"
fi
rm -f ${TMP}
Securing Insecure Services With Stunnel
- “[]” defines the service to be used with this connection
- “client” specifies if this is a server or client
- “accept” specifies the host and port to listen on
- “connect” is the remote end of the connection to connect to upon an accept()
- Logfiles can be specified with the “output” directive
- “Cafile” can be used with “verify” to validate certificates
- Server certificates can be specified with the “cert” directive
- “setuid” and “setgid” can be used to change the UID/GID the server runs as
- Run the Stunnel Daemon:
$ /usr/sbin/stunnel /etc/stunnel/stunnel-client.conf
$ cat /etc/stunnel/stunnel-client.conf
client=yes
Cafile=/etc/stunnel/cacert.pem
pid=/var/run/stunnel.pid
output = /var/log/stunnel.log
[imaps]
accept=127.0.0.1:imap
connect=imap.prefetch.net:imaps
Debugging SSL and TLS Problems
- ssldump can dump messages, state changes and application data
- Traffic can be isolated by port, src/dst IP, and network
- Example:
Dump the SSL messages and state changes
ssldump -t -a -A -i eth0 host zoom
Dump out all SSL traffic destined for zoom, including application data
ssldump -d -t -a -A -k privatekey.pem -p password -i eth0 host zoom
Learn More
SSL and TLS Essentials Practical Network Security with OpenSSL