Checking SSL/TLS endpoints with Eventline
Updated for the open source version of Eventline.
Introduction
Configuring SSL/TLS servers has never been easy, and one always has to worry about an unexpected configuration change which will cause the dreaded “Not Secure” annotation, usually associated with a cryptic error message.
Having automated tests to regularly make sure that your website is still accessible using HTTPS helps a lot when trying to avoid this kind of issue.
Of course it means having some kind of script, a place to run it, a way to collect results and be notified if something goes wrong… In this article, we will demonstrate how Eventline can be used to run these tests.
We will assume that we have some knowledge about the way jobs are deployed on Eventline. Feel free to refer to our tutorial for more information.
Script
Let us start with a small script named check-tls-endpoint.sh
whose job is to
check a single endpoint:
#!/bin/sh
set -eu
set -o pipefail
if [ $# -lt 2 ]; then
echo "Usage: $0 <host> <port>" >&2
exit 1
fi
host=$1
port=$2
echo 'Q' | openssl s_client -host "$host" -port "$port" -verify_return_error
We call the OpenSSL s_client
subcommand to connect to the host and port
passed as parameters. The -verify_return_error
option forces openssl
to
return a non-zero exit status code if verification fails. Note that we have to
write a single character, Q
, to the standard input of OpenSSL to force it to
quit right after the SSL connection has been established. See the man
page of
s_client
for more information.
Job
We can then write the job in a file named check-tls-endpoints.yaml
. Make
sure to write both the script and the job file in the same directory.
---
name: "check-tls-endpoints"
trigger:
event: "time/tick"
periodic:
periodic: 600
runtime:
name: "docker"
parameters:
image: "alpine:latest"
steps:
- label: "install dependencies"
code: |
apk add openssl
- label: "check web endpoint"
script:
path: "check-tls-endpoint.sh"
arguments: ["www.example.com", "443"]
- label: "check mail endpoint"
script:
path: "check-tls-endpoint.sh"
arguments: ["imap.example.com", "993"]
- label: "check irc endpoint"
script:
path: "check-tls-endpoint.sh"
arguments: ["irc.example.com", "6697"]
The job is to be executed every 10 minutes.
We run our job in Docker for convenience (that, and we need an excuse to show how to use this runner!). We could also simply use the local runner as long as OpenSSL is installed on the host machine.
First we install OpenSSL, then we call our script for each endpoint that need to be checked.
If one of the check fails, the job will also fail. If you configured an email address for notifications in the configuration of the Eventline project, you will be notified as soon as it happens.
Testing everything
At this point, your job is operational. You can use
Evcli and its deploy-job
command to deploy it.
If everything went right, the job is visible on the web interface, and will be executed on a regular basis.
Going further
We could improve this job several ways:
- We could check for additional information such as the expiration date of the certificate, and fail when expiration is near.
- We could also check for more than just SSL/TLS support and try to connect to the service running.
Do you have any use cases in mind ? We would love to hear about it!