<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Technically Paying It Forward]]></title><description><![CDATA[There are countless tech blogs and resources on the web that have provided me with great insights and solutions. Now it's my turn to, technically, pay it forward]]></description><link>https://www.abobwhite.com/</link><image><url>https://www.abobwhite.com/favicon.png</url><title>Technically Paying It Forward</title><link>https://www.abobwhite.com/</link></image><generator>Ghost 4.29</generator><lastBuildDate>Sun, 26 Apr 2026 19:21:35 GMT</lastBuildDate><atom:link href="https://www.abobwhite.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[SSH Keys: Know Your Format]]></title><description><![CDATA[<p>Near the end of 2018, I was working on a project in which we had to generate <a href="https://www.ssh.com/ssh/key/">ssh keys</a> dynamically in code to be used in connecting to a number of remote servers. At some point, this stopped working and it was hard to figure out why. The public and</p>]]></description><link>https://www.abobwhite.com/ssh-keys-know-your-format/</link><guid isPermaLink="false">5c091d4f3df9ab000180e3c1</guid><category><![CDATA[Security]]></category><category><![CDATA[SSH]]></category><dc:creator><![CDATA[Alexander R White]]></dc:creator><pubDate>Sun, 02 Jun 2019 17:18:59 GMT</pubDate><media:content url="https://www.abobwhite.com/content/images/2019/06/ssh.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.abobwhite.com/content/images/2019/06/ssh.jpg" alt="SSH Keys: Know Your Format"><p>Near the end of 2018, I was working on a project in which we had to generate <a href="https://www.ssh.com/ssh/key/">ssh keys</a> dynamically in code to be used in connecting to a number of remote servers. At some point, this stopped working and it was hard to figure out why. The public and private keys were being created, stored, and used in the right places, however, we constantly saw <code>Permission denied (publickey)</code> showing up in our logs. It was perplexing what had worked fine for months seemingly randomly stopped working. But in the world of software engineering, nothing is ever random.</p><p>Like any good software engineering team, we tried to break down the issue to pinpoint the problem spot.</p><ul><li>Can we reproduce it locally? &#x221A;</li><li>Does it happen on each team member&apos;s machine? &#x221A;</li><li>Can we manually generate an ssh key, add the public key to the remote server, and connect to it with the private key via normal <code>ssh</code> methods? &#x221A;</li><li>Is our manual usage the same as in the running app? Hmmm....</li></ul><p>As we took a closer look and started breaking down our assumptions, we noticed a very important detail. The keys that had <em>worked</em> in the past all had began with:</p><p><code>-----BEGIN RSA PRIVATE KEY-----</code></p><p>...but our <strong><em>new</em></strong> keys all began with:</p><p><code>-----BEGIN OPENSSH PRIVATE KEY-----</code> (!!!)</p><h2 id="ssh-key-format">SSH Key Format</h2><p>We came to find out that the default format for <a href="https://man.openbsd.org/ssh-keygen.1">ssh-keygen</a> (OpenSSH) had recently changed to something proprietary and was no longer compatible with a library we were using to connect to remote servers. The &quot;key&quot; for us to get an ssh key that worked with our solution, was to use the, now legacy, <code>PEM</code> (Privacy Enhanced Mail) format. Here is the command to do it:</p><p><code>ssh-keygen -m PEM</code></p><p>This change is described in the <a href="https://www.openssh.com/releasenotes.html">OpenSSH release notes</a> for v7.8 on 8-24-2018:</p><blockquote><a href="https://man.openbsd.org/ssh-keygen.1">ssh-keygen(1)</a>: write OpenSSH format private keys by default instead of using OpenSSL&apos;s PEM format. The OpenSSH format, supported in OpenSSH releases since 2014 and described in the PROTOCOL.key file in the source distribution, offers substantially better protection against offline password guessing and supports key comments in private keys. If necessary, it is possible to write old PEM-style keys by adding &quot;-m PEM&quot; to ssh-keygen&apos;s arguments when generating or updating a key.</blockquote><p>Food for thought: this is where integration and end-to-end testing provides a lot of value. Upgrading versions of operating systems, dependencies, etc. might not show immediate side effects with day-to-day work or unit tests. Testing the whole system, in detail, would have yielded this problem earlier and helped us pinpoint &quot;what changed&quot; without as much digging.</p>]]></content:encoded></item><item><title><![CDATA[Paying It Forward]]></title><description><![CDATA[<p>Throughout history, there have been countless advances in all aspects of life. Generation after generation people have passed along what they have learned and accomplished to their family, friends, and neighbors. Without those exchanges of wisdom, this very article would likely not be written. We can find at the core</p>]]></description><link>https://www.abobwhite.com/paying-it-forward/</link><guid isPermaLink="false">5b9b087d570f650001a5447d</guid><category><![CDATA[General]]></category><dc:creator><![CDATA[Alexander R White]]></dc:creator><pubDate>Sat, 15 Sep 2018 12:36:21 GMT</pubDate><media:content url="https://www.abobwhite.com/content/images/2018/09/AlexWhite.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.abobwhite.com/content/images/2018/09/AlexWhite.jpg" alt="Paying It Forward"><p>Throughout history, there have been countless advances in all aspects of life. Generation after generation people have passed along what they have learned and accomplished to their family, friends, and neighbors. Without those exchanges of wisdom, this very article would likely not be written. We can find at the core of nearly every aspect of life a rabbit hole of how it came to be - Who developed it? Who thought of it? Where does it come from? How was it inspired? What was it built on? And what was THAT built on? etc. In one form or another, society has &quot;paid it forward&quot; over and over again; continually sharing the what, where, how, and why of ideas, manufactures, and methods.</p><p>There is no shortage of paying it forward it the tech world. There are numerous websites, forums, and blogs from which to pull material, read documentation, and to ask questions. Some of my favorites, and the most commonly used by my peers, include <a href="https://stackoverflow.com">stackoverflow.com</a>, <a href="https://css-tricks.com">css-tricks.com</a>, <a href="https://baeldung.com">baeldung.com</a>, <a href="https://github.com">github.com</a>, <a href="https://scotch.io/">scotch.io</a>, <a href="https://dzone.com/">dzone.com</a>, and countless <a href="https://medium.com/">Medium</a> blogs. And that doesn&apos;t scratch the surface. To top it off, there are decades of goodwill in the form of open-source software that have enabled an explosion of capability. All of which I have benefited from in my software career.</p><p>It is because of the benefit that I have started this blog; as a way to &quot;technically&quot; pay it forward (pun intended). Over the past couple of years I have felt the need to share what I have learned. After enduring, on many occasions, hours of frustration trying to get something working, it typically ends by spinning around in my chair with both fists pumped high in success like a double Judd Nelson from The Breakfast Club.</p><!--kg-card-begin: html--><div style="text-align: center"><img style="display: inline" src="https://www.abobwhite.com/content/images/2018/09/breakfast-club-punch-judd-nelson.gif" alt="Paying It Forward"></div><!--kg-card-end: html--><p>I reached that nirvana due to others paying it forward. And now it&apos;s time for me to do so. I plan to write posts that include useful code and configuration nuggets and full solutions to a broad spectrum of software related topics including, but not limited to:</p><ul><li><strong>Languages: </strong>JavaScript, TypeScript, Java, Groovy, C#, C++ and undoubtably, over time, others</li><li><strong>Front-end web development</strong>: HTML, CSS, App Frameworks and Libraries</li><li><strong>API development: </strong>RESTful Web Services, HATEOAS, Microservice Design, Spring, NodeJS</li><li><strong>Software Engineering: </strong>Data Modeling, SOLID Principles, Abstraction, Architecture Patterns</li><li><strong>Testing</strong>: Unit, Integration, and Functional tools, runners and libraries</li><li><strong>CI/CD: </strong>Jenkins and others</li><li><strong>Cloud Hosting, Containerization and Orchestration</strong>: Docker, Docker Compose, Kubernetes, Google Cloud Platform, AWS</li></ul><p>You might be interested in this blog if you&apos;re:</p><ul><li>a middle or high school kid trying to figure out how to just <em>run</em> that little line of code that you saw in a tutorial where all the details were skipped and assumed you already knew the prerequisites<strong>.</strong></li><li>that college student who wants to learn how functions and classes of your unrealistic coding assignments apply to the &quot;real world&quot;<strong>.</strong></li><li>wondering how your pet project prototype can be built into a reliable, maintainable, and affordably hosted app.</li><li>looking for solutions to common problems due to lacking documentation and examples.</li><li>a software engineering expert who wants to critique my posts, challenge solutions, and tell me how wrong I am (constructively, I hope)<strong>.</strong></li></ul><p>I hope you find value in these posts and will consider, in turn, <em>paying it forward</em>.</p>]]></content:encoded></item></channel></rss>