Show HN: Never have an SSL certificate expire again
haveibeenexpired.com
haveibeenexpired.com
Weird choice. SSL certificates are generally not urgent enough that I need to act right away, so any IM notification will be forgotten before I can act on it. Furthermore email is the most widely supported communication system as opposed to proprietary chat systems.
1 email is $0.0001 on AWS SES 1 webhook is ~$0.00000083 assuming 512mb for 100ms.
Webhooks are... easier to consume.
Thanks for this feedback!
Totally agree that to capture the audience that relies on email, asking for a mailing list for notifications is much better than notifying the personal email address I get via SSO.
Some current stats on this: 12.5% of the registered users have added a webhook of some sort to their account. This is the primary engagement metric for me, it's very low, but I want to find a way to drive it up before I give in to email :)
And it's not only teams who would use this service, since it has a generous free tier.
If I hadn't built my own system, I'd definitely use this one, and receiving an email would be nice as a reminder which could hang around in the inbox until I have time to deal with it (if I'd had the need to, since it's all automated). I don't use Slack, nor Discord, but XMPP, and if I'd set up a Webhook handler, it would end up sending me an email and XMPP notifications.
I have a small custom SMTP server which serves as a "webhook" handler for me to get USGS Earthquake Notification Service (ENS) notifications as well as backup success notifications from my VPS provider, since they don't provide Webhooks. So I'm basically doing it the other way around.
Maybe offering it as an experimental "no guarantees" service would be useful for many of us and give the service provider a chance to learn how to send emails from their own servers in such a way that they actually reach their destination without getting flagged as spam.
I also found no information on what happens if the Webhook endpoint is not reachable.
I like the idea of this SSL expiry checking service and the site looks nice.
> I also found no information on what happens if the Webhook endpoint is not reachable.
When setting a webhook, the app checks it for validity (you get a nice 'hooray, it works!' message posted through the webhook). So if the webhook URL is bad, the app won't accept it. But once accepted, there is no retry policy if a specific notification fails. The failure will be logged internally for troubleshooting, but not presented to the user in any way right now.
Of course these orgs have their own infra monitoring, but technically anybody can monitor them and then claim to do so.
(If these companies signed up for the service then or course it would be legal to claim that.)
As for myself I turn down every request for a logo, I like and use your product but I don't really care if you cut me a small break for using it.
This company (is there a company behind it, I couldn't find those details) markets to countries outside of Israel I assume.
I hear what you are saying about the credibility hit I'm taking with showing logos like this. Will think what to do about it!
I have now changed this to include only logos of companies with whom I am directly involved, who are actively using my service to monitor their SSL certificates, and who have agreed to have their logos appear on my landing page.
What's the compelling reason to use this over, say, Hardenize[1] or Oh Dear[2]?
[1]: https://www.hardenize.com/
[2]: https://ohdear.app/
A cert that was issued, found on CT, and expires tomorrow? Who knows, if it isn't served by any host/LB, let it expire, right?
I do get emails from the CA reminding me to renew a month or so before expiry, and the certificate hasn't been revoked as of yet, but it'd be useful to be alerted regarding the latter, were it to happen.
Off the cuff answer - I want to be very focused on a specific use-case - a live cert that is about to expire. This allows me to be very greedy on the automatic addition of new hosts, without polluting you with notifications you don't care about.
I'll probably rewrite it as a single rust binary one of these days.
The core of script is this snippet of bash, where $target is of the format host:port.
cert_exp_date=$(echo | openssl s_client -connect "$target" 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f 2 | head -c 20 )
if [ -n "${cert_exp_date}" ]; then
cert_exp_date_seconds="$(date --date="${cert_exp_date}" +%s)"
now_seconds="$(date +%s)"
exp_days="$(( ( cert_exp_date_seconds - now_seconds ) / 86400 ))"
echo "certificate_expiration_days,name=${name},target=${target} days=${exp_days}"
The script is executed as a Telegraf exec input so that the data can be fed into my general monitoring setup (InfluxDB and Grafana). I have a Grafana alert for each host.https://pypi.org/project/sslyze/
Can use it from the command line too:
python -m sslyze news.ycombinator.com* https://github.com/matteocorti/check_ssl_cert
* https://www.monitoring-plugins.org/doc/man/check_http.html
* https://exchange.nagios.org/directory/Plugins/Network-Protoc...
(Also acme.sh has soured me a bit on multi-thousand line shell scripts)
* https://github.com/matteocorti/check_ssl_cert
* https://www.monitoring-plugins.org/doc/man/check_http.html
* https://exchange.nagios.org/directory/Plugins/Network-Protoc...
https endpoints will include the probe_ssl_earliest_cert_expiry metric, which is the expiration in UNIX epoch seconds. Use with the builtin time() function.
But... my app automatically finds new relevant hosts and adds them to the monitoring cycles, needing 0 intervention after you tell it which domains interest you. Not saying it's everyone's need, but I'm here for those who need just this :)
Can anyone recommend a similar service that doesn't have this limitation, ie one that can check certificates on SMTP, IMAP, and other protocols that aren't HTTPS?
The automated monitoring (once you sign up and add domains/hosts) only checks HTTPS, so no dice there...
To succeed it seems the product either needs to revise its pricing or add more features to justify the cost.
In a market that is very saturated with feature-rich services, I want to do something narrow, and address a specific need. It makes it easier for me to rely on certificate transparency, as I'm adding new hosts automatically, without risking noisy notifications. I wouldn't want an uptime service to glob whatever hosts it finds in my domain just to tell me they go down, or don't respond to HTTP. But an SSL cert is either served, and has an upcoming expiration date, or isn't served - in which case I'll never alert about it :)
https://github.com/no-gravity/certdays
Works with any monitoring system. For example if you want your tests to fail if the cert for a domain is valid for less that 14 days, you put this in your tests:
certdays.sh somedomain.com 14
Any monitoring system I've ever worked with can check for expired certificates. So usually the issue at previous jobs has been either there is no monitoring system (time to set one up!) or no SSL expiry checks are configured in the existing system (usually relatively straightforward to add manually or automate). I think I'd struggle to justify using yet another external service to cover that particular type of check.
The thing here is that you don't have to keep updating the app with every new host you create that needs to be monitored. CT allows me to detect newly issued certs in your domain, and start monitoring them without manual work on your behalf. And if you issue a cert with a hostname that doesn't yet have a DNS record, the app won't complain - no host means no live cert that can expire :)
Caveat - I have yet figured out how to apply this automated discovery for orgs that use wildcard certs... Suggestions are welcome :)
Speaking of which, hosting your own status page is a bold decision that has burned many folks in the past. https://status.haveibeenexpired.com/
Re the statuspage - that's just a CNAME record, I'm a proud user of updown.io (which, btw, also offer SSL expiration checks for hosts they monitor!)
I use it for my blog and have never had any issues with certs being renewed well in advance of their expiration date.
GitHub - https://www.haveibeenexpired.com/auth/github Windows Live - https://www.haveibeenexpired.com/auth/windowslive
I can easily add more, and once this is needed by users, I will create a login page that lists all these options.
Indeed, I wanted to spare myself from implementing more detailed registration, but mainly wanted to keep the user from more steps in the registration process.
What would be an acceptable sign-in method for you?
Secret sauce - it uses https://certificate.transparency.dev/ to crawl your domain and automatically add new hosts for monitoring.
Is expiration monitoring done solely through certificate transparency logs or also by connecting to the host? I assume both, but I couldn't find a confirmation of this.
Can the service monitor hosts that aren't accessible publicly? For example, using an agent running inside a company's internal network.
If the answer above is "Yes" then a follow up question is: Does this service support certificate checking for certificates that aren't on certificate transparency logs? That is, certificates generated from a company's internal certificate authority.
For every detected host, the app periodically performs an SSL handshake (HTTPS only), and checks for the expiration of the served cert. CT is used to detect new certs, and extract relevant hosts from these certs.
> Can the service monitor hosts that aren't accessible publicly?
Nope, this runs as a Heroku app right now, and will work with publicly accessible HTTPS-serving hosts only.
> Does this service support certificate checking for certificates that aren't on certificate transparency logs?
Yes, CT is used to detect new hosts automatically. The app also relies on the SANS of the certs it finds, spreading as wide as possible within the domain of interest. The actual checking of certs is a simple HTTPS handshake and inspection of the served cert.
No IPv6 support? :-(
On your page I get:
connect ENETUNREACH 2607:f8b0:4004:c08::8a:443 - Local (:::0)> Do we share the information we collect with third parties?
> We may share the information that we collect, both personal and non-personal, with third parties such as advertisers, contest sponsors, promotional and marketing partners, and others who provide our content or whose products or services we think may interest you.
It seems like they are attempting to rely on implied/non-optional consent for everything:
> Your Consent
> We've updated our Privacy Policy to provide you with complete transparency into what is being set when you visit our site and how it's being used. By using our website, registering an account, or making a purchase, you hereby consent to our Privacy Policy and agree to its terms.
It doesn't seem like they are separating out their processing activities and assigning suitable lawful bases (contract/LI/consent etc.), which is a bit concerning.