<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Akhil Garg</title>
    <description>The latest articles on Forem by Akhil Garg (@akhilgarg).</description>
    <link>https://forem.com/akhilgarg</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1105245%2Fdc10a66f-e54a-46d9-9d91-5f13aa85cb08.jpg</url>
      <title>Forem: Akhil Garg</title>
      <link>https://forem.com/akhilgarg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/akhilgarg"/>
    <language>en</language>
    <item>
      <title>How we set up GPG keys as Environment variables</title>
      <dc:creator>Akhil Garg</dc:creator>
      <pubDate>Tue, 20 Jun 2023 17:16:36 +0000</pubDate>
      <link>https://forem.com/epam_india_python/how-we-set-up-gpg-keys-as-environment-variables-2f26</link>
      <guid>https://forem.com/epam_india_python/how-we-set-up-gpg-keys-as-environment-variables-2f26</guid>
      <description>&lt;p&gt;This write up is in continuation of previous talk on Using GPG and Python to Secure files &lt;strong&gt;&lt;a href="https://wearecommunity.io/events/using-python-and-gpg-to-secure-files"&gt;https://wearecommunity.io/events/using-python-and-gpg-to-secure-files&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If new to GPG keys then please go through above recording first.&lt;/p&gt;

&lt;p&gt;Now when you have understood what GPG keys are, we can discuss its usage in projects.&lt;/p&gt;

&lt;p&gt;In application deployments, we might have various environments like DEV, QA, STAG and PROD and there could be more.&lt;br&gt;
And besides these there could be various types of files which will require multiple different GPG keys to enable encryption on them.&lt;/p&gt;

&lt;p&gt;Now, the question is if we need GPG keys to be imported already on a specific environment before we deploy the application on it?&lt;br&gt;
Well, this is one of the ways to import a key but only if we are sure keys will not frequently be changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems with this approach&lt;/strong&gt;&lt;br&gt;
A developer might have a permission to deploy an application on a specific env or this could also be done via CI/CD process. But developer might not have a full permission to import GPG keys.&lt;br&gt;
He now needs another person having permission to import GPG keys. There comes a dependency now. &lt;br&gt;
Every time a developer introduces a new GPG key or key gets changed then this another person having full permission on env will be required to test the newly developed changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How we removed this dependency&lt;/strong&gt;&lt;br&gt;
We need a solution where these keys can be configured like other configurable using environment variables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem while configuring GPG keys as environment variable&lt;/strong&gt;&lt;br&gt;
Firstly let’s look at a sample GPG key:&lt;/p&gt;

&lt;p&gt;-----BEGIN PGP PUBLIC KEY BLOCK-----&lt;/p&gt;

&lt;p&gt;mDMEYr7UeBYJKwYBBAHaRw8BAQdAZceJqna9PlHH1t0QzO1pUk/M/p94UWt2w932&lt;br&gt;
HxBZziq0IVNBUCBVc2VyIDEgPHNhcF91c2VyXzFAYXBwbGUuY29tPoiaBBMWCgBC&lt;br&gt;
FiEElTDqcjvYE2kmvlx2xD2M6blccP4FAmK+1HgCGwMFCQPCZwAFCwkIBwIDIgIB&lt;br&gt;
BhUKCQgLAgQWAgMBAh4HAheAAAoJEMQ9jOm5XHD+1vkBAIgwVNKc9EMAoJUMenUn&lt;br&gt;
L9FdvuL3Yi/Sha+d97FoBp/IAP954uvnkM5UhSZs9/kMgKyiyHM0QrpGUn/Aqz7k&lt;br&gt;
VcvuBLg4BGK+1HgSCisGAQQBl1UBBQEBB0AxD8Hev5OCrbsl1b28iomb76ylnnYg&lt;br&gt;
5IsuuNrzYeRCfwMBCAeIfgQYFgoAJhYhBJUw6nI72BNpJr5cdsQ9jOm5XHD+BQJi&lt;br&gt;
vtR4AhsMBQkDwmcAAAoJEMQ9jOm5XHD+C1kA/2i9r8ojLakCyy/x+n3l3uDPzxzq&lt;br&gt;
ZLzaGSVv9bv9vom4AQC6QPJiNjI6xynWmjXQoxrUY3Oq4CSKmo4iuAgmekGHCA==&lt;br&gt;
=t5iy&lt;br&gt;
-----END PGP PUBLIC KEY BLOCK-----&lt;/p&gt;

