Skip to main content

How to install a SSL certificate in Tomcat 8

If you want to run your web app on Tomcat 8 (Linux) under the HTTPS umbrella, these are the steps that you need to follow. In this example we will use test domain

1) Purchase an SSL certificate from trusted provider. Price ranges from $5 to over $100 per year.

2) SSH to your Linux server and, from your personal directory /home/youruser/ type the following command in order to generate the private key:
keytool -genkey -alias tomcat -keyalg RSA -keystore example.keystore

3) You will be asked some questions. The most important ones are the keystore password (let's assume it is yourPassword) and the First and last names, which is actually misleading because you need to enter the domain name:

4) Generate your local Certificated Signing Request (CSR) with this command:
keytool -certreq -keyalg RSA -alias tomcat -file example.csr -keystore example.keystore

5) Open the CSR file that you have just generated with vim example.csr, select all the content and copy it to the clipboard.

6) Paste the CSR from your clipboard in your trusted provider's website in order to issue the SSL certificate.

7) You will receive an email with a root certificate, at least one intermediate certificate and a signed certificate in CRT format.

8) Transfer all these files to the /home/youruser/ directory in the server using a FTP tool such as Filezilla.

9) Import the root certificate:
keytool -import -alias root -keystore example.keystore -trustcacerts -file yourRootCertificate.crt

10) Import each intermediate certificate (with a different alias):
keytool -import -alias intermediate1 -keystore example.keystore -trustcacerts -file yourFirstIntermediateCert.crt
keytool -import -alias intermediate2 -keystore
example.keystore -trustcacerts -file yourSecondIntermediateCert.crt

11) Import your signed certificate:
keytool -import -alias tomcat -keystore example.keystore -file yourSignedCert.crt

12) From the tomcat8/conf/server.xml file, add or edit the following code:
<Connector port="8443" maxThreads="150" scheme="https" secure="true"
           SSLEnabled="true" keystoreFile="/home/youruser/example.keystore"                   keystorePass="yourPassword" clientAuth="false" 
           keyAlias="tomcat" sslProtocol="TLS"/>

13) If you want to force the HTTPS to be loaded at all times, change the redirect of port 8080 in server.xml to 443. And add the following code in web.xml inside the <web-app>:
<!-- Require HTTPS for everything except /img (favicon) and /css. -->

14) If you are using a hosting provider such as Microsoft Azure, you will need to map the private and public ports in the virtual machine and upload the CRT certificates in the cloud service, as per below :

15) Your service should be available now on, and automatically redirected to the HTTPS version from

Popular posts from this blog

Microsoft will soon launch a feature to schedule chat messages on Teams

In 2021 I wrote an article  where I shared why I started scheduling my emails and the positive impact this easy action has had on the wellbeing of the recipients and on my own work-life balance . However, one of my frustrations is that, as of today, it is not possible to schedule chat messages or posts on Microsoft Teams. Have you ever received a push notification on a Friday evening  from a non-urgent message that could have easily waited until Monday? Yes, you know what I am talking about! The good news is that Microsoft is currently working on this feature, and it is expected to be released in July 2022 , as we can see on Microsoft's roadmap . It was back in June 2019 when this useful functionality was first proposed on Microsoft Tech Community . It soon gained many supporters that pushed it through the approval channels. I can't wait to start using this!

How to jump to time offsets in HTML5 video

Let's say that you have a 30-minute WEBM video file, from which you just want to play the following video segments , jumping from one to the other automatically  without interruptions : [00:01:25.00 - 00:02:25.00] -> from second 85 to 145 [00:11:40.00 - 00:11:55.00] -> from second 700 to 715 [00:20:26.00 - 00:21:07.00] -> from second 1226 to 1267 [00:26:11.00 - 00:28:01.00] -> from second 1571 to 1681 To increase the complexity, let's think that you have these video segments in a PHP variable $arrayVideoSegments  (normally the case if they were retrieved from the database).   $arrayVideoSegments[0]->startTime = 85   $arrayVideoSegments[0]->endTime = 145   $arrayVideoSegments[1]->startTime = 700   $arrayVideoSegments[1]->endTime = 715   $arrayVideoSegments[2]->startTime = 1226   $arrayVideoSegments[2]->endTime = 1267   $arrayVideoSegments[3]->startTime = 1571   $arrayVideoSegments[3]->endTime = 1681 The fo

How to disable cookies on Google Analytics so that you don't need a consent banner

The integration of Google Analytics into a website or blog is not GDPR-compliant by default . You must first obtain explicit consent of the end-users to store cookies, describing in your privacy policy how you intend to use collected personal data. This is the reason why most websites nowadays display an annoying (but necessary) consent banner. If you fail to do so or if you only ask for implicit consent, you are at risk of being fined. However, it is possible to disable cookies on Google Analytics (GA) respecting end-users privacy, so that you don't need to ask for consent. The downside is that you will not be able to distinguish the type of user (unique vs new vs returning) and you will miss some session insights. If these details are not relevant for you, here is how you do it. Disable Google Analytics cookies on a custom website If you have a custom website with full access to the source code, you can simply insert the script below between the <head>  and </head>