<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Guix on Gunnar Grop</title>
    <link>/tags/guix/</link>
    <description>Recent content in Guix on Gunnar Grop</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Sat, 15 Aug 2026 11:43:00 +0200</lastBuildDate>
    <atom:link href="/tags/guix/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Trusting CA certificates in Guix System</title>
      <link>/posts/trusting-ca-certificates-in-guix-system/</link>
      <pubDate>Sat, 15 Aug 2026 11:43:00 +0200</pubDate>
      <guid>/posts/trusting-ca-certificates-in-guix-system/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m going to be honest. It took me frankly an embarassing amount of time to&#xA;figure out how I could trust custom CA certificates in Guix System. I&amp;rsquo;ve been using&#xA;it as my main operating system for almost a year at this point, and I only figured&#xA;this out recently.&lt;/p&gt;&#xA;&lt;p&gt;The core of my problem was (apart from not being very good at Scheme or Guix) that&#xA;this wasn&amp;rsquo;t clearly documented anywhere. Mainstream GNU/Linux distros have a clear&#xA;way to do this. Just place the PEM encoded files under &lt;code&gt;/usr/local/share/ca-certificates&lt;/code&gt;&#xA;or &lt;code&gt;/etc/pki/trust/anchors&lt;/code&gt;, or something similar, then run &lt;code&gt;update-ca-certificates&lt;/code&gt;.&#xA;The certificates will then be added to the system wide trust bundle, usually somewhere&#xA;under &lt;code&gt;/etc/ssl/certs&lt;/code&gt;.&#xA;Even Nix, which Guix is originally forked from, has a &lt;a href=&#34;https://wiki.nixos.org/wiki/SSL_Certificates&#34; target=&#34;_blank&#34;&gt;short and very clear article&lt;/a&gt; about&#xA;how to do this.&lt;/p&gt;&#xA;&lt;p&gt;Guix just has this article: &lt;a href=&#34;https://guix.gnu.org/manual/1.5.0/en/html_node/X_002e509-Certificates.html&#34; target=&#34;_blank&#34;&gt;X.509 Certificates&lt;/a&gt;. Nowhere does it say how do actually ensure&#xA;certificates end up in the systems trust bundle. It does mention the &lt;a href=&#34;https://codeberg.org/guix/guix/src/commit/f250e74dd4a4ba2e7f4a62369bf04c1b06756f9c/gnu/packages/nss.scm#L318&#34; target=&#34;_blank&#34;&gt;nss-certs&lt;/a&gt; package, which&#xA;Guix installs by default to provide CA certs from Mozilla.&lt;/p&gt;&#xA;&lt;p&gt;Being quite new to Scheme and Guix, I got way to hung up on this package.&#xA;For some reason I was under the impressions that this package took care of actually generating&#xA;the trust bundle at &lt;code&gt;/etc/ssl/certs/ca-certificates.crt&lt;/code&gt;, which is does not.&#xA;Turns out, I didn&amp;rsquo;t need to care about &lt;a href=&#34;https://codeberg.org/guix/guix/src/commit/f250e74dd4a4ba2e7f4a62369bf04c1b06756f9c/gnu/packages/nss.scm#L318&#34; target=&#34;_blank&#34;&gt;nss-certs&lt;/a&gt; at all.&lt;/p&gt;&#xA;&lt;p&gt;If we look at that file, it should be obvious.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ls -la /etc/ssl/certs/ca-certificates.crt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lrwxrwxrwx &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; root root &lt;span style=&#34;color:#ae81ff&#34;&gt;99&lt;/span&gt;  &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; jan  &lt;span style=&#34;color:#ae81ff&#34;&gt;1970&lt;/span&gt; /etc/ssl/certs/ca-certificates.crt -&amp;gt; /gnu/store/l3y2wisv02pq1qkh6j101crr8bjs0xzr-ca-certificate-bundle/etc/ssl/certs/ca-certificates.crt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s not even part of the nss-certs &lt;code&gt;/gnu/store/&lt;/code&gt; item!&lt;/p&gt;&#xA;&lt;p&gt;Then I found another package, &lt;a href=&#34;https://codeberg.org/guix/guix/src/commit/f250e74dd4a4ba2e7f4a62369bf04c1b06756f9c/gnu/packages/certs.scm#L129&#34; target=&#34;_blank&#34;&gt;le-certs&lt;/a&gt;, a package for installing root and intermediate CA&#xA;certs from Let&amp;rsquo;s Encrypt, and at this point it became quite clear that I&amp;rsquo;d been an idiot.&#xA;Turns out, you can just write a package that ensures some certificates files gets placed&#xA;under &lt;code&gt;/etc/ssl/certs&lt;/code&gt; and create the appropriate hash symlinks with &lt;code&gt;c_rehash&lt;/code&gt;, then Guix&#xA;will make sure those certs end up in the system trust bundle.&lt;/p&gt;&#xA;&lt;p&gt;You can create a package definition anywhere, maybe just in your dotfiles repository, but&#xA;I opted to create an actual &lt;a href=&#34;https://guix.gnu.org/manual/1.5.0/en/html_node/Channels.html&#34; target=&#34;_blank&#34;&gt;channel&lt;/a&gt; since I wanted this package to me installed on both my&#xA;PC&amp;rsquo;s, and on my virtual machines (managed via a different central repository).&lt;/p&gt;&#xA;&lt;p&gt;For reference, here is my Guix channel: &lt;a href=&#34;https://git.sr.ht/~gunnargrop/guix-channel&#34; target=&#34;_blank&#34;&gt;https://git.sr.ht/~gunnargrop/guix-channel&lt;/a&gt;.&#xA;And here is the &lt;code&gt;tree&lt;/code&gt; output:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── COPYING&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── gunnargrop&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── auxillary&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   │   └── ca-certs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   │       ├── gunnar-grop-ca.pem&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   │       └── home-internal-ca.pem&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── packages&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   │   └── pki.scm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── services&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│       └── virtualization.scm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└── README.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here is what &lt;code&gt;(gunnargrop packages pki)&lt;/code&gt; looks like:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;define-module&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;gunnargrop&lt;/span&gt; packages pki)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt;:use-module ((&lt;span style=&#34;color:#a6e22e&#34;&gt;guix&lt;/span&gt; licenses) &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt;:prefix license:)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt;:use-module (&lt;span style=&#34;color:#a6e22e&#34;&gt;guix&lt;/span&gt; build-system trivial)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt;:use-module (&lt;span style=&#34;color:#a6e22e&#34;&gt;guix&lt;/span&gt; packages)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt;:use-module (&lt;span style=&#34;color:#a6e22e&#34;&gt;guix&lt;/span&gt; gexp)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt;:use-module (&lt;span style=&#34;color:#a6e22e&#34;&gt;guix&lt;/span&gt; utils)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt;:use-module (&lt;span style=&#34;color:#a6e22e&#34;&gt;gnu&lt;/span&gt; packages tls)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt;:use-module (&lt;span style=&#34;color:#a6e22e&#34;&gt;gnu&lt;/span&gt; packages perl))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;define-public&lt;/span&gt; grop-certs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;package&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;grop-certs&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (&lt;span style=&#34;color:#a6e22e&#34;&gt;version&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (&lt;span style=&#34;color:#a6e22e&#34;&gt;source&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;#f&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (&lt;span style=&#34;color:#a6e22e&#34;&gt;build-system&lt;/span&gt; trivial-build-system)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (&lt;span style=&#34;color:#a6e22e&#34;&gt;inputs&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;((&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gunnar-grop-root&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;local-file&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;../auxillary/ca-certs/gunnar-grop-ca.pem&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;home-internal-root&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;local-file&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;../auxillary/ca-certs/home-internal-ca.pem&amp;#34;&lt;/span&gt;))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (&lt;span style=&#34;color:#a6e22e&#34;&gt;native-inputs&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (list openssl perl))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (&lt;span style=&#34;color:#a6e22e&#34;&gt;arguments&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a6e22e&#34;&gt;list&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt;:modules &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;((&lt;span style=&#34;color:#a6e22e&#34;&gt;guix&lt;/span&gt; build utils))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt;:builder&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt;~(&lt;span style=&#34;color:#a6e22e&#34;&gt;begin&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#a6e22e&#34;&gt;use-modules&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;guix&lt;/span&gt; build utils))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (&lt;span style=&#34;color:#66d9ef&#34;&gt;let &lt;/span&gt;((&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt; (string-append &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt;$output &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/etc/ssl/certs&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (&lt;span style=&#34;color:#a6e22e&#34;&gt;openssl&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#a6e22e&#34;&gt;assoc-ref&lt;/span&gt; %build-inputs &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;openssl&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (&lt;span style=&#34;color:#a6e22e&#34;&gt;perl&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#a6e22e&#34;&gt;assoc-ref&lt;/span&gt; %build-inputs &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;perl&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (&lt;span style=&#34;color:#a6e22e&#34;&gt;gunnar-grop-root&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;assoc-ref&lt;/span&gt; %build-inputs &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gunnar-grop-root&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (&lt;span style=&#34;color:#a6e22e&#34;&gt;home-internal-root&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;assoc-ref&lt;/span&gt; %build-inputs &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;home-internal-root&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#a6e22e&#34;&gt;mkdir-p&lt;/span&gt; out)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#a6e22e&#34;&gt;for-each&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda &lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;cert&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#a6e22e&#34;&gt;copy-file&lt;/span&gt; cert (string-append out &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                             (&lt;span style=&#34;color:#a6e22e&#34;&gt;strip-store-file-name&lt;/span&gt; cert))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (list gunnar-grop-root&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  home-internal-root))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           &lt;span style=&#34;color:#75715e&#34;&gt;;; Create hash symlinks suitable for OpenSSL (&amp;#39;SSL_CERT_DIR&amp;#39; and&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           &lt;span style=&#34;color:#75715e&#34;&gt;;; similar.)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#a6e22e&#34;&gt;chdir&lt;/span&gt; out)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           (&lt;span style=&#34;color:#a6e22e&#34;&gt;invoke&lt;/span&gt; (string-append perl &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/perl&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (string-append openssl &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/c_rehash&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;)))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (&lt;span style=&#34;color:#a6e22e&#34;&gt;home-page&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://grop.dev&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (&lt;span style=&#34;color:#a6e22e&#34;&gt;synopsis&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Gunnar Grop CA certificates&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (&lt;span style=&#34;color:#a6e22e&#34;&gt;description&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;This package provides a certificate store containing my own&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;root and intermediate CA certificates.&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (&lt;span style=&#34;color:#a6e22e&#34;&gt;license&lt;/span&gt; license:public-domain)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you look at the &lt;a href=&#34;https://codeberg.org/guix/guix/src/commit/f250e74dd4a4ba2e7f4a62369bf04c1b06756f9c/gnu/packages/certs.scm#L129&#34; target=&#34;_blank&#34;&gt;le-certs&lt;/a&gt; package you can see that mine is basically a straight copy.&#xA;The main difference being that my inputs (.pem files) come from local files, instead of being&#xA;downloaded from the internet.&lt;/p&gt;&#xA;&lt;p&gt;Anyway, after adding my own channel to &lt;code&gt;/.config/guix/channels.scm&lt;/code&gt; I just added &lt;code&gt;grop-certs&lt;/code&gt;&#xA;to my systems packages definition:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;use-modules&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;gunnargrop&lt;/span&gt; packages pki))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;; ...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;packages&lt;/span&gt; (append (list curl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        grop-certs)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  %base-packages))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And &lt;em&gt;voilà&lt;/em&gt;! After a system reconfigure my CA certificates are present in the system&#xA;trust bundle, and I can finally use &lt;code&gt;curl&lt;/code&gt; without specifying CA files.&lt;/p&gt;&#xA;&lt;p&gt;I hope whoever reads this finds it helpful, as I know I struggled with this particular part&#xA;of Guix for a long time.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Fontconfig problems with Nix on Guix System</title>
      <link>/posts/fontconfig-problems-with-nix-on-guix-system/</link>
      <pubDate>Mon, 20 Jul 2026 16:49:00 +0200</pubDate>
      <guid>/posts/fontconfig-problems-with-nix-on-guix-system/</guid>
      <description>&lt;p&gt;Since I started using &lt;a href=&#34;https://guix.gnu.org/&#34; target=&#34;_blank&#34;&gt;Guix System&lt;/a&gt; about a year ago, I&amp;rsquo;ve absolutely loved it.&#xA;I can easily say it&amp;rsquo;s my favourite OS out of any I&amp;rsquo;ve used, thus far.&#xA;Although, compared to &lt;a href=&#34;https://nixos.org/&#34; target=&#34;_blank&#34;&gt;Nix&lt;/a&gt; (which Guix is based on), it has comparatively few software packages packaged for it.&#xA;This is no wonder when considering the &lt;a href=&#34;https://search.nixos.org/packages&#34; target=&#34;_blank&#34;&gt;sheer amount of packages&lt;/a&gt; for Nix.&lt;/p&gt;&#xA;&lt;p&gt;Fortunately this &amp;ldquo;problem&amp;rdquo; is easily remedied by just using Nix on Guix System! This is made&#xA;extra easy by using the system service &lt;code&gt;nix-service-type&lt;/code&gt; (&lt;a href=&#34;https://guix.gnu.org/manual/1.5.0/en/html_node/Miscellaneous-Services.html&#34; target=&#34;_blank&#34;&gt;documentation&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Now I use Nix on Guix System, mostly using &lt;a href=&#34;https://github.com/nix-community/home-manager&#34; target=&#34;_blank&#34;&gt;Home Manager&lt;/a&gt;, and for the most parts it works great.&#xA;One of the few problems I&amp;rsquo;ve run into is that graphical programs installed via Nix get the wrong fonts,&#xA;like they couldn&amp;rsquo;t find any fonts and always used a fallback. In this case, &lt;a href=&#34;https://typeof.net/Iosevka/&#34; target=&#34;_blank&#34;&gt;Iosevka&lt;/a&gt;, which I had installed&#xA;with Guix. No matter which font packages I installed, every application would use Iosevka.&lt;/p&gt;&#xA;&lt;p&gt;For example, Firefox (installed via Nix) would log this error whenever started:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Fontconfig error: Cannot load default config file: File not found:&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Turns out that this is a problem with &lt;a href=&#34;https://www.freedesktop.org/wiki/Software/fontconfig/?__goaway_challenge=meta-refresh&amp;amp;__goaway_id=7c20e24f4a4272237f29befdc44945e6&amp;amp;__goaway_referer=https%3A%2F%2Fnoai.duckduckgo.com%2F&#34; target=&#34;_blank&#34;&gt;Fontconfig&lt;/a&gt;. Or rather, that Guix and Nix manages their Fontconfig configs&#xA;differently. Guix System does not set the environment variables &lt;code&gt;FONTCONFIG_FILE&lt;/code&gt; or &lt;code&gt;FONTCONFIG_PATH&lt;/code&gt;,&#xA;which are used by Fontconfig to figure out where configurations are placed. By default, Fontconfig looks&#xA;in the directory &lt;code&gt;/etc/fonts&lt;/code&gt; to find fonts and configs, but this is not where Guix places them. Guix instead&#xA;places font configuration in the active system configuration directory, under &lt;code&gt;/run/current-system/profile&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;So, to fix the font problems with Nix applications, all we have to do is to set the following environment variables:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FONTCONFIG_PATH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/run/current-system/profile/etc/fonts&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FONTCONFIG_FILE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/run/current-system/profile/etc/fonts/fonts.conf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In my case, I opted to do this in my Guix Home configuration, using the &lt;code&gt;home-bash-service-type&lt;/code&gt; service, like so:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;home-environment&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;services&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (append (list (&lt;span style=&#34;color:#a6e22e&#34;&gt;service&lt;/span&gt; home-bash-service-type&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                         (&lt;span style=&#34;color:#a6e22e&#34;&gt;home-bash-configuration&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          (&lt;span style=&#34;color:#a6e22e&#34;&gt;environment-variables&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                           &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;((&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;FONTCONFIG_FILE&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/run/current-system/profile/etc/fonts/fonts.conf&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                             (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;FONTCONFIG_PATH&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/run/current-system/profile/etc/fonts&amp;#34;&lt;/span&gt;)))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          %base-home-services)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But you can set them however you like.&#xA;After the environment variables are set, applications installed with Nix should find your installed fonts.&lt;/p&gt;&#xA;</description>
    </item>
  </channel>
</rss>
