Top Related Projects
cryptography is a package designed to expose cryptographic primitives and recipes to Python developers.
Scapy: the Python-based interactive packet manipulation program & library.
Testing TLS/SSL encryption anywhere on any port
Quick Overview
SSLyze is a fast and powerful SSL/TLS scanning library and CLI tool. It allows you to analyze the SSL/TLS configuration of a server by connecting to it and detecting various vulnerabilities and misconfigurations. SSLyze is written in Python and can be used both as a command-line tool and as a Python library.
Pros
- Fast and efficient, capable of scanning multiple servers simultaneously
- Comprehensive SSL/TLS checks, including protocol support, cipher suites, and certificate validation
- Actively maintained and regularly updated with new features and security checks
- Supports both IPv4 and IPv6 servers
Cons
- Requires some technical knowledge to interpret results effectively
- May trigger security alerts on target servers due to its scanning nature
- Limited GUI options, primarily command-line based
- Can be resource-intensive when scanning multiple servers or performing extensive tests
Code Examples
- Basic SSL scan:
from sslyze import ServerNetworkLocation, ServerNetworkConfiguration, Scanner, ServerScanRequest, ScanCommand
server_location = ServerNetworkLocation("www.example.com", 443)
server_scan_req = ServerScanRequest(server_location=server_location, scan_commands={ScanCommand.CERTIFICATE_INFO, ScanCommand.SSL_2_0_CIPHER_SUITES})
scanner = Scanner()
scanner.queue_scan(server_scan_req)
for server_scan_result in scanner.get_results():
print(server_scan_result)
- Checking for Heartbleed vulnerability:
from sslyze import ServerNetworkLocation, ServerNetworkConfiguration, Scanner, ServerScanRequest, ScanCommand
server_location = ServerNetworkLocation("www.example.com", 443)
server_scan_req = ServerScanRequest(server_location=server_location, scan_commands={ScanCommand.HEARTBLEED})
scanner = Scanner()
scanner.queue_scan(server_scan_req)
for server_scan_result in scanner.get_results():
heartbleed_result = server_scan_result.scan_commands_results[ScanCommand.HEARTBLEED]
print(f"Is vulnerable to Heartbleed: {heartbleed_result.is_vulnerable_to_heartbleed}")
- Checking TLS 1.3 support:
from sslyze import ServerNetworkLocation, ServerNetworkConfiguration, Scanner, ServerScanRequest, ScanCommand
server_location = ServerNetworkLocation("www.example.com", 443)
server_scan_req = ServerScanRequest(server_location=server_location, scan_commands={ScanCommand.TLS_1_3_CIPHER_SUITES})
scanner = Scanner()
scanner.queue_scan(server_scan_req)
for server_scan_result in scanner.get_results():
tls_1_3_result = server_scan_result.scan_commands_results[ScanCommand.TLS_1_3_CIPHER_SUITES]
print(f"Supports TLS 1.3: {tls_1_3_result.is_tls_1_3_supported}")
Getting Started
To get started with SSLyze, follow these steps:
-
Install SSLyze using pip:
pip install sslyze
-
Import the necessary modules and create a basic scan:
from sslyze import ServerNetworkLocation, Scanner, ServerScanRequest, ScanCommand server_location = ServerNetworkLocation("www.example.com", 443) server_scan_req = ServerScanRequest(server_location=server_location, scan_commands={ScanCommand.CERTIFICATE_INFO}) scanner = Scanner() scanner.queue_scan(server_scan_req) for server_scan_result in scanner.get_results(): print(server_scan_result)
-
Run the script to perform a basic SSL scan on the target server.
Competitor Comparisons
cryptography is a package designed to expose cryptographic primitives and recipes to Python developers.
Pros of cryptography
- Comprehensive cryptographic library with a wide range of algorithms and protocols
- Well-maintained with regular updates and strong community support
- Provides both high-level recipes and low-level interfaces for cryptographic operations
Cons of cryptography
- Steeper learning curve due to its extensive feature set
- May be overkill for simple SSL/TLS analysis tasks
- Requires more setup and configuration for specific use cases
Code Comparison
SSLyze (SSL/TLS scanning):
from sslyze import ServerNetworkLocationViaDirectConnection, ServerConnectivityTester, Scanner
from sslyze.plugins.certificate_info.implementation import CertificateInfoScanResult
server_location = ServerNetworkLocationViaDirectConnection("example.com", 443)
server_info = ServerConnectivityTester().perform(server_location)
scanner = Scanner()
scan_result = scanner.run_scan_command(server_info, CertificateInfoScanResult)
cryptography (Certificate handling):
from cryptography import x509
from cryptography.hazmat.primitives import hashes
cert = x509.load_pem_x509_certificate(pem_data)
subject = cert.subject
issuer = cert.issuer
public_key = cert.public_key()
Scapy: the Python-based interactive packet manipulation program & library.
Pros of Scapy
- More versatile, supporting a wide range of network protocols beyond SSL/TLS
- Powerful packet manipulation and creation capabilities
- Extensive community support and active development
Cons of Scapy
- Steeper learning curve due to its broader scope
- Less specialized for SSL/TLS analysis compared to SSLyze
- May require more setup and configuration for specific SSL/TLS tasks
Code Comparison
SSLyze (focused on SSL/TLS scanning):
from sslyze import ServerNetworkLocationViaDirectConnection, ServerConnectivityTester, Scanner, ServerScanRequest
from sslyze.plugins.scan_commands import ScanCommand
server_location = ServerNetworkLocationViaDirectConnection("example.com", 443)
server_info = ServerConnectivityTester().perform(server_location)
scanner = Scanner()
scan_request = ServerScanRequest(server_info=server_info, scan_commands={ScanCommand.CERTIFICATE_INFO})
Scapy (general-purpose packet manipulation):
from scapy.all import *
# Create a custom SSL/TLS packet
tls_packet = IP(dst="example.com")/TCP(dport=443)/TLS(type="client_hello")
# Send the packet and capture the response
response = sr1(tls_packet)
Testing TLS/SSL encryption anywhere on any port
Pros of testssl.sh
- Written in Bash, making it highly portable and easy to run on various systems
- Provides more comprehensive checks, including cipher suites, protocols, and server preferences
- Offers a text-based output that's easy to read and parse
Cons of testssl.sh
- Generally slower than sslyze due to its Bash implementation
- Less modular structure, making it harder to extend or integrate into other tools
- Limited multi-threading capabilities compared to sslyze
Code Comparison
testssl.sh:
#!/usr/bin/env bash
# testssl.sh - Testing TLS/SSL encryption anywhere on any port
TESTSSL_INSTALL_DIR="$(dirname "$0")"
PROG_NAME="$(basename "$0")"
sslyze:
from sslyze import ServerNetworkLocationViaDirectConnection, ServerConnectivityTester, Scanner
from sslyze.plugins.scan_commands import ScanCommand
server_location = ServerNetworkLocationViaDirectConnection("www.example.com", 443)
testssl.sh is a Bash script that can be run directly, while sslyze is a Python library that requires importing and using its classes and methods. testssl.sh's approach makes it easier to use as a standalone tool, while sslyze's structure allows for better integration into larger Python projects.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
SSLyze
SSLyze is a fast and powerful SSL/TLS scanning tool and Python library.
SSLyze can analyze the SSL/TLS configuration of a server by connecting to it, in order to ensure that it uses strong encryption settings (certificate, cipher suites, elliptic curves, etc.), and that it is not vulnerable to known TLS attacks (Heartbleed, ROBOT, OpenSSL CCS injection, etc.).
Key features
- Focus on speed and reliability: SSLyze is a battle-tested tool that is used to reliably scan hundreds of thousands of servers every day.
- Easy to operationalize: SSLyze can be directly run from CI/CD, in order to continuously check a server against Mozilla's recommended TLS configuration.
- Fully documented Python API to run scans directly from any Python application, such as a function deployed to AWS Lambda.
- Support for scanning non-HTTP servers including SMTP, XMPP, LDAP, POP, IMAP, RDP, Postgres and FTP servers.
- Results of a scan can easily be saved to a JSON file for later processing.
- And much more!
Quick start
On Windows, Linux (x86 or x64) and macOS, SSLyze can be installed directly via pip:
$ pip install --upgrade pip setuptools wheel
$ pip install --upgrade sslyze
$ python -m sslyze www.yahoo.com www.google.com "[2607:f8b0:400a:807::2004]:443"
It can also be used via Docker:
$ docker run --rm -it nablac0d3/sslyze:6.0.0 www.google.com
Lastly, a pre-compiled Windows executable can be downloaded from the Releases page.
Python API Documentation
A sample script describing how to use the SSLyze's Python API is available at ./api_sample.py.
Full documentation for SSLyze's Python API is available here.
Usage as a CI/CD step
By default, SSLyze will check the server's scan results against Mozilla's recommended "intermediate" TLS configuration, and will return a non-zero exit code if the server is not compliant.
$ python -m sslyze mozilla.com
Checking results against Mozilla's "intermediate" configuration. See https://ssl-config.mozilla.org/ for more details.
mozilla.com:443: OK - Compliant.
The Mozilla configuration to check against can be configured via --mozilla_config={old, intermediate, modern}
:
$ python -m sslyze --mozilla_config=modern mozilla.com
Checking results against Mozilla's "modern" configuration. See https://ssl-config.mozilla.org/ for more details.
mozilla.com:443: FAILED - Not compliant.
* certificate_types: Deployed certificate types are {'rsa'}, should have at least one of {'ecdsa'}.
* certificate_signatures: Deployed certificate signatures are {'sha256WithRSAEncryption'}, should have at least one of {'ecdsa-with-SHA512', 'ecdsa-with-SHA256', 'ecdsa-with-SHA384'}.
* tls_versions: TLS versions {'TLSv1.2'} are supported, but should be rejected.
* ciphers: Cipher suites {'TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384', 'TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256', 'TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256'} are supported, but should be rejected.
This can be used to easily run an SSLyze scan as a CI/CD step.
Development environment
To setup a development environment:
$ pip install --upgrade pip setuptools wheel
$ pip install -e .
$ pip install -r requirements-dev.txt
The tests can then be run using:
$ invoke test
License
Copyright (c) 2024 Alban Diquet
SSLyze is made available under the terms of the GNU Affero General Public License (AGPL). See LICENSE.txt for details and exceptions.
Top Related Projects
cryptography is a package designed to expose cryptographic primitives and recipes to Python developers.
Scapy: the Python-based interactive packet manipulation program & library.
Testing TLS/SSL encryption anywhere on any port
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot