{"id":188,"date":"2026-06-01T05:30:06","date_gmt":"2026-06-01T05:30:06","guid":{"rendered":"https:\/\/blog.offshorekaka.in\/?p=188"},"modified":"2026-08-27T05:43:44","modified_gmt":"2026-08-27T05:43:44","slug":"install-ssl-certificate-offshore-hosting","status":"publish","type":"post","link":"https:\/\/offshorekaka.in\/blog\/install-ssl-certificate-offshore-hosting\/","title":{"rendered":"How to Install an SSL Certificate on Offshore Hosting"},"content":{"rendered":"<div class=\"ok-pro-panel\">\n<p><span class=\"ok-pro-kicker\">Installation Guides<\/span><\/p>\n<h2>The padlock, in about five minutes<\/h2>\n<p>A certificate from Let&#8217;s Encrypt is free, automated and trusted by every browser. On an <a href=\"https:\/\/offshorekaka.in\/offshore-web-hosting\/\">offshore hosting<\/a> account with a panel it is usually one click. On a plain VPS it is one command. Neither costs anything.<\/p>\n<p>What actually goes wrong is rarely the certificate itself. It is DNS not pointing at the server yet, port 80 being closed, or a renewal that silently stopped working three months ago. This guide covers all three.<\/p>\n<div class=\"ok-pro-grid\">\n<div class=\"ok-pro-card\"><strong>Time<\/strong><span>5 minutes.<\/span><\/div>\n<div class=\"ok-pro-card\"><strong>Cost<\/strong><span>Nothing.<\/span><\/div>\n<div class=\"ok-pro-card\"><strong>Valid for<\/strong><span>90 days, renewed automatically.<\/span><\/div>\n<\/div>\n<\/div>\n<div class=\"ok-toc\"><strong>On this page<\/strong><a href=\"#before\">Two things to check first<\/a><a href=\"#issue\">Issuing the certificate<\/a><a href=\"#verify\">Verifying it<\/a><a href=\"#renew\">Renewal, the part that breaks<\/a><a href=\"#cf\">If you use Cloudflare<\/a><a href=\"#faq\">FAQ<\/a><\/div>\n<h2 id=\"before\">Two things to check first<\/h2>\n<p>Certbot proves you control the domain by serving a file over HTTP. So two things have to be true before it can work.<\/p>\n<p><strong>DNS points at this server:<\/strong><\/p>\n<pre><code>dig +short yourdomain.com<\/code><\/pre>\n<p>That must return this server&#8217;s IP. If it returns your old host, issuing will fail with an authorisation error, and the error message will not say why.<\/p>\n<p><strong>Port 80 is open.<\/strong> Even if your site only serves HTTPS, the validation happens over port 80. Close it and validation cannot complete:<\/p>\n<pre><code>ufw status | grep 80<\/code><\/pre>\n<h2 id=\"issue\">Issuing the certificate<\/h2>\n<pre><code>apt install certbot python3-certbot-nginx -y\ncertbot --nginx -d yourdomain.com -d www.yourdomain.com<\/code><\/pre>\n<p>Use <code>python3-certbot-apache<\/code> and <code>--apache<\/code> on Apache. Certbot edits the vhost for you, adds the certificate paths and sets up the HTTP to HTTPS redirect.<\/p>\n<p>Include both the bare domain and www. They are separate names as far as a certificate is concerned, and leaving one out means half your visitors get a warning.<\/p>\n<h2 id=\"verify\">Verifying it<\/h2>\n<p>Do not just look for the padlock. Read what the server is actually serving:<\/p>\n<pre><code>echo | openssl s_client -servername yourdomain.com -connect yourdomain.com:443 2&gt;\/dev\/null | openssl x509 -noout -subject -issuer -dates<\/code><\/pre>\n<figure class=\"wp-block-image size-large ok-inline-visual\"><img decoding=\"async\" src=\"https:\/\/offshorekaka.in\/blog\/wp-content\/uploads\/2026\/08\/ok-ssl-certificate-check.webp\" alt=\"Terminal showing certificate subject, issuer and the notBefore and notAfter validity dates\" loading=\"lazy\" width=\"2296\" height=\"448\"><figcaption>Subject, issuer and both dates. This is the certificate the server is really handing out.<\/figcaption><\/figure>\n<p>Check the subject matches your domain and that notAfter is in the future. This command is also the fastest way to answer &#8220;is the certificate about to expire&#8221;, which is worth checking now and then even with auto renewal on.<\/p>\n<p>Then confirm HTTP redirects to HTTPS rather than serving both:<\/p>\n<pre><code>curl -sI http:\/\/yourdomain.com | head -3<\/code><\/pre>\n<p>You want a 301 to the https address. Serving the same page on both is a duplicate content problem as well as a security one.<\/p>\n<h2 id=\"renew\">Renewal, the part that actually breaks<\/h2>\n<p>Certificates last 90 days. Certbot installs a timer that renews at around 60 days, so in theory you never think about it again. In practice renewals fail quietly, and you find out when a visitor tells you the site is showing a warning.<\/p>\n<pre><code>certbot renew --dry-run<\/code><\/pre>\n<p>That runs the whole renewal without actually renewing. If it passes, renewal works. Run it once now, and again any time you change the web server config.<\/p>\n<p>The two things that break renewals later:<\/p>\n<ul>\n<li><strong>Port 80 got closed<\/strong> after the fact, often during a firewall tidy up. Validation needs it.<\/li>\n<li><strong>The vhost changed<\/strong> and certbot can no longer find the webroot it used the first time.<\/li>\n<\/ul>\n<p>Add an expiry alert to your monitoring so this cannot surprise you. Our <a href=\"https:\/\/offshorekaka.in\/blog\/offshore-server-monitoring-guide\/\">monitoring guide<\/a> covers what to alert on.<\/p>\n<h2 id=\"cf\">If you use Cloudflare<\/h2>\n<p>You still need a certificate on your own server. Cloudflare&#8217;s padlock covers the visitor to Cloudflare hop. The Cloudflare to your server hop is separate, and it is controlled by the SSL mode setting.<\/p>\n<p>Set it to <strong>Full (strict)<\/strong>, which requires a valid certificate on the origin. Flexible means Cloudflare talks to your server in plain HTTP while showing visitors a padlock, and it causes redirect loops on any server that forces HTTPS. Our <a href=\"https:\/\/offshorekaka.in\/blog\/cloudflare-dns-setup-for-offshore-hosting\/\">Cloudflare guide<\/a> covers the setting.<\/p>\n<p>One catch: with the orange cloud on, certbot&#8217;s HTTP validation can fail because the request goes through Cloudflare rather than to your server. Either turn the proxy off for a few minutes while you issue, or use a DNS challenge instead.<\/p>\n<h2 id=\"test\">How to test<\/h2>\n<ol>\n<li>Load the site over HTTPS in a private window. No warnings.<\/li>\n<li><code>curl -I http:\/\/yourdomain.com<\/code> returns a 301 to https.<\/li>\n<li>Test www and the bare domain separately.<\/li>\n<li>Read the certificate with the openssl command above and check the dates.<\/li>\n<li><code>certbot renew --dry-run<\/code> passes.<\/li>\n<li>Run an SSL Labs test and look for the full chain rather than just a green padlock.<\/li>\n<\/ol>\n<h2 id=\"trouble\">When something breaks<\/h2>\n<table>\n<thead>\n<tr>\n<th>What you see<\/th>\n<th>Why<\/th>\n<th>Fix<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Authorisation failed during issuing<\/td>\n<td>DNS not pointing here, or port 80 closed<\/td>\n<td>Check with dig, then open 80<\/td>\n<\/tr>\n<tr>\n<td>Warning on www but not the bare domain<\/td>\n<td>www was not included in the certificate<\/td>\n<td>Reissue with both <code>-d<\/code> flags<\/td>\n<\/tr>\n<tr>\n<td>Too many redirects<\/td>\n<td>Cloudflare SSL mode is Flexible<\/td>\n<td>Switch to Full (strict)<\/td>\n<\/tr>\n<tr>\n<td>Certificate expired despite auto renewal<\/td>\n<td>Renewal has been failing silently<\/td>\n<td><code>certbot renew --dry-run<\/code> to see the real error<\/td>\n<\/tr>\n<tr>\n<td>Padlock shows but some images are blocked<\/td>\n<td>Mixed content. Pages still reference http resources<\/td>\n<td>Search and replace http with https in the database<\/td>\n<\/tr>\n<tr>\n<td>Rate limit error from Let&#8217;s Encrypt<\/td>\n<td>Too many issue attempts for the same domain<\/td>\n<td>Wait an hour, and use <code>--dry-run<\/code> while testing<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"checklist\">Checklist<\/h2>\n<ul>\n<li>DNS confirmed pointing at this server.<\/li>\n<li>Port 80 open for validation.<\/li>\n<li>Certificate issued for both the bare domain and www.<\/li>\n<li>HTTP redirecting to HTTPS with a 301.<\/li>\n<li>Certificate read back with openssl and dates checked.<\/li>\n<li><code>certbot renew --dry-run<\/code> passing.<\/li>\n<li>Cloudflare, if used, set to Full (strict).<\/li>\n<li>An expiry alert in your monitoring.<\/li>\n<\/ul>\n<div class=\"ok-cta-box\">\n<p><strong>Want SSL without the command line?<\/strong><\/p>\n<p>Every OffshoreKaka hosting plan includes a free certificate that issues and renews on its own, so Full (strict) works from day one.<\/p>\n<p><a class=\"btn ok-cta-link\" href=\"https:\/\/offshorekaka.in\/offshore-web-hosting\/\">See the hosting plans<\/a><\/p>\n<\/div>\n<h2 id=\"faq\">FAQ<\/h2>\n<h3>Is a free certificate as good as a paid one?<\/h3>\n<p>For encryption, identical. Both use the same algorithms and browsers treat them the same. Paid certificates sell you a warranty, organisation validation showing your company name in the details, and support. For a normal website none of that changes anything a visitor sees.<\/p>\n<h3>Why only 90 days?<\/h3>\n<p>Short lifetimes limit the damage if a private key leaks, and they force renewal to be automated rather than a yearly manual chore. Since certbot handles it, the length is not something you have to think about, as long as you have tested that renewal works.<\/p>\n<h3>Does HTTPS help my ranking?<\/h3>\n<p>It is a genuine, confirmed ranking signal, though a very small one. The bigger reason is that browsers mark HTTP pages as Not Secure, and visitors leave. Treat it as required rather than as an optimisation.<\/p>\n<h3>Do I need a certificate on a subdomain too?<\/h3>\n<p>Yes, each hostname needs to be covered. Add it with another <code>-d<\/code> flag, or issue a wildcard certificate for <code>*.yourdomain.com<\/code>, which needs a DNS challenge rather than the HTTP one. If you are setting up a staging subdomain, our <a href=\"https:\/\/offshorekaka.in\/blog\/create-staging-site-on-offshore-hosting\/\">staging guide<\/a> covers it.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Free, and about five minutes. What actually breaks is renewal, quietly, three months later. How to test that it will not.<\/p>\n","protected":false},"author":1,"featured_media":908,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-188","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-installation-guides"],"_links":{"self":[{"href":"https:\/\/offshorekaka.in\/blog\/wp-json\/wp\/v2\/posts\/188","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/offshorekaka.in\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/offshorekaka.in\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/offshorekaka.in\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/offshorekaka.in\/blog\/wp-json\/wp\/v2\/comments?post=188"}],"version-history":[{"count":5,"href":"https:\/\/offshorekaka.in\/blog\/wp-json\/wp\/v2\/posts\/188\/revisions"}],"predecessor-version":[{"id":1006,"href":"https:\/\/offshorekaka.in\/blog\/wp-json\/wp\/v2\/posts\/188\/revisions\/1006"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/offshorekaka.in\/blog\/wp-json\/wp\/v2\/media\/908"}],"wp:attachment":[{"href":"https:\/\/offshorekaka.in\/blog\/wp-json\/wp\/v2\/media?parent=188"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/offshorekaka.in\/blog\/wp-json\/wp\/v2\/categories?post=188"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/offshorekaka.in\/blog\/wp-json\/wp\/v2\/tags?post=188"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}