app/com/gu/contentapi/sanity/SSLExpiryTest.scala (54 lines of code) (raw):
package com.gu.contentapi.sanity
import com.gu.contentapi.sanity.support.TestFailureHandler
import com.gu.contentapi.sanity.tags.{LowPriorityTest, ProdOnly}
import play.api.libs.ws.WSClient
import scala.util.{Failure, Success}
import javax.net.ssl._
import java.net.URL
import sun.security.x509.X509CertImpl
import java.time.{Duration, ZonedDateTime}
import scala.util.Try
@ProdOnly
class SSLExpiryTest(context: Context, wsClient: WSClient) extends SanityTestBase(context, wsClient) {
"SSL Certificates" should "be more than 30 days from expiry" taggedAs LowPriorityTest in {
val hosts = Seq(
Config.host,
Config.hostPublicSecure,
Config.previewHost,
Config.writeHost,
Config.writePreviewHost
)
val secureHosts = hosts map {
_.replaceAll("http://", "https://")
}
for (host <- secureHosts) {
val url = new URL(host)
val conn = url.openConnection().asInstanceOf[HttpsURLConnection]
conn.setHostnameVerifier(new HostnameVerifier {
override def verify(hostnameVerifier: String, sslSession: SSLSession) = true
})
val certsTry = Try {
conn.connect()
conn.getServerCertificates
}
conn.disconnect()
certsTry match {
case Success(certs) =>
withClue(s"No Certificates found for $host") {
certs.length should be >= 1
}
certs.headOption.foreach { cert =>
cert shouldBe a[X509CertImpl]
val x = cert.asInstanceOf[X509CertImpl]
val expiry = x.getNotAfter.toInstant
val daysleft = Duration.between(ZonedDateTime.now().toInstant, expiry).toDays
if (daysleft < 30) {
fail("Cert for %s expires in %d days".format(host, daysleft))
}
}
case Failure(e) =>
cancel(s"Cancelling test as exception thrown: ${e.getClass.getSimpleName}")
}
}
}
}