<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>WriteFreely Reader</title>
    <link>https://blogs.linux.pizza</link>
    <description>Read the latest posts from WriteFreely.</description>
    <pubDate>Wed, 29 Apr 2026 16:39:19 +0000</pubDate>
    <item>
      <title>How to issue 7 days certificate with Lets Encrypt and Certbot</title>
      <link>https://blogs.linux.pizza/how-to-issue-7-days-certificate-with-lets-encrypt-and-certbot</link>
      <description>&lt;![CDATA[It is actually pretty simple, for example with NGINX:&#xA;certbot --nginx --required-profile shortlived&#xA;&#xA;As you can see, use the option It can also be used with DNS-validation, the Apache plugin and so on.&#xA;Example, wildcard cert with the Bunny.Net plugin with ECC-certificates:&#xA;certbot certonly --key-type ecdsa --required-profile shortlived --authenticator dns-bunny --dns-bunny-credentials /var/lib/private/bunny.ini -d *.linux.pizza -d linux.pizza&#xA;&#xA;Have fun!&#xA;&#xA;#linux #certbot #letsencrypt]]&gt;</description>
      <content:encoded><![CDATA[<p>It is actually pretty simple, for example with NGINX:</p>

<pre><code>certbot --nginx --required-profile shortlived
</code></pre>

<p>As you can see, use the option <code>--required-profile shortlived</code>.
It can also be used with DNS-validation, the Apache plugin and so on.
Example, wildcard cert with the Bunny.Net plugin with ECC-certificates:</p>

<pre><code>certbot certonly --key-type ecdsa --required-profile shortlived --authenticator dns-bunny --dns-bunny-credentials /var/lib/private/bunny.ini -d *.linux.pizza -d linux.pizza
</code></pre>

<p>Have fun!</p>

<p>#linux #certbot #letsencrypt</p>
]]></content:encoded>
      <author>LinuxPizza</author>
      <guid>https://blogs.linux.pizza/read/a/exwep26ns5</guid>
      <pubDate>Tue, 03 Feb 2026 07:30:55 +0000</pubDate>
    </item>
    <item>
      <title>Secure your API with Client-certificate authenatication in NGINX</title>
      <link>https://blogs.linux.pizza/secure-your-api-with-client-certificate-authenatication-in-nginx</link>
      <description>&lt;![CDATA[After a few hours trying to make it work with my current CA, where the Root is stored offline, AIA, OCSP, CRL and all that stuff is done by the book - I gave up.&#xA;Somehow, the Open Source variant of Nginx does not really like my OCSP setup, no idea why and I have no idea how to troubleshoot that.&#xA;&#xA;Solution? KISS-principle!&#xA;&#xA;I&#39;ll write this down, quick and dirty. But hopefully it helps someone.&#xA;&#xA;Lets start with create the private key for the CA that we will create:&#xA;&#xA;openssl genpkey -algorithm RSA -out CAROOT.key -aes256&#xA;With this command, we have created a private key with AES256. You will be prompted to give a password - write that down.&#xA;And the following command will create a certificate from the private key, valid for 10 years.&#xA;&#xA;openssl req -x509 -new -nodes -key CAROOT.key -sha256 -days 3650 -out CAROOT.crt&#xA;Fill in the information that the above command wants of you, like country-code, and so on.&#xA;After that, your CA is done. The crude, ugly and honestly boring CA. But it&#39;ll work for this usecase.&#xA;&#xA;Let&#39;s create the client-certificate!&#xA;&#xA;First, will start by creating the private.key, and the .csr:&#xA;openssl genpkey -algorithm RSA -out client-cert.key&#xA;openssl req -new -key client.key -out client-cert.csr&#xA;And again, fill out the information wanted by openssl that will populate the .csr. Make it looks pretty.&#xA;Ideally, the commands shall be run on the client only, so the private-key never leaves the client. The .csr is what the CA will need to sign and create a valid certificate.&#xA;&#xA;Bring the .csr to the CA, and sign it:&#xA;&#xA;openssl x509 -req -in client-cert.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client-cert.crt -days 365 -sha256&#xA;This will give you a signed certificate for your client named &#34;client-cert.crt&#34; - you may bring that to the client-machine and install it.&#xA;&#xA;Firefox wants a .pfx:&#xA;&#xA;In order to import the certificate into Firefox, you&#39;ll need to convert it to p12/pfx format:&#xA;openssl pkcs12 -export -out client-cert.pfx -inkey client-cert.key -in client-cert.crt -certfile CAROOT.crt&#xA;Please note, that you&#39;ll need the CAROOT.crt file too that you created.&#xA;&#xA;Configure NGINX to do client-certificate authentication&#xA;&#xA;Navigate to the virtualhost you want to enable client-certificate authentication on, and add the following:&#xA;&#xA;    sslclientcertificate /etc/ssl/private/CAROOT.crt;&#xA;    sslverifyclient on;&#xA;    sslverifydepth 2;&#xA;Please note, that you have to place the CA_ROOT.crt file in &#xA;Restart NGINX and try to visit the site. You&#39;ll probably be asked for permission to use client-certificate authentication.&#xA;&#xA;#linux #openssl #nginx #pki&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>After a few hours trying to make it work with my current CA, where the Root is stored offline, AIA, OCSP, CRL and all that stuff is done by the book – I gave up.
Somehow, the Open Source variant of Nginx does not really like my OCSP setup, no idea why and I have no idea how to troubleshoot that.</p>

<h4 id="solution-kiss-principle" id="solution-kiss-principle">Solution? KISS-principle!</h4>

<p>I&#39;ll write this down, quick and dirty. But hopefully it helps someone.</p>

<p>Lets start with create the private key for the CA that we will create:</p>

<pre><code>openssl genpkey -algorithm RSA -out CA_ROOT.key -aes256
</code></pre>

<p>With this command, we have created a private key with AES256. You will be prompted to give a password – write that down.
And the following command will create a certificate from the private key, valid for 10 years.</p>

<pre><code>openssl req -x509 -new -nodes -key CA_ROOT.key -sha256 -days 3650 -out CA_ROOT.crt
</code></pre>

<p>Fill in the information that the above command wants of you, like country-code, and so on.
After that, your CA is done. The crude, ugly and honestly boring CA. But it&#39;ll work for this usecase.</p>

<h4 id="let-s-create-the-client-certificate" id="let-s-create-the-client-certificate">Let&#39;s create the client-certificate!</h4>

<p>First, will start by creating the private.key, and the .csr:</p>

<pre><code>openssl genpkey -algorithm RSA -out client-cert.key
openssl req -new -key client.key -out client-cert.csr
</code></pre>

<p>And again, fill out the information wanted by openssl that will populate the .csr. Make it looks pretty.
Ideally, the commands shall be run on the client only, so the private-key never leaves the client. The .csr is what the CA will need to sign and create a valid certificate.</p>

<p>Bring the .csr to the CA, and sign it:</p>

<pre><code>openssl x509 -req -in client-cert.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client-cert.crt -days 365 -sha256
</code></pre>

<p>This will give you a signed certificate for your client named “client-cert.crt” – you may bring that to the client-machine and install it.</p>

<h4 id="firefox-wants-a-pfx" id="firefox-wants-a-pfx">Firefox wants a .pfx:</h4>

<p>In order to import the certificate into Firefox, you&#39;ll need to convert it to p12/pfx format:</p>

<pre><code>openssl pkcs12 -export -out client-cert.pfx -inkey client-cert.key -in client-cert.crt -certfile CA_ROOT.crt
</code></pre>

<p>Please note, that you&#39;ll need the CA_ROOT.crt file too that you created.</p>

<h4 id="configure-nginx-to-do-client-certificate-authentication" id="configure-nginx-to-do-client-certificate-authentication">Configure NGINX to do client-certificate authentication</h4>

<p>Navigate to the virtualhost you want to enable client-certificate authentication on, and add the following:</p>

<pre><code>    ssl_client_certificate /etc/ssl/private/CA_ROOT.crt;
    ssl_verify_client on;
    ssl_verify_depth 2;
</code></pre>

<p>Please note, that you have to place the CA_ROOT.crt file in <code>/etc/ssl/private/</code></p>

<p>Restart NGINX and try to visit the site. You&#39;ll probably be asked for permission to use client-certificate authentication.</p>

<p>#linux #openssl #nginx #pki</p>
]]></content:encoded>
      <author>LinuxPizza</author>
      <guid>https://blogs.linux.pizza/read/a/tbqqvwytks</guid>
      <pubDate>Sat, 15 Nov 2025 20:32:09 +0000</pubDate>
    </item>
    <item>
      <title>Linux.Pizza Matrix-server is (re)launching</title>
      <link>https://blogs.linux.pizza/linux-pizza-matrix-server-is-re-launching</link>
      <description>&lt;![CDATA[After 5 years, the Linux.Pizza Matrix-server is relauching. Last time, we housed over 3k active accounts.&#xA;However, 3k active accounts is not something that we aim to achieve this time, but rather - a complement to your social.linux.pizza Mastodon account.&#xA;&#xA;We achieve this by just enabling social.linux.pizza as a OIDC-provider on the matrix-server - the same functionality that already is being used when you authenticate your mobile application.&#xA;&#xA;In order to login with your social.linux.pizza account. Just used the Matrix-client you prefer (Element(X), SchlidiChat/SchlidiChat Next, Cinny or even Thunderbird) - set &#34;synapse.linux.pizza&#34; as your &#34;Homeserver&#34;, and the option to login with social.linux.pizza should appear.&#xA;&#xA;Image showing the login-process to the Linux.Pizza Matrix-server&#xA;&#xA;Image showing the login-process to the Linux.Pizza Matrix-server&#xA;&#xA;Image showing the login-process to the Linux.Pizza Matrix-server&#xA;&#xA;Image showing the login-process to the Linux.Pizza Matrix-server&#xA;&#xA;Worth noting, is that this service will launch as a Beta-service, so every tester is welcome :)]]&gt;</description>
      <content:encoded><![CDATA[<h2 id="after-5-years-the-linux-pizza-matrix-server-is-relauching-last-time-we-housed-over-3k-active-accounts" id="after-5-years-the-linux-pizza-matrix-server-is-relauching-last-time-we-housed-over-3k-active-accounts">After 5 years, the Linux.Pizza Matrix-server is relauching. Last time, we housed over 3k active accounts.</h2>

<h3 id="however-3k-active-accounts-is-not-something-that-we-aim-to-achieve-this-time-but-rather-a-complement-to-your-social-linux-pizza-mastodon-account" id="however-3k-active-accounts-is-not-something-that-we-aim-to-achieve-this-time-but-rather-a-complement-to-your-social-linux-pizza-mastodon-account">However, 3k active accounts is not something that we aim to achieve this time, but rather – a complement to your social.linux.pizza Mastodon account.</h3>

<p>We achieve this by just enabling social.linux.pizza as a OIDC-provider on the matrix-server – the same functionality that already is being used when you authenticate your mobile application.</p>

<p>In order to login with your social.linux.pizza account. Just used the Matrix-client you prefer (Element(X), SchlidiChat/SchlidiChat Next, Cinny or even Thunderbird) – set “synapse.linux.pizza” as your “Homeserver”, and the option to login with social.linux.pizza should appear.</p>

<p><img src="https://pictures.blogs.linux.pizza/matrix/step1.png" alt="Image showing the login-process to the Linux.Pizza Matrix-server" title="Picture1"></p>

<p><img src="https://pictures.blogs.linux.pizza/matrix/step2.png" alt="Image showing the login-process to the Linux.Pizza Matrix-server" title="Picture2"></p>

<p><img src="https://pictures.blogs.linux.pizza/matrix/step3.png" alt="Image showing the login-process to the Linux.Pizza Matrix-server" title="Picture3"></p>

<p><img src="https://pictures.blogs.linux.pizza/matrix/step4.png" alt="Image showing the login-process to the Linux.Pizza Matrix-server" title="Picture4"></p>

<p>Worth noting, is that this service will launch as a Beta-service, so every tester is welcome :)</p>
]]></content:encoded>
      <author>LinuxPizza</author>
      <guid>https://blogs.linux.pizza/read/a/4dn343xhyi</guid>
      <pubDate>Sat, 04 Jan 2025 23:17:35 +0000</pubDate>
    </item>
    <item>
      <title>Enable SNMP on Cisco SG350XG-2F10</title>
      <link>https://blogs.linux.pizza/enable-snmp-on-cisco-sg350xg-2f10</link>
      <description>&lt;![CDATA[Writing this down, so people and myself can easily find this solution&#xA;&#xA;The Cisco docs is incomplete, this is the correct way of enabling SNMP on the SG350 series:&#xA;&#xA;configure term&#xA;snmp-server community public RO&#xA;snmp-server community private RW&#xA;snmp-server server&#xA;snmp-server location hackerspace&#xA;&#xA;Thanks to @fedops@fosstodon.org for telling me about the &#34;snmp-server server&#34; step.&#xA;&#xA;#cisco #networking #switching #snmp #observium]]&gt;</description>
      <content:encoded><![CDATA[<h3 id="writing-this-down-so-people-and-myself-can-easily-find-this-solution" id="writing-this-down-so-people-and-myself-can-easily-find-this-solution">Writing this down, so people and myself can easily find this solution</h3>

<p>The Cisco docs is incomplete, this is the correct way of enabling SNMP on the SG350 series:</p>

<pre><code>configure term
snmp-server community public RO
snmp-server community private RW
snmp-server server
snmp-server location hackerspace
</code></pre>

<p>Thanks to @fedops@fosstodon.org for telling me about the “snmp-server server” step.</p>

<p>#cisco #networking #switching #snmp #observium</p>
]]></content:encoded>
      <author>LinuxPizza</author>
      <guid>https://blogs.linux.pizza/read/a/26seq7hqzc</guid>
      <pubDate>Tue, 09 Apr 2024 07:27:38 +0000</pubDate>
    </item>
    <item>
      <title>Replace the default certificate on a Unifi Dream Router with your own</title>
      <link>https://blogs.linux.pizza/replace-the-default-certificate-on-a-unifi-dream-router-with-your-own</link>
      <description>&lt;![CDATA[I dont claim responsibility for anything being done on your router. This short TODO is written for myself - dont follow if you are not familiar with certificates and PKI.&#xA;&#xA;1  SSH into your machine&#xA;Navigate to Replace Replace Restart  Unifi Core:&#xA;systemctl restart unifi-core&#xA;&#xA;Done!&#xA;A screenshot, showing a valid certificate on udr.selea.se, located on a Unifi Dream Router&#xA;&#xA;#linux #pki #certificates #unifi]]&gt;</description>
      <content:encoded><![CDATA[<h3 id="i-dont-claim-responsibility-for-anything-being-done-on-your-router-this-short-todo-is-written-for-myself-dont-follow-if-you-are-not-familiar-with-certificates-and-pki" id="i-dont-claim-responsibility-for-anything-being-done-on-your-router-this-short-todo-is-written-for-myself-dont-follow-if-you-are-not-familiar-with-certificates-and-pki">I dont claim responsibility for anything being done on your router. This short TODO is written for myself – dont follow if you are not familiar with certificates and PKI.</h3>

<p>1  SSH into your machine
2. Navigate to <code>/data/unifi-core/config</code>
3. Replace <code>unifi-core.key</code> with your private key
4. Replace <code>unifi-core.crt</code> with your TLS-certificate
5. Restart  Unifi Core:</p>

<pre><code>systemctl restart unifi-core
</code></pre>

<p>Done!
<img src="https://pictures.blogs.linux.pizza/misc/udr.png" alt="A screenshot, showing a valid certificate on udr.selea.se, located on a Unifi Dream Router" title="UDR certificate"></p>

<p>#linux #pki #certificates #unifi</p>
]]></content:encoded>
      <author>LinuxPizza</author>
      <guid>https://blogs.linux.pizza/read/a/33w6h8gw4m</guid>
      <pubDate>Sun, 24 Mar 2024 15:51:35 +0000</pubDate>
    </item>
    <item>
      <title>Backing up my AST Advantage! 611s BIOS with a T48 Universal programmer</title>
      <link>https://blogs.linux.pizza/backing-up-my-ast-advantage-611s-bios-with-a-t48-universal-programmer</link>
      <description>&lt;![CDATA[The AST Advantage 611s, the first computer my family got. With a whopping 8MB of RAM and an IBM 5x86 CPU clocked at 100MHz. &#xA;&#xA;We recently managed to get it working again, and came to the conclusion that it would be a good idea to make a backup of the BIOS on the motherboard, since there may not exist too many backups out there.&#xA;&#xA;I ordered a XGecu T48 Universal Programmer with the appropriate adapters for the flash chip for 59$&#xA;If you want to check it out you can find it here: https://xgecu.myshopify.com/products/xgecu-new-t48-tl866-3g-programmer-support-28000-ics-for-spi-nor-nand-flash-emmc-bga-tsop-sop-plcc-9-parts&#xA;&#xA;The T48 is also called TL866-3G and is of course the successor to the popular TL866 universal programmer.&#xA;&#xA;Removing the chip and identifying the model number&#xA;&#xA;Taking a look in the computer, the BIOS flash is located in the PLCC44 socket, but it&#39;s a bit hard to reach so the ISA riser card needs to be removed.&#xA;&#xA;Flash Chip location&#xA;&#xA;A closer look at the chip shows a sticker and a serial number that points back to 94.&#xA;&#xA;Flash Chip sticker&#xA;&#xA;Removing the chip was easy because of the included chip removal tool.&#xA;Just place the hooks in the slots in the corners and press until it pops out.&#xA;&#xA;Flash Chip removal&#xA;&#xA;Now I needed to find out what type of flash chip it really was. But I&#39;d rather not ruin the sticker. So I used a scalpel blade to carefully remove the sticker so I could read the model number. (Pardon for the out of focus photo)&#xA;&#xA;The flash chip model number&#xA;&#xA;A quick google search told me that it was an Intel N28F001BX-T150 1Mbit (128KB) Boot block flash memory.&#xA;&#xA;Reading the flash using Xgpro&#xA;&#xA;IC flashing&#xA;&#xA;The program used for the T48 is the Xgpro. The first thing I did was to make sure the right IC was selected by clicking &#34;Select IC&#34; in the upper left corner.&#xA;&#xA;IC selection&#xA;&#xA;After marking the correct IC and clicking &#34;Select&#34; I clicked on &#34;READ&#34; in the upper toolbar. Now a new window appeared with a picture on how to seat the chip in the adapter and the ZIF socket. After connecting it according to the picture I clicked &#34;Read&#34; and the &#34;BACK&#34;&#xA;&#xA;Read data&#xA;&#xA;Now I could see the data from the chip. Scrolling down a bit, I could find some readable text like a Copyright from 1984 and an AST Research Copyright from 1995. Cool!&#xA;&#xA;Flash dump&#xA;&#xA;After confirming that I got some data from the chip I saved it to a .bin file using the &#34;SAVE&#34; button on the top left.&#xA;&#xA;Save dialog&#xA;&#xA;My plan is to upload the bin file to a site like The Retro Web, this page in particular: https://theretroweb.com/motherboards/s/ast-advantage!-610-611-486-202728-101&#xA;So people can find a copy of the BIOS and easily flash a new one if they ever need to do that.]]&gt;</description>
      <content:encoded><![CDATA[<p>The AST Advantage 611s, the first computer my family got. With a whopping 8MB of RAM and an IBM 5x86 CPU clocked at 100MHz.</p>

<p>We recently managed to get it working again, and came to the conclusion that it would be a good idea to make a backup of the BIOS on the motherboard, since there may not exist too many backups out there.</p>

<p>I ordered a XGecu T48 Universal Programmer with the appropriate adapters for the flash chip for 59$
If you want to check it out you can find it here: <a href="https://xgecu.myshopify.com/products/xgecu-new-t48-tl866-3g-programmer-support-28000-ics-for-spi-nor-nand-flash-emmc-bga-tsop-sop-plcc-9-parts">https://xgecu.myshopify.com/products/xgecu-new-t48-tl866-3g-programmer-support-28000-ics-for-spi-nor-nand-flash-emmc-bga-tsop-sop-plcc-9-parts</a></p>

<p>The T48 is also called TL866-3G and is of course the successor to the popular TL866 universal programmer.</p>

<h3 id="removing-the-chip-and-identifying-the-model-number" id="removing-the-chip-and-identifying-the-model-number">Removing the chip and identifying the model number</h3>

<p>Taking a look in the computer, the BIOS flash is located in the PLCC44 socket, but it&#39;s a bit hard to reach so the ISA riser card needs to be removed.</p>

<p><img src="https://images.bin.linux.pizza/_data/i/upload/2022/12/05/20221205202002-923553f6-la.jpg" alt="Flash Chip location"></p>

<p>A closer look at the chip shows a sticker and a serial number that points back to 94.</p>

<p><img src="https://images.bin.linux.pizza/_data/i/upload/2022/12/05/20221205201957-d0049242-la.jpg" alt="Flash Chip sticker"></p>

<p>Removing the chip was easy because of the included chip removal tool.
Just place the hooks in the slots in the corners and press until it pops out.</p>

<p><img src="https://images.bin.linux.pizza/_data/i/upload/2022/12/05/20221205202007-9ad2aa8d-la.jpg" alt="Flash Chip removal"></p>

<p>Now I needed to find out what type of flash chip it really was. But I&#39;d rather not ruin the sticker. So I used a scalpel blade to carefully remove the sticker so I could read the model number. (Pardon for the out of focus photo)</p>

<p><img src="https://images.bin.linux.pizza/_data/i/upload/2022/12/05/20221205202011-3f01df5a-la.jpg" alt="The flash chip model number"></p>

<p>A quick google search told me that it was an Intel N28F001BX-T150 1Mbit (128KB) Boot block flash memory.</p>

<h3 id="reading-the-flash-using-xgpro" id="reading-the-flash-using-xgpro">Reading the flash using Xgpro</h3>

<p><img src="https://images.bin.linux.pizza/_data/i/upload/2022/12/05/20221205202022-933f6f4d-la.jpg" alt="IC flashing"></p>

<p>The program used for the T48 is the Xgpro. The first thing I did was to make sure the right IC was selected by clicking “Select IC” in the upper left corner.</p>

<p><img src="https://images.bin.linux.pizza/upload/2022/12/05/20221205201901-7c54af84.png" alt="IC selection"></p>

<p>After marking the correct IC and clicking “Select” I clicked on “READ” in the upper toolbar. Now a new window appeared with a picture on how to seat the chip in the adapter and the ZIF socket. After connecting it according to the picture I clicked “Read” and the “BACK”</p>

<p><img src="https://images.bin.linux.pizza/upload/2022/12/05/20221205201901-16194c06.png" alt="Read data"></p>

<p>Now I could see the data from the chip. Scrolling down a bit, I could find some readable text like a Copyright from 1984 and an AST Research Copyright from 1995. Cool!</p>

<p><img src="https://images.bin.linux.pizza/upload/2022/12/05/20221205201902-5091804f.png" alt="Flash dump"></p>

<p>After confirming that I got some data from the chip I saved it to a .bin file using the “SAVE” button on the top left.</p>

<p><img src="https://images.bin.linux.pizza/upload/2022/12/05/20221205204756-c3e0ba8b.png" alt="Save dialog"></p>

<p>My plan is to upload the bin file to a site like The Retro Web, this page in particular: <a href="https://theretroweb.com/motherboards/s/ast-advantage!-610-611-486-202728-101">https://theretroweb.com/motherboards/s/ast-advantage!-610-611-486-202728-101</a>
So people can find a copy of the BIOS and easily flash a new one if they ever need to do that.</p>
]]></content:encoded>
      <author>yeold</author>
      <guid>https://blogs.linux.pizza/read/a/6p36r8glgf</guid>
      <pubDate>Mon, 05 Dec 2022 19:52:33 +0000</pubDate>
    </item>
  </channel>
</rss>