&lt;p&gt;As we can see the content of any GPG key is a multiline value and environment variable can have only single line value.&lt;/p&gt;

&lt;p&gt;So we need this multiline to single line solution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multiline to Single line&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Method 1:&lt;/strong&gt;&lt;br&gt;
We can place a separator like \n at the end of each line and can manually make this multiline value into single line.&lt;br&gt;
After this, the Python code which will try to import the GPG keys will first prepare original key by removing \n with carriage return to make it multiline value again.&lt;br&gt;
But we need a person to manually prepare this single line value and can be possibility that content might be changed, and then proper import will not happen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 2:&lt;/strong&gt;&lt;br&gt;
We might take help of base64 utility.&lt;br&gt;
A general command to export a key for sharing purpose is-&lt;br&gt;
gpg --armor --export &lt;/p&gt;

&lt;p&gt;The above command returns the multiline value.&lt;br&gt;
So if we use above command as below&lt;/p&gt;

&lt;p&gt;gpg --armor --export  | base64&lt;/p&gt;

&lt;p&gt;Single line key would look like as below:&lt;br&gt;
LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCgptUUVOQkdRejNYb0JDQURDZURnbXhZZGdXSVJzUFhCVGdxMzM3NEthSWFBZ2tLTzlYZ3dpOWxEQmFaRjNUcDdNCi9rWmxTSHRiODYyWnpnL0pGMjYwN1puK0NEMmI4dDEwLzhQZVFZbmpqOEZMcjFJcndWVjRpY3hGWW5uMXFQU0wKZGpzaDRDeXNxZThVaitmYlFWR25BeDNoSE5wNEwvSlV3NzI5QTFiTlhSVlovNzFQWWx0VWdMNzZETDg5TXY5bgpUMFBJbzE4TDJzZ2JMR1hvUWhFeExPME41cjZQaUMxTDVMeEtQUFl6ajJ6Sm1QeDg0Y2kydENFMjczVmZtWk8vCjd6aE5tWUNvRHZ4MUU4S1oxd203Q3pHZE9MNkwzN1NZd3VmWkZTSm5neHdFK0lkS1BpSXBIRDRYVGxXL3pGV1UKam9LTW5kVHhZQmtsSERTc2gxR3gzb015QWEzdGU2KzNjNUNMQUJFQkFBRzBLR052WVNCMFpYTjBJQ2gwWlhOMApJR3RsZVNrZ1BHTnZZVjkwWlhOMFFHRndjR3hsTG1OdmJUNkpBVkVFRXdFSUFEc1dJUVJrZlVyRXVoWHEvOGoyCmtsTE84d2dWZWhTZ1p3VUNaRFBkZWdJYkF3VUxDUWdIQWdJaUFnWVZDZ2tJQ3dJRUZnSURBUUllQndJWGdBQUsKQ1JETzh3Z1ZlaFNnWjBzWEIvOVc5KzhMWFBSdGtIRjlNQlpYemJHVWVwT3BtOFVzV29lY2p1TDRwNXIreC94dwpjUmVqK05NN3RWNmJMM2dSR0pTbVp1dDJGTnVSMEVGWmdTbnZYbEczbzVUMnJHUlZEMCthWjFMMys4MGNpbTVsCmozZ2E5eEdmUk9TUDE1M2wrdlVXYXo0dUZ4TlBnL25oNEY5YVJLeDExQ0Jlc0hvTGFySzJzYzZUelpHVHpQUlUKR0dGcGNkdkE4NXFJUUdwY2tYZ2hzSmg4U1lFa0ZKRTU4NXBIUVhoRFJuUUlBUXExVlhOOXFHQ1JCQWRCMkptZwpKNHM2VWhaQ0ZNdys2QVBTeUlNT0JHRzdjTlVMQ1NUK29QVXlwOUpsdWNRYXE4K29lTVN3UDVKZURwTmU0ZkQvCi9nVmI3T1FveVNyd1cvL0hFcGRrUUIxY3YrT3JPY2pyZ1FyU0hIUEl1UUVOQkdRejNYb0JDQURjenJCcTBmeUcKeWJ0VlZKZ0dnOHR3WlBUZnRuT05JSE5DWlJYOWdmbldiZG1UbVZDaXN4Sk5VeW9wOGhJNzhPUVZoNE0zYlRlbApGWENTWWZOeHorb1BhMi9ZOVp3Wis4MjNpelJRSnZSZFF6K0Yyd0M1VDJKRjBGSWw4QU9TcmVXZm1mTS9SVTJ5CnZiUks1a3VyL0RaZmkxQytCZEMxR3plNjBJZVRsM1NQSW5WZW1WVXVvWERLTytNQlZkZTFGdEZKaHVDNlFvYjgKYU9rWjhvdTVrL0tCR1p5TkdBeFI0ODN2a3ZxZGswdmpsMmVPWEo0RDQwLzhJK3RYblhKckduWFZ0dnNCc1diawptT3NiVWltS1psUVBjajlLQjNuNzkxUkQ1THA0Wk9uQ0RZbmVqbzNsNlRCcVhjZzVTK2JzdmpHS3oyNjRpNzV3CkNxMlQzUlAyK0lKVEFCRUJBQUdKQVRZRUdBRUlBQ0FXSVFSa2ZVckV1aFhxLzhqMmtsTE84d2dWZWhTZ1p3VUMKWkRQZGVnSWJEQUFLQ1JETzh3Z1ZlaFNnWnp6NENBQzhvR1FwZFBDY1FiU2NjT2FCVEdDcmVpK09RR1RTbjNSVQpGUHJUWlE2RlowMlNUbGlSOVY3Q2hEQlc0djNva0trT3MyTHNkdE1PR0hiazBlZm4wUjIrZytuOWJsaUdFREZjCm00QkhBcDlmaTQ0TTF1QjU2alNSUnBDTkdtNkJ4YzdUdEI3Z1hBWVdBVlM0MzQ5N3NjaDhoTFF5bGxJUHhUZ2wKSXh5Z1pJdG04NGlvZlI0bXZUWVZ4YUhtYXZQa3JCM1BKcTd4Q0pLdStNa1JMbTh4Qjc1RloxN3hoQTNIK1hIbQpIQkZXdzBGN1MvZWdiYWkzTnZIQnRRMG00V2tPVW51M1JZUkZJdDR1WWZweDdjR2x6Q0NXU1pienpzUklST2trCmlJbDNVYlFCWHRES09LOW1oNU5oMDJJS3IxK2hGdkJRVkJzWlk4R3NEcWVBbmtyQmxTb0UKPTN1WkkKLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQo=&lt;/p&gt;

&lt;p&gt;We will get a single line base64 encoded GPG key. &lt;br&gt;
Then in Python code, we may retrieve the original GPG key before we import as below:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;original_multiline_gpg_key = base64.b64decode(gpg_key_base64_encoded)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This way, we removed the dependency from a person who we were requiring just to import any new GPG key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt;&lt;br&gt;
This is a personal blog. The views and opinions expressed here are only those of the author and do not represent those of any organization or any individual with whom the author may be associated, professionally or personally.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
