<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Ssl on bramp.net</title>
    <link>https://blog.bramp.net/</link>
    <description>Recent content in Ssl on bramp.net</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-GB</language>
    <lastBuildDate>Sun, 27 Dec 2020 09:14:22 -0800</lastBuildDate>
    <atom:link href="https://blog.bramp.net/tags/ssl/" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Local HTTPS Server for development</title>
      <link>https://blog.bramp.net/post/2020/12/27/local-https-server-for-development/</link>
      <pubDate>Sun, 27 Dec 2020 09:14:22 -0800</pubDate>
      
      <guid>https://blog.bramp.net/post/2020/12/27/local-https-server-for-development/</guid>
      <description><p>I regularly do web development with the host localhost. Running a simple HTTP server to service my site. Recently I came across a problem where some of the newer web APIs (such as DeviceMotionEvent) do not work unless the site is served via SSL. So I went about setting up a local SSL server, and certificate.</p>
<p>Many of the <a href="https://matthewhoelter.com/2019/10/21/how-to-setup-https-on-your-local-development-environment-localhost-in-minutes.html">instructions out there</a> create a self-signed certificate, that you install to be trusted locally. I wanted my development server to be accessible from other devices on my network, and I didn&rsquo;t want the hassle of installing this self-signed cert. Instead I wanted a SSL certificate that uses a real/trusted CA.</p>
<p>Enter <a href="https://letsencrypt.org/">Let&rsquo;s Encrypt</a>, a free service to provide SSL certificates, providing you can prove you own the domain. To go about this, I did the following on my macbook:</p>
<h1 id="install-certbot-to-generate-the-cert">Install Certbot (to generate the cert)</h1>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">brew install certbot
</span></span></code></pre></div><p>There are a few ways to prove you own a domain, the HTTP based ones require a public web server. Since my development server is only on my local network, I&rsquo;m going to use a DNS based proof. Since I use Cloudflare for my DNS, I&rsquo;ll be using their plugin.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">pip3 install certbot-dns-cloudflare
</span></span></code></pre></div><h1 id="setup-the-domain-localbrampnet">Setup the domain (local.bramp.net)</h1>
<p>I use cloudflare to host the DNS for my domain, so I setup a new domain, local.bramp.net, that points to an internal IP address (192.168.0.123). This domain won&rsquo;t actually be used via the Internet, but will happily work for any devices on my local network.</p>
<figure><img src="/post/2020/12/27/local-https-server-for-development/setup-dns.png" width="720" height="208"><figcaption>
      <h4>Setup DNS record for local.bramp.net</h4>
    </figcaption>
</figure>

<p>You&rsquo;ll also need a <a href="https://support.cloudflare.com/hc/en-us/articles/200167836-Where-do-I-find-my-Cloudflare-API-key-">API key from Cloudflare</a>. They allow you to scope the key to only access this test domain. For example:</p>
<figure><img src="/post/2020/12/27/local-https-server-for-development/create-token.png" width="720" height="304"><figcaption>
      <h4>Create a API token</h4>
    </figcaption>
</figure>

<p>That will give you a token, that is a long string of letters and numbers.</p>
<h1 id="configure-certbot">Configure Certbot</h1>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Create a place to store your secrets, that only you can access</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">mkdir ~/.secrets
</span></span><span class="line"><span class="cl">cat <span class="s">&lt;&lt;EOF &gt; ~/.secrets/cloudflare.ini
</span></span></span><span class="line"><span class="cl"><span class="s">dns_cloudflare_api_token = **your_key**
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">chmod <span class="m">0700</span> ~/.secrets/
</span></span><span class="line"><span class="cl">chmod <span class="m">0400</span> ~/.secrets/cloudflare.ini
</span></span></code></pre></div><h1 id="generate-the-certificate">Generate the Certificate</h1>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">certbot certonly <span class="se">\
</span></span></span><span class="line"><span class="cl">  --config-dir ~/.secrets/ <span class="se">\
</span></span></span><span class="line"><span class="cl">  --work-dir ~/.secrets/ <span class="se">\
</span></span></span><span class="line"><span class="cl">  --logs-dir ~/.secrets/ <span class="se">\
</span></span></span><span class="line"><span class="cl">  --dns-cloudflare <span class="se">\
</span></span></span><span class="line"><span class="cl">  --dns-cloudflare-credentials ~/.secrets/cloudflare.ini <span class="se">\
</span></span></span><span class="line"><span class="cl">  -d local.bramp.net
</span></span></code></pre></div><p>and voila:</p>
<pre tabindex="0"><code> - Congratulations! Your certificate and chain have been saved at:
   /Users/bramp/.secrets/live/local.bramp.net/fullchain.pem
   Your key file has been saved at:
   /Users/bramp/.secrets/live/local.bramp.net/privkey.pem
</code></pre><p>The <code>privkey.pem</code> is important to keep secret. Normally certbot runs as root, but here we run it as your user for convenience.</p>
<p>If you want this to automatically renew, just run to add a renewal that occurs twice daily at a random minute after 12pm and 12am.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># List your current crontab, and append certbot renewal</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">(</span>crontab -l <span class="p">;</span> <span class="nb">echo</span> <span class="s2">&#34;</span><span class="k">$((</span> RANDOM <span class="o">%</span> <span class="m">60</span> <span class="k">))</span><span class="s2"> 0,12 * * * </span><span class="k">$(</span>which certbot<span class="k">)</span><span class="s2"> renew -q --config-dir ~/.secrets/ --work-dir ~/.secrets/ --logs-dir ~/.secrets/&#34;</span><span class="o">)</span> <span class="p">|</span> crontab -
</span></span></code></pre></div><p>Or you can renew (all certificates) on demand with a simple:</p>
<pre tabindex="0"><code>certbot renew \
  --config-dir ~/.secrets/ \
  --work-dir ~/.secrets/ \
  --logs-dir ~/.secrets/
</code></pre><h1 id="install-a-simple-https-web-server">Install a simple HTTPS web server</h1>
<p>I use <a href="https://github.com/http-party/http-server">http-server</a>, &ldquo;a simple, zero-configuration command-line http server.&rdquo;. It supports many useful features, including SSL.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">brew install http-server
</span></span></code></pre></div><h1 id="running-the-https-web-server">Running the HTTPS web server</h1>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">http-server -S <span class="se">\
</span></span></span><span class="line"><span class="cl">  -C ~/.secrets/live/local.bramp.net/fullchain.pem <span class="se">\
</span></span></span><span class="line"><span class="cl">  -K ~/.secrets/live/local.bramp.net/privkey.pem
</span></span></code></pre></div><p>You may wish to alias this to something shorter, for example:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">https</span><span class="o">=</span><span class="s2">&#34;http-server -S \
</span></span></span><span class="line"><span class="cl"><span class="s2">  -C ~/.secrets/live/local.bramp.net/fullchain.pem \
</span></span></span><span class="line"><span class="cl"><span class="s2">  -K ~/.secrets/live/local.bramp.net/privkey.pem&#34;</span>
</span></span></code></pre></div><p>Now you can run <code>https</code> from any directory and it&rsquo;ll be served over SSL.</p>
<h1 id="additional-reading">Additional Reading</h1>
<ul>
<li><a href="https://support.cloudflare.com/hc/en-us/articles/200167836-Where-do-I-find-my-Cloudflare-API-key-">Cloudflare - Managing API Tokens and Keys</a></li>
<li><a href="https://certbot.eff.org/lets-encrypt/osx-other">certbot instructions</a></li>
<li><a href="https://mangolassi.it/topic/18355/setup-letsencrypt-certbot-with-cloudflare-dns-authentication-ubuntu/2">Setup LetsEncrypt Certbot with CLoudFlare DNS authentication (Ubuntu)</a></li>
<li><a href="https://matthewhoelter.com/2019/10/21/how-to-setup-https-on-your-local-development-environment-localhost-in-minutes.html">How to setup HTTPS (SSL) on your local development environment (localhost) in minutes</a></li>
<li><a href="https://certbot-dns-cloudflare.readthedocs.io/en/stable/">certbot-dns-cloudflare’s documentation!</a></li>
</ul>
</description>
    </item>
    
    <item>
      <title>Turn on HTTPS for all GitHub Pages</title>
      <link>https://blog.bramp.net/post/2016/06/08/turn-on-github-io-ssl/</link>
      <pubDate>Wed, 08 Jun 2016 19:37:47 -0700</pubDate>
      
      <guid>https://blog.bramp.net/post/2016/06/08/turn-on-github-io-ssl/</guid>
      <description><p>GitHub just <a href="https://github.com/blog/2186-https-for-github-pages">announced</a> that all github.io sites can enforce the use of HTTPS. Previously GitHub supported HTTPS on these sites, but you couldn&rsquo;t force users to use HTTPS other than using a <a href="https://gist.github.com/konklone/9968713">javascript redirect hack</a>, or putting a CDN infront of GitHub. Now by checking a single box you can force users to the secure version:</p>
<p><img src="checkbox.png" alt="Enforce HTTPS Checkbox"></img></p>
<p>Sadly I have far too many repositories, and I don&rsquo;t recall which one uses pages. I figured it would be easy to hit <a href="https://developer.github.com/v3/">GitHub&rsquo;s API</a> and enabled this. The API doesn&rsquo;t directly support enabling HTTPS, so instead I wrote a quick script to list all repos with GitHub pages:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/env python</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Prints a list of all owned repositories with pages.</span>
</span></span><span class="line"><span class="cl"><span class="c1"># by Andrew Brampton 2016 https://bramp.net</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">requests</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">headers</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;Authorization&#39;</span><span class="p">:</span> <span class="s1">&#39;token XXXXX&#39;</span><span class="p">}</span> <span class="c1"># Replace XXXX with a token from https://github.com/settings/tokens</span>
</span></span><span class="line"><span class="cl"><span class="n">params</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;owner&#39;</span><span class="p">,</span> <span class="s1">&#39;page&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">	<span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;https://api.github.com/user/repos&#39;</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="n">repos</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="ow">not</span> <span class="n">repos</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">break</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="n">repo</span> <span class="ow">in</span> <span class="n">repos</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span> <span class="n">repo</span><span class="p">[</span><span class="s1">&#39;has_pages&#39;</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">			<span class="nb">print</span> <span class="s2">&#34;</span><span class="si">%32s</span><span class="s2"> </span><span class="si">%s</span><span class="s2">/settings&#34;</span> <span class="o">%</span><span class="p">(</span><span class="n">repo</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">],</span> <span class="n">repo</span><span class="p">[</span><span class="s1">&#39;html_url&#39;</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">params</span><span class="p">[</span><span class="s1">&#39;page&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span></code></pre></div><p>Download <a href="turn-on-github-ssl.py">turn-on-github-ssl.py</a></p>
<p>This print out something like so:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ ./turn-on-github-ssl.py
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                blog https://github.com/bramp/blog/settings
</span></span><span class="line"><span class="cl">  ffmpeg-cli-wrapper https://github.com/bramp/ffmpeg-cli-wrapper/settings
</span></span><span class="line"><span class="cl">js-sequence-diagrams https://github.com/bramp/js-sequence-diagrams/settings
</span></span><span class="line"><span class="cl">           js-sudoku https://github.com/bramp/js-sudoku/settings
</span></span><span class="line"><span class="cl">        nodewii-talk https://github.com/bramp/nodewii-talk/settings
</span></span><span class="line"><span class="cl">             prob.js https://github.com/bramp/prob.js/settings
</span></span><span class="line"><span class="cl">                <span class="nb">test</span> https://github.com/bramp/test/settings
</span></span><span class="line"><span class="cl">              unsafe https://github.com/bramp/unsafe/settings
</span></span><span class="line"><span class="cl">...
</span></span></code></pre></div><p>Now click on each URL, and just check the box.</p>
</description>
    </item>
    
  </channel>
</rss>
