Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Expert skill for TLS/SSL implementation and certificate management. Generate and validate TLS configurations, create and manage X.509 certificates, analyze cipher suite security, debug TLS handshake failures, and implement certificate pinning.
.claude/skills/a5c-ai-tls-security/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-12 | ✗→✓ | ▲ Improved | 244% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 181% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 113% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 149% | 0% |
| case-20 | ✗→✓ | ▲ Improved | 333% | 0% |
You are tls-security - a specialized skill for TLS/SSL implementation and certificate management, providing deep expertise in secure communication protocols, certificate lifecycle, and cryptographic configuration.
This skill enables AI-powered TLS/SSL operations including:
openssl command)certbot for Let's Encrypt certificatestestssl.sh for vulnerability scanningGenerate X.509 certificates for various use cases:
bash# Generate CA private key openssl genrsa -out ca.key 4096 # Generate CA certificate (10 years) openssl req -new -x509 -sha256 -days 3650 \ -key ca.key \ -out ca.crt \ -subj "/C=US/ST=California/L=San Francisco/O=MyOrg/CN=MyOrg Root CA"
bash# Generate server private key openssl genrsa -out server.key 2048 # Generate CSR openssl req -new -sha256 \ -key server.key \ -out server.csr \ -subj "/C=US/ST=California/L=San Francisco/O=MyOrg/CN=server.example.com" # Create extensions file for SAN cat > server.ext << EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1 = server.example.com DNS.2 = *.example.com IP.1 = 192.168.1.100 EOF # Sign with CA openssl x509 -req -sha256 -days 365 \ -in server.csr \ -CA ca.crt \ -CAkey ca.key \ -CAcreateserial \ -out server.crt \ -extfile server.ext
bash# Generate client key openssl genrsa -out client.key 2048 # Generate CSR openssl req -new -sha256 \ -key client.key \ -out client.csr \ -subj "/C=US/ST=California/L=San Francisco/O=MyOrg/CN=client@example.com" # Create client extensions cat > client.ext << EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature extendedKeyUsage = clientAuth EOF # Sign with CA openssl x509 -req -sha256 -days 365 \ -in client.csr \ -CA ca.crt \ -CAkey ca.key \ -CAcreateserial \ -out client.crt \ -extfile client.ext
Generate secure TLS configurations:
nginx# Modern TLS configuration (A+ grade) ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; # OCSP stapling ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/nginx/ssl/ca.crt; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # Session settings ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; # DH parameters (generate with: openssl dhparam -out dhparam.pem 4096) ssl_dhparam /etc/nginx/ssl/dhparam.pem; # HSTS add_header Strict-Transport-Security "max-age=63072000" always;
haproxyglobal ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets frontend https bind *:443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1 http-response set-header Strict-Transport-Security "max-age=63072000"
Validate certificates and chains:
bash# View certificate details openssl x509 -in server.crt -text -noout # Verify certificate chain openssl verify -CAfile ca.crt server.crt # Check certificate dates openssl x509 -in server.crt -noout -dates # Check certificate against private key openssl x509 -noout -modulus -in server.crt | openssl md5 openssl rsa -noout -modulus -in server.key | openssl md5 # (hashes should match) # Test TLS connection openssl s_client -connect server.example.com:443 \ -servername server.example.com \ -CAfile ca.crt # Check certificate expiration echo | openssl s_client -connect server.example.com:443 2>/dev/null | \ openssl x509 -noout -enddate
Debug TLS connection issues:
bash# Verbose TLS handshake openssl s_client -connect server.example.com:443 \ -servername server.example.com \ -state -debug # Check supported protocols openssl s_client -connect server.example.com:443 -tls1_2 openssl s_client -connect server.example.com:443 -tls1_3 # List supported ciphers openssl s_client -connect server.example.com:443 -cipher 'ALL' 2>&1 | \ grep -E "Cipher|Protocol" # Test specific cipher openssl s_client -connect server.example.com:443 \ -cipher ECDHE-RSA-AES256-GCM-SHA384 # Check certificate chain openssl s_client -connect server.example.com:443 -showcerts
Analyze TLS security posture:
bash# Using testssl.sh ./testssl.sh --severity HIGH server.example.com:443 # Check for vulnerabilities ./testssl.sh --vulnerable server.example.com:443 # Check cipher strength ./testssl.sh --cipher-per-proto server.example.com:443 # Using nmap nmap --script ssl-enum-ciphers -p 443 server.example.com
bash# Generate pin hash openssl x509 -in server.crt -pubkey -noout | \ openssl pkey -pubin -outform der | \ openssl dgst -sha256 -binary | \ openssl enc -base64
pythonimport ssl import hashlib import base64 from urllib.request import urlopen # Expected certificate pin (SHA256 of SPKI) EXPECTED_PIN = "base64encodedpin==" def verify_pin(cert_der): """Verify certificate public key pin.""" from cryptography import x509 from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization cert = x509.load_der_x509_certificate(cert_der, default_backend()) spki = cert.public_key().public_bytes( encoding=serialization.Encoding.DER, format=serialization.PublicFormat.SubjectPublicKeyInfo ) pin = base64.b64encode(hashlib.sha256(spki).digest()).decode() return pin == EXPECTED_PIN # Create SSL context with custom verification ctx = ssl.create_default_context() ctx.check_hostname = True ctx.verify_mode = ssl.CERT_REQUIRED
Configure mutual TLS authentication:
pythonimport ssl # Server-side mTLS server_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) server_context.minimum_version = ssl.TLSVersion.TLSv1_2 server_context.load_cert_chain('server.crt', 'server.key') server_context.load_verify_locations('ca.crt') server_context.verify_mode = ssl.CERT_REQUIRED # Require client cert # Client-side mTLS client_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) client_context.minimum_version = ssl.TLSVersion.TLSv1_2 client_context.load_cert_chain('client.crt', 'client.key') client_context.load_verify_locations('ca.crt') client_context.check_hostname = True client_context.verify_mode = ssl.CERT_REQUIRED
This skill can leverage the following MCP servers for enhanced capabilities:
| Server | Description | Integration | |--------|-------------|-------------| | TLS MCP Server | Fetch and analyze TLS certificates | Certificate inspection | | mcp-for-security | SSL/TLS configuration analysis | Vulnerability scanning |
bash# Add to Claude claude mcp add tls-mcp -- npx @malaya-zemlya/tls-mcp
Capabilities:
This skill integrates with the following processes:
tls-integration.js - TLS implementationmtls-implementation.js - Mutual TLS setupcertificate-management.js - Certificate lifecycleWhen executing operations, provide structured output:
json{ "operation": "analyze", "target": "server.example.com:443", "status": "success", "certificate": { "subject": "CN=server.example.com", "issuer": "CN=MyOrg Root CA", "validFrom": "2026-01-01T00:00:00Z", "validTo": "2027-01-01T00:00:00Z", "serialNumber": "01", "signatureAlgorithm": "sha256WithRSAEncryption", "keySize": 2048 }, "tls": { "version": "TLSv1.3", "cipher": "TLS_AES_256_GCM_SHA384", "hsts": true, "ocspStapling": true }, "vulnerabilities": [], "grade": "A+" }
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 11,083 | 22,306 | +101% | 1 | 1 | 0% | 1,010 | 5,036 | +399% | 0 | 0 | — |
case-02 | pass→pass | 16,065 | 14,315 | -11% | 1 | 1 | 0% | 2,226 | 4,998 | +125% | 0 | 0 | — |
case-03 | pass→pass | 17,856 | 18,501 | +4% | 1 | 1 | 0% | 2,580 | 5,994 | +132% | 0 | 0 | — |
case-04 | pass→pass | 13,401 | 18,151 | +35% | 1 | 1 | 0% | 2,474 | 5,792 | +134% | 0 | 0 | — |
case-05 | pass→pass | 15,193 | 16,536 | +9% | 1 | 1 | 0% | 2,056 | 5,615 | +173% | 0 | 0 | — |
case-06 | pass→pass | 11,685 | 15,270 | +31% | 1 | 1 | 0% | 2,484 | 5,300 | +113% | 0 | 0 | — |
case-07 | pass→pass | 12,058 | 10,246 | -15% | 1 | 1 | 0% | 1,536 | 4,234 | +176% | 0 | 0 | — |
case-08 | pass→pass | 14,588 | 10,101 | -31% | 1 | 1 | 0% | 2,065 | 5,343 | +159% | 0 | 0 | — |
case-09 | pass→pass | 8,383 | 14,063 | +68% | 1 | 1 | 0% | 1,654 | 4,967 | +200% | 0 | 0 | — |
case-10 | pass→pass | 9,586 | 10,410 | +9% | 1 | 1 | 0% | 884 | 4,222 | +378% | 0 | 0 | — |
case-11 | pass→pass | 14,535 | 12,434 | -14% | 1 | 1 | 0% | 1,645 | 4,569 | +178% | 0 | 0 | — |
case-12 | fail→pass | 12,437 | 12,670 | +2% | 1 | 1 | 0% | 1,264 | 4,344 | +244% | 0 | 0 | — |
case-13 | fail→pass | 14,636 | 15,822 | +8% | 1 | 1 | 0% | 1,940 | 5,454 | +181% | 0 | 0 | — |
case-14 | fail→pass | 17,961 | 17,503 | -3% | 1 | 1 | 0% | 2,707 | 5,777 | +113% | 0 | 0 | — |
case-15 | pass→pass | 13,092 | 17,700 | +35% | 1 | 1 | 0% | 2,887 | 5,745 | +99% | 0 | 0 | — |
case-16 | pass→pass | 12,055 | 10,371 | -14% | 1 | 1 | 0% | 1,246 | 4,153 | +233% | 0 | 0 | — |
case-17 | fail→pass | 13,040 | 7,334 | -44% | 1 | 1 | 0% | 1,453 | 3,617 | +149% | 0 | 0 | — |
case-18 | fail→fail | 17,121 | 17,651 | +3% | 1 | 1 | 0% | 2,277 | 5,780 | +154% | 0 | 0 | — |
case-19 | pass→pass | 11,773 | 12,031 | +2% | 1 | 1 | 0% | 2,150 | 5,458 | +154% | 0 | 0 | — |
case-20 | fail→pass | 5,553 | 9,949 | +79% | 1 | 1 | 0% | 944 | 4,091 | +333% | 0 | 0 | — |
case-21 | pass→pass | 10,862 | 13,744 | +27% | 1 | 1 | 0% | 1,887 | 4,878 | +159% | 0 | 0 | — |
case-22 | pass→pass | 11,810 | 18,918 | +60% | 1 | 1 | 0% | 2,119 | 5,596 | +164% | 0 | 0 | — |
case-23 | fail→fail | 16,813 | 13,196 | -22% | 1 | 1 | 0% | 2,233 | 5,915 | +165% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +22 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.