<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/feeds.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://chameth.com/">
    <title>Chameth.com - posts like offline-gnupg-master-yubikey-subkeys, why-you-should-be-using-https but not debugging-beyond-the-debugger, sense-api</title>
    <subtitle>Personal homepage of Chris Smith</subtitle>
    <link href="https://chameth.com/feeds/posts/like/offline-gnupg-master-yubikey-subkeys,why-you-should-be-using-https/unlike/debugging-beyond-the-debugger,sense-api/" rel="self"/>
    <link href="https://chameth.com/"/>
    <icon>https://chameth.com/favicon.png</icon>
    <updated>2016-08-11T00:00:00Z</updated>
    <id>https://chameth.com/</id>
    <author>
        <name>Chris Smith</name>
    </author>
    <entry>
        <title>Creating an offline GnuPG master key with Yubikey-stored subkeys</title>
        <link href="https://chameth.com/offline-gnupg-master-yubikey-subkeys/"/>
        <updated>2016-08-11T00:00:00Z</updated>
        <id>https://chameth.com/offline-gnupg-master-yubikey-subkeys/</id>
        <content xml:lang="en" type="html">&lt;figure class=&#34;image right&#34;&gt;
  &lt;picture&gt;
      &lt;source srcset=&#34;https://chameth.com/offline-gnupg-master-yubikey-subkeys/keys.avif&#34; type=&#34;image/avif&#34;/&gt;
      &lt;source srcset=&#34;https://chameth.com/offline-gnupg-master-yubikey-subkeys/keys.webp&#34; type=&#34;image/webp&#34;/&gt;
      &lt;img src=&#34;https://chameth.com/offline-gnupg-master-yubikey-subkeys/keys.png&#34; alt=&#34;A pair of Yubikeys&#34; loading=&#34;lazy&#34; width=&#34;250&#34; height=&#34;250&#34;/&gt;
  &lt;/picture&gt;
  &lt;figcaption&gt;&lt;p&gt;A pair of Yubikeys&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I recently noticed that I’d accidentally lost my previous GPG private key — whoops. It was on
a drive that I’d since formatted and used for a fair amount of time, so there’s no hope of
getting it back (but, on the plus side, there’s also no risk of anyone else getting their hands on
it). I could have created a new one in a few seconds and been done with it, but I decided to treat
it as an exercise in doing things properly.&lt;/p&gt;
&lt;h3 id=&#34;background-gpg-yubikey&#34;&gt;Background: GPG? Yubikey?&lt;/h3&gt;
&lt;p&gt;GPG or GnuPG is short for &lt;a href=&#34;https://www.gnupg.org/&#34;&gt;Gnu Privacy Guard&lt;/a&gt;, which is a suite of
applications that provide cryptographic privacy and authentication functionality. At a basic level,
it works in a similar way to HTTPS certificates: each user has a public key which is shared widely,
and a private key that is unique to them. You can use someone else’s public key to encrypt messages
so only they can see them, and use your own private key to sign content so that others can verify
it came from you.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&#34;https://www.yubico.com/faq/yubikey/&#34;&gt;Yubikey&lt;/a&gt; is a small hardware device that offers two-factor
authentication. Most Yubikey models also act as smartcards and allow you to store OpenPGP
credentials on them.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h3 id=&#34;introducing-subkeys&#34;&gt;Introducing subkeys&lt;/h3&gt;
&lt;p&gt;GnuPG supports subkeys, which provide fairly significant security advantages. Instead of just having
a single public and private key, you have a master pair and then any number of subkey pairs. The
subkeys are automatically associated with the master key, but they can be revoked independently.&lt;/p&gt;
&lt;p&gt;Having a master key fall into the wrong hands is a problem — you have to revoke the whole
thing (assuming you have access to a revocation certificate) and start again, convincing everyone
else that your new key is the “real” you. With subkeys, you can issue a revocation signed with your
master key and then sign some new subkeys. There’s no loss of trust, and as long as people refresh
your key from a keyserver, everything carries on as normal.&lt;/p&gt;
&lt;p&gt;The other advantage to using subkeys is that you can keep the master key elsewhere. It doesn’t
need to be routinely accessible, and using it doesn’t require access to the Internet. The master
key is kept offline, significantly reducing the risk of anything bad happening to it.&lt;/p&gt;
&lt;h3 id=&#34;setting-up-a-secure-environment&#34;&gt;Setting up a secure environment&lt;/h3&gt;
&lt;p&gt;My main desktop runs Windows, and most of my other devices are work ones which come with automatic
backups and network mounts that I don’t fully grok. Neither of those is a particularly good option
if I want to do something security sensitive.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://tails.boum.org/&#34;&gt;Tails&lt;/a&gt; is the defacto choice for a secure, live linux system, so I went
through their installation process and eventually ended up with a USB drive that can boot into
Tails. The installation process from Windows is slightly convoluted, as it involves creating a
bootable Tails image, then booting to that and using the Tails installer to create the real image
on a different drive. If you’re starting on a Linux box, you can just use the Tails installer
directly instead of doing the two-drive shuffle.&lt;/p&gt;
&lt;p&gt;Just to be completely paranoid, I disconnected my PC from the network before booting Tails. This
is known as &lt;a href=&#34;https://en.wikipedia.org/wiki/Air_gap_%28networking%29&#34;&gt;air-gapping&lt;/a&gt;, and is done to
eliminate the possibility of a remote attacker doing something to your system. Ideally the machine
never would have been connected to the network, but I didn’t happen to have an unused machine
laying around.&lt;/p&gt;
&lt;p&gt;The final thing I needed was a secure place to store my master key. I opted for an
&lt;a href=&#34;http://www.ironkey.com/en-US/&#34;&gt;IronKey&lt;/a&gt; — a hardware-encrypted USB drive that self-destructs
if there are too many unsuccessful attempts to access it. It works out-of-the-box on both Windows
and Linux, presenting a small unencrypted drive with software to run to interact with the secure
partition.&lt;/p&gt;
&lt;h3 id=&#34;creating-the-keys&#34;&gt;Creating the keys&lt;/h3&gt;
&lt;p&gt;Now I had a nice over-the-top setup it was time to actually the keys. There is &lt;a href=&#34;https://blog.josefsson.org/2014/06/23/offline-gnupg-master-key-and-subkeys-on-yubikey-neo-smartcard/&#34;&gt;an excellent
guide by Simon Josefsson&lt;/a&gt;
that walks through the entire process of creating the master key, creating three subkeys, and
then transferring them to a Yubikey.&lt;/p&gt;
&lt;p&gt;The only point where I had to deviate from Simon’s guide was setting the machine up to work with
the Yubikeys. I was setting up two keys (a nano and a neo), and one just worked out of the box
with the version of &lt;code&gt;libykpers-1-1&lt;/code&gt; that was in Tails’ apt repository. The other needed a slightly
newer version but that was also available in apt and can be selected by specifying the version
manually as pointed out in &lt;a href=&#34;https://github.com/freedomofpress/securedrop/issues/1035#issuecomment-140172267&#34;&gt;this GitHub issue&lt;/a&gt;.
The version numbers have since changed, but &lt;code&gt;apt-policy&lt;/code&gt; makes it easy to figure out what’s needed.
As I was using an air-gapped system this process was a bit more complicated than it sounds,
involving several USB drive transfers.&lt;/p&gt;
&lt;p&gt;After finishing the guide, I had my master key and a pre-generated revocation certificate stored
securely on my IronKey, and the three subkeys stored on each Yubikey. Time to go back to Windows.&lt;/p&gt;
&lt;h3 id=&#34;gpg-windows-and-ssh&#34;&gt;GPG, Windows and SSH&lt;/h3&gt;
&lt;p&gt;Now with the IronKey disconnected and the master key out of harms way, it’s time to go back to
Windows. I downloaded the &lt;a href=&#34;https://www.gnupg.org/download/&#34;&gt;GnuPG Modern&lt;/a&gt; distribution and
followed the instructions at the end of Simon’s guide to import my public key and make GPG aware
of the subkeys on the Yubikey. After that &lt;a href=&#34;https://www.enigmail.net/index.php/en/&#34;&gt;Enigmail&lt;/a&gt;
was able to sign and encrypt e-mail in Thunderbird.&lt;/p&gt;
&lt;figure class=&#34;image left&#34;&gt;
  &lt;picture&gt;
      &lt;source srcset=&#34;https://chameth.com/offline-gnupg-master-yubikey-subkeys/wisdom_of_the_ancients.avif&#34; type=&#34;image/avif&#34;/&gt;
      &lt;source srcset=&#34;https://chameth.com/offline-gnupg-master-yubikey-subkeys/wisdom_of_the_ancients.webp&#34; type=&#34;image/webp&#34;/&gt;
      &lt;img src=&#34;https://chameth.com/offline-gnupg-master-yubikey-subkeys/wisdom_of_the_ancients.png&#34; alt=&#34;XKCD: Wisdom of the Ancients&#34; loading=&#34;lazy&#34; width=&#34;485&#34; height=&#34;270&#34;/&gt;
  &lt;/picture&gt;
  &lt;figcaption&gt;&lt;p&gt;&lt;a href=&#34;https://xkcd.com/979/&#34;&gt;XKCD #979: Wisdom of the ancients&lt;/a&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Next up, I enabled PuTTy support and started the GPG agent, as documented over on
&lt;a href=&#34;https://developers.yubico.com/PGP/SSH_authentication/Windows.html&#34;&gt;Yubico’s site&lt;/a&gt;. This allows
you to use the authentication GPG key to authenticate SSH sessions from PuTTy. To find the
SSH key you need to add to &lt;code&gt;.authorized_keys&lt;/code&gt;, simply run &lt;code&gt;gpg --export-ssh-key&lt;/code&gt;. At first I
could SSH into a host but not use agent forwarding. After lots of unsuccessful Googling, I realised
that GPG couldn’t access the key anymore locally. Another quick search and I found a
&lt;a href=&#34;http://forum.yubico.com/viewtopic.php?f=35&amp;amp;t=2231&#34;&gt;forum thread&lt;/a&gt; where someone had the same
issue and found it was a problem with exclusive access to the card. They even passed on their
wisdom and updated the thread with a solution, which got everything working for me.&lt;/p&gt;
&lt;h3 id=&#34;vmware&#34;&gt;VMWare&lt;/h3&gt;
&lt;p&gt;I have a Ubuntu image running inside VMWare on my desktop that I use for most development
activities. I’m unlikely to want to sign e-mail, but I probably want to sign commits (especially
now that &lt;a href=&#34;https://github.com/blog/2144-gpg-signature-verification&#34;&gt;GitHub exposes verified signatures&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;To do that I need to pass the Yubikey through to the virtual machine. In its default configuration,
VMWare recognises the Yubikey device but doesn’t pass it through correctly. You need to configure it
to &lt;a href=&#34;http://www.timothysalmon.com/2014/12/vmware-workstation-connect-yubikey-to.html&#34;&gt;allow HIDs&lt;/a&gt;,
after which &lt;code&gt;gpg --card-status&lt;/code&gt; starts working from the VM.&lt;/p&gt;
&lt;p&gt;Unfortunately passing through the device makes it exclusively available to the VM so the host OS
can no longer use it. As I have two Yubikeys, I just configured VMWare to ignore the nano key that’s
always plugged in, and pass through the neo when I plug that in. While swapping the configuration
around, I found out that GPG remembers the ID of the smartcard that store credentials - if you
swap the two keys with identical subkeys it demands the other one is reinserted. You can get rid of
the references to the previous card using &lt;code&gt;gpg --delete-secret-keys&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;in-conclusion&#34;&gt;In conclusion…&lt;/h3&gt;
&lt;p&gt;… I have a &lt;a href=&#34;https://chameth.com/16402FE2.txt&#34;&gt;new PGP key&lt;/a&gt; you can use to verify things I sign or encrypt
messages to me.&lt;/p&gt;
</content>
    </entry>
    <entry>
        <title>Why you should be using HTTPS</title>
        <link href="https://chameth.com/why-you-should-be-using-https/"/>
        <updated>2016-06-17T00:00:00Z</updated>
        <id>https://chameth.com/why-you-should-be-using-https/</id>
        <content xml:lang="en" type="html">&lt;figure class=&#34;image left&#34;&gt;
  &lt;picture&gt;
      &lt;source srcset=&#34;https://chameth.com/why-you-should-be-using-https/https-everywhere.avif&#34; type=&#34;image/avif&#34;/&gt;
      &lt;source srcset=&#34;https://chameth.com/why-you-should-be-using-https/https-everywhere.webp&#34; type=&#34;image/webp&#34;/&gt;
      &lt;img src=&#34;https://chameth.com/why-you-should-be-using-https/https-everywhere.jpg&#34; alt=&#34;The EFF&amp;#39;s HTTPS Everywhere logo&#34; loading=&#34;lazy&#34; width=&#34;300&#34; height=&#34;260&#34;/&gt;
  &lt;/picture&gt;
  &lt;figcaption&gt;&lt;p&gt;The EFF’s HTTPS Everywhere logo&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;One of my favourite hobbyhorses recently has been the use of HTTPS, or lack thereof. HTTPS is the
thing that makes the little padlock appear in your browser, and has existed for over 20 years.
In the past, that little padlock was the exclusive preserve of banks and other ‘high security’
establishments; over time its use has gradually expanded to most (but not all) websites
that handle user information, and the time is now right for it to become ubiquitous.&lt;/p&gt;
&lt;h3 id=&#34;why-use-https&#34;&gt;Why use HTTPS?&lt;/h3&gt;
&lt;p&gt;There are numerous advantages to using HTTPS, both for the users of a website and for the
operator:&lt;/p&gt;
&lt;h4 id=&#34;privacy&#34;&gt;Privacy&lt;/h4&gt;
&lt;p&gt;The most obvious advantage is that HTTPS gives your users additional privacy. An insecure (HTTP)
request can potentially be read by anyone on the same network, or the network operators, or anyone
who happens to operate a network along the path between the user and the server.&lt;/p&gt;
&lt;p&gt;Users on shared WiFi networks (such as those in coffee shops, hotels, or offices) are particularly
vulnerable to passive sniffing by anyone else on that network. If the network is open (as is
frequently the case) then anyone in radio range can see exactly what the user is up to.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h4 id=&#34;integrity&#34;&gt;Integrity&lt;/h4&gt;
&lt;p&gt;HTTPS also helps to maintain the integrity of your site. With a plain HTTP request, there’s nothing
to stop anyone in between the server and the user from modifying the content of the request or the
response. This is a frequent tactic used by annoying WiFi gateways (such as the ones &lt;a href=&#34;http://justinsomnia.org/2012/04/hotel-wifi-javascript-injection/&#34;&gt;you’d find in
a hotel&lt;/a&gt;), dubious ISPs who want
to serve you extra adverts, or just plain old nefarious attackers.&lt;/p&gt;
&lt;p&gt;If you’re trying to convey some kind of information to users (and if you aren’t, why exactly are
you running a website again?) it seems beneficial to both you and them if the information arrives
as you intended, rather than in a modified form due to someone or something tampering with it.&lt;/p&gt;
&lt;h4 id=&#34;security&#34;&gt;Security&lt;/h4&gt;
&lt;p&gt;If your website has any kind of authentication, or session identifiers, it becomes extremely
vulnerable to an attacker monitoring the traffic and stealing the credentials. This was
starkly demonstrated in 2010 when &lt;a href=&#34;https://en.wikipedia.org/wiki/Firesheep&#34;&gt;Firesheep&lt;/a&gt; was
released. This tool allowed anyone to quickly and automatically hijack social media accounts of
anyone on the same network who was using HTTP to access them.&lt;/p&gt;
&lt;p&gt;Even if your login pages are served over HTTPS, if you send a single session ID cookie over HTTP
(such as a page you decided wasn’t particularly ‘important’) then an attacker can probably spoof
the user’s session and gain full access to their account.  Again, in the case of open WiFi networks
that could be anyone in radio range.&lt;/p&gt;
&lt;h4 id=&#34;search-engine-rankings&#34;&gt;Search engine rankings&lt;/h4&gt;
&lt;p&gt;Some search engines use HTTPS as a signal in their ranking algorithms. &lt;a href=&#34;https://security.googleblog.com/2014/08/https-as-ranking-signal_6.html&#34;&gt;Google announced in
2004&lt;/a&gt; that it was using
the presence of HTTPS as a small positive signal, but that it may strengthen that signal over time
as more and more websites switch to using a secure transport. It’s not unthinkable that at some
point in the future there will be HTTPS-only search engines.&lt;/p&gt;
&lt;h3 id=&#34;but-but-but&#34;&gt;But… But… But…&lt;/h3&gt;
&lt;p&gt;There are lots of excuses for not implementing HTTPS. Most of them are either misguided or outdated.&lt;/p&gt;
&lt;h4 id=&#34;its-too-expensive-andor-complicated&#34;&gt;It’s too expensive and/or complicated&lt;/h4&gt;
&lt;p&gt;In the past, getting HTTPS certificates was a pain. A number of free suppliers have existed for
a while but the process for getting their certificates wasn’t particularly straight forward, and
many imposed arbitrary restrictions on the certificate parameters. Even once you had the
certificate, you had to fiddle about with your HTTP server configuration to make it work, remember
to manually get a new certificate when the old one expired, and lots of other annoying busywork.&lt;/p&gt;
&lt;p&gt;With the arrival of &lt;a href=&#34;https://letsencrypt.org/&#34;&gt;Let’s Encrypt&lt;/a&gt;, all that changed. You can retrieve
and deploy a free HTTPS certificate with two or three commands. Renewal can be handled completely
automatically with a single command executed by cron.&lt;/p&gt;
&lt;h4 id=&#34;theres-no-point-nothing-on-my-site-is-sensitive&#34;&gt;There’s no point; nothing on my site is sensitive&lt;/h4&gt;
&lt;p&gt;You might not think your content warrants privacy, but can you speak for everyone who accesses it?
Even content that seems mundane to you — such as travel advice, or technical writing — could be
used to build up a profile of a user. If an attacker is monitoring traffic in a coffee shop and
sees a user looking at travel advice and weather forecasts for a foreign country, he could use that
information to plan a burglary knowing that the user will be away. Similarly, some content which
is perfectly mundane to you may actually be very sensitive in other countries with repressive
governments. HTTPS makes it much harder for these people to snoop on traffic.&lt;/p&gt;
&lt;p&gt;From another angle, if you’re offering any kind of information, instructions, or especially file
downloads, there’s a severe risk to users if the content is modified on its way to them. An evil
sysadmin could rewrite your travel advice to suggest visiting the local drug dealer’s hangout, or
replace your download with a malware-infested version.&lt;/p&gt;
&lt;h4 id=&#34;https-is-slower-uses-more-resources-etc&#34;&gt;HTTPS is slower, uses more resources, etc&lt;/h4&gt;
&lt;p&gt;Back in 1995 this might have been a valid argument. Enabling HTTPS on a modern server will make
an almost negligible difference to performance. If you also enable HTTP/2 (which most
implementations only support over HTTPS), it’s likely to actually use fewer resources, and result
in a faster, smoother experience for your users. HTTP/2 was designed to work with HTTPS, and
designed with modern requirements and networking techniques in mind.&lt;/p&gt;
&lt;p&gt;CloudFlare have an &lt;a href=&#34;https://www.cloudflare.com/http2/&#34;&gt;excellent demonstration&lt;/a&gt; of the benefits of
HTTP/2, and it can show speed improvements of 2-3x in a typical environment. On top of being faster,
HTTP/2 uses fewer connections which results in less resource overhead on both the server and the
client.&lt;/p&gt;
&lt;h3 id=&#34;so-what-are-you-waiting-for&#34;&gt;So what are you waiting for?&lt;/h3&gt;
&lt;p&gt;If you run a website and aren’t using HTTPS, &lt;a href=&#34;https://certbot.eff.org/&#34;&gt;give it a try&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
</feed>
