{"id":136681,"date":"2026-04-01T08:00:46","date_gmt":"2026-04-01T08:00:46","guid":{"rendered":"https:\/\/fedoramagazine.org\/?p=42809"},"modified":"2026-04-01T08:00:46","modified_gmt":"2026-04-01T08:00:46","slug":"make-a-private-ca-with-step-ca","status":"publish","type":"post","link":"https:\/\/sickgaming.net\/blog\/2026\/04\/01\/make-a-private-ca-with-step-ca\/","title":{"rendered":"Make a private CA with step-ca"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"127\" src=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/04\/make-a-private-ca-with-step-ca.jpg\" class=\"webfeedsFeaturedVisual wp-post-image\" alt=\"\" style=\"margin: auto;margin-bottom: 5px;max-width: 100%\" \/><\/p>\n<p>In this article you will learn how TLS (Transport Layer Security) and SSH (Secure SHell) use public\/private key-pairs to authenticate web servers you visit and linux machines you log in to. You will also learn how the TLS framework installed by default in mainstream web browsers fails to prevent MITM (Man In The Middle) attacks in critical ways. Then we will walk through setting up a private .FEDORA TLD (Top Level Domain), setting up your own private CA with the smallstep package, and using the acme-tiny package to issue certificates for a website under that private TLD.<\/p>\n<p> <span id=\"more-42809\"><\/span> <\/p>\n<p>I will not cover setting up a simple &#8220;Hello World&#8221; website using your favorite web server packaged with Fedora. This needs to be up and running on HTTP to follow along. For this article, the website will be named hello.fedora.<\/p>\n<p>Sadly, we will also explain how this does not completely solve the MITM problem &#8211; but this is already a big article. <a href=\"#stepbystep\">Click here<\/a> to skip the background and motivation and go directly to the HowTo.<\/p>\n<h2 class=\"wp-block-heading\">How Public Keys Prevent Man-In-The-Middle Attacks<\/h2>\n<p>While NSA director Admiral Bobby revealed that intel agencies were aware of two key, or <a href=\"https:\/\/www.britannica.com\/topic\/public-key-cryptography\" target=\"_blank\" rel=\"noreferrer noopener\">public-key<\/a> cryptography since the 1960s, the first unclassified paper was published by <a href=\"https:\/\/www.britannica.com\/biography\/Whitfield-Diffie\" target=\"_blank\" rel=\"noreferrer noopener\">Whitfield Diffie<\/a> and <a href=\"https:\/\/www.britannica.com\/biography\/Martin-E-Hellman\" target=\"_blank\" rel=\"noreferrer noopener\">Martin E. Hellman<\/a> in 1976. In college, I remember playing with cryptosystems based on the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Knapsack_problem\" target=\"_blank\" rel=\"noreferrer noopener\">knapsack problem<\/a>. These had various vulnerabilities. What revolutionized the field was publication of the <a href=\"https:\/\/www.geeksforgeeks.org\/computer-networks\/rsa-algorithm-cryptography\/\" target=\"_blank\" rel=\"noreferrer noopener\">RSA algorithm<\/a> in 1977. I vividly remember where I sat in the college library when I read the paper. There was some controversy over &#8220;you can&#8217;t patent algorithms&#8221;. However RSA patented their implementation (which is already protected by copyright &#8211; but that is another discussion). Yes, you can whip up a 1 line Perl implementation in a few minutes (we all did) &#8211; but a secure implementation that does not leak the private key through various <a href=\"https:\/\/www.techtarget.com\/searchsecurity\/definition\/side-channel-attack\" target=\"_blank\" rel=\"noreferrer noopener\">side channels<\/a> is NOT trivial.<\/p>\n<p>The original concept of public keys was to look up a recipient&#8217;s pubkey in a directory, and use it to encrypt a message that only the possessor of the corresponding private key can decrypt. This can also be used to <em>authenticate<\/em> a correspondent via a protocol that proves they hold the corresponding private key. The basic idea is to encrypt a random token with a pubkey, the recipient decrypts the token and sends it back encrypted by your pubkey. The details are not trivial. The primary concern is MITM attacks. SSH and TLS support several widely accepted algorithms for authentication and key exchange.<\/p>\n<h3 class=\"wp-block-heading\">The Directory of Pubkeys is Critical<\/h3>\n<p>If you think about it, that &#8220;directory&#8221; is all important. Suppose you have a &#8220;secure&#8221; phone app (without naming names) that uses a public directory to map telephone number to pubkey. Whoever runs that directory can return their own pubkey (likely a different one for each telephone number), decrypt the data, and send it on, re-encrypted to the real pubkey of the intended recipient (and the same for the other direction). I.e. &#8211; the classic MITM attack. This is why such secure applications usually provide a way to verify you have the real pubkey via an in-person meeting or alternate medium.<\/p>\n<p>So how do you know the real pubkey for a secure (https) website? Websites provide a &#8220;certificate&#8221; saying &#8220;this pubkey is for these domain names&#8221; (and other information we are not concerned with here). Well, anyone can create such a certificate &#8211; in fact we will do so in this article &#8211; so how do you know it is truthful? The certificate is &#8220;signed&#8221; by a Certificate Authority (CA). Pubkeys can be used to sign data. For RSA, the basic concept is to compute a secure &#8220;hash&#8221; (e.g. SHA256) of the certificate data, and &#8220;decrypt&#8221; it using the private key of the CA. The signature can be verified by using the pubkey of the CA to &#8220;encrypt&#8221; the result, &#8211; which should match the hash of the signed data. RSA is nice in that decryption and encryption are symmetrical &#8211; <a href=\"https:\/\/en.wikipedia.org\/wiki\/RSA_cryptosystem#Verifying\">verifying a signature<\/a> is the same operation as encrypting the signature to the owner of the privkey for the pubkey . So now, instead of every web user maintaining a private database of pubkeys for domain names, the browser has a list of trusted CAs which sign website certificates after verifying them in some way. In case a private key is compromised, CAs publish a Revocation List (which regular people rarely use) and TLS certificates always have an expiration date.<\/p>\n<p>Note that CAs can certify data other than domain names, like the name of a company or individual. Commercial CAs generally charge a premium for this, but there are also non-profit CAs like <a href=\"http:\/\/cacert.org\">cacert.org<\/a> that certify personal details via in-person meetings.<\/p>\n<h2 class=\"wp-block-heading\">How Mainstream Browsers Know Which CAs to Trust<\/h2>\n<p>Regular Joes (&#8220;normies&#8221;) do not keep track of all this, so where does that &#8220;list of trusted CAs&#8221; come from? Well, there is a <a href=\"https:\/\/cabforum.org\/\">CA and Browser forum<\/a> with representatives from popular browser software makers and commercial CAs. They maintain a list of trusted CAs, and changes are voted on in public meetings with minutes published on their web page. Fedora installs this list in <kbd>\/usr\/share\/pki<\/kbd>. Browsers may have their own copy. Users may add additional trusted CAs to <kbd>\/usr\/share\/pki<\/kbd> or <kbd>\/etc\/pki\/ca-trust<\/kbd> and browsers may have their own way of adding additional trusted CAs.<\/p>\n<p>This all sounds well and good, BUT. The critical flaw could be called <a href=\"https:\/\/www.globalspec.com\/reference\/75483\/203279\/chapter-1-reliability-of-series-systems\" target=\"_blank\" rel=\"noreferrer noopener\">serial reliability<\/a>. The trusted CAs are trusted for any domain. So any trusted CA (including any you add) can forge a certificate for any website. DNS vulnerabilities (cache poisoning and such) are beyond the scope of this article. But we will set up a private CA which you could use to forge any website cert and fool anyone you convince to trust your CA (and can hack their DNS and\/or IP routing). The cabforum is very careful about their list. As part of hostilities, forum CAs stopped certifying .RU domains (ISO TLD for Russia). Russia promptly put up their own national CAs, which anyone can add to their browser trust store. Normies were warned NOT to do this, as the Russian CAs could then forge certs for any domain. But a moment&#8217;s thought reveals that ANY cabforum CA could go &#8220;rogue&#8221; and do the same thing. It only takes one.<\/p>\n<p>There are solutions to this blanket trust problem, but that will require another article. <\/p>\n<h2 class=\"wp-block-heading\" id=\"stepbystep\">Create a private TLD with bind<\/h2>\n<p>For illustration, we will create the .FEDORA TLD. Everyone following along will create a different instance of that TLD, and hostnames under .FEDORA will resolve to different IPs (or NXDOMAIN) depending on whose DNS server you point that TLD at. This was the motivation for creating <a href=\"https:\/\/www.icann.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">ICANN<\/a> &#8211; a worldwide centralized DNS root (list of official TLDs). This provides a consistent namespace at the expense of absolute power (to cancel domains and TLDs) invested in ICANN. Before ICANN, admins all maintained their own DNS root, and periodically updated (manually or automatically) nameservers for well known TLDs like .COM etc. ISO defined an official list of TLDs, including country code TLDs (like .US). That worked well. The problem came with more obscure TLDs like .FREE. Companies trying to be &#8220;cool&#8221; were upset that not all customers got the same IPs for .FREE hostnames. Also admins liked having &#8220;someone else&#8221; maintain the DNS root. Hence, ICANN. There is also <a href=\"https:\/\/opennic.org\" target=\"_blank\" rel=\"noreferrer noopener\">Opennic<\/a> which likewise has &#8220;someone else&#8221; (volunteers) maintain a root zone, with fallback to ICANN, and has its own &#8220;forum&#8221; (existing TLDs vote) to approve new TLDs.<\/p>\n<p>Here is a bind zonefile for .FEDORA:<\/p>\n<pre class=\"wp-block-preformatted\">$TTL 2H<br \/>; hello.fedora<br \/>@ IN SOA ns1 hostadmin.hello.fedora. (<br \/> 2025122600 ; serial<br \/> 1H ; refresh<br \/> 15M ; retry<br \/> 14D ; expire<br \/> 6H ; default_ttl<br \/> )<br \/>@ IN NS ns1.fedora.<br \/>@ IN TXT \"v=spf1 -all\"<br \/>hello IN A\t192.168.100.31<br \/>ns1 IN\tA\t192.168.100.31<br \/>ca IN\tA\t192.168.100.31<\/pre>\n<p>But that was a bait and switch. Setting up DNS for a private TLD is its own article. If you know how to add such a zone to your self hosted DNS &#8211; then do so. For the rest, we&#8217;ll use an even older hostname\/IP map that predates DNS: as root, edit the file <kbd>\/etc\/hosts<\/kbd> on the system you will run step-ca on and append these lines:<\/p>\n<pre class=\"wp-block-preformatted\"># smallstep article<br \/>192.168.100.31\thello.fedora<br \/>192.168.100.31\tca.fedora<\/pre>\n<p>Replace 192.168.100.31 with the IP of the system you are trying all this out on. Step-ca must be able to lookup the <kbd>hello.fedora<\/kbd> hostname it is certifying to do the ACME protocol. We will use the <kbd>\/.well-known\/acme-challenge<\/kbd> method, which does not require real DNS. The system you run <kbd>acme-tiny<\/kbd> on also needs to lookup <kbd>ca.fedora<\/kbd>.<\/p>\n<h2 class=\"wp-block-heading\">Run a private CA with step-ca<\/h2>\n<p>If the smallstep package is still under <a href=\"https:\/\/bugzilla.redhat.com\/show_bug.cgi?id=2418762\" target=\"_blank\" rel=\"noreferrer noopener\">review<\/a> when you read this, you&#8217;ll need to enable the <a href=\"https:\/\/copr.fedorainfracloud.org\/coprs\/build\/9864495\" target=\"_blank\" rel=\"noreferrer noopener\">copr repo<\/a> (otherwise skip this step):<\/p>\n<pre class=\"wp-block-preformatted\">sudo dnf copr enable @fedora-review\/fedora-review-2418762-smallstep<\/pre>\n<h3 class=\"wp-block-heading\">Create root CA<\/h3>\n<p>First, we need to create our root CA. In production, this should be on a separate offline machine. For small operations, the secondary CAs can be automated, and you sign the certificates for these secondaries manually with the root CA. I would keep the root CA password on paper &#8211; can&#8217;t be hacked (but watch out for cameras). Do NOT skip the password for the root CA. Some number of systems will trust that CA for any domain. If the private key leaks, you end up with a situation like <a href=\"https:\/\/krebsonsecurity.com\/2015\/11\/security-bug-in-dell-pcs-shipped-since-815\/\">Dell faced in 2015<\/a>.<\/p>\n<p>Let&#8217;s put the manual root CA in <kbd>\/etc\/pki\/CA<\/kbd> and generate the root cert. Openssl will ask you for a key passwd, and what x509 calls &#8220;subject identifiers&#8221;. I left the state and email blank, and set city to <kbd>Fedora City<\/kbd>, organization to <kbd>Fedora Project<\/kbd>, organizational unit to <kbd>ca<\/kbd>, and common name to <kbd>ca.example.org<\/kbd>. The &#8220;-days 3650&#8221; sets the expiration to 10 years from now. The second command shows the &#8220;Issuer&#8221; information end-users will see when they ask for the issuer in an app like Firefox. The common name should normally be the hostname of the root CA, but it doesn&#8217;t really matter when the root CA is offline &#8211; and example.org is coincidentally offline by convention. <img decoding=\"async\" src=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2026\/04\/make-a-private-ca-with-step-ca.png\" alt=\"\ud83d\ude42\" class=\"wp-smiley\" style=\"height: 1em;max-height: 1em\" \/><\/p>\n<pre class=\"wp-block-preformatted\">$ sudo mkdir \/etc\/pki\/CA<br \/>$ cd \/etc\/pki\/CA<br \/>$ sudo install --mode=644 \/dev\/stdin root_ca.fedora.ext &lt;&lt;EOF<br \/>subjectAltName=DNS:ca.example.org<br \/>subjectKeyIdentifier = hash<br \/>authorityKeyIdentifier = keyid:always,issuer<br \/>basicConstraints = critical, CA:true, pathlen:1<br \/>keyUsage = critical, digitalSignature, cRLSign, keyCertSign<br \/>EOF<br \/>$ sudo mkdir -m 0700 private<br \/>$ sudo openssl req -new -keyout private\/root_ca.key -out root_ca.csr<br \/>...<br \/>$ sudo openssl x509 -req -in root_ca.csr -key private\/root_ca.key -out root_ca.crt -days 3652 -sha256 -extfile root_ca.fedora.ext<br \/>Enter pass phrase for private\/root_ca.key:<br \/>Certificate request self-signature ok<br \/>subject=C=US, L=Fedora City, O=Fedora Project, OU=ca, CN=ca.example.org<\/pre>\n<h3 class=\"wp-block-heading\">Create intermediate certificate and install smallstep<\/h3>\n<p>Then install the smallstep package with <a href=\"https:\/\/github.com\/smallstep\/certificates\" target=\"_blank\" rel=\"noreferrer noopener\">step-ca<\/a> binary and supporting files:<\/p>\n<pre class=\"wp-block-preformatted\">$ sudo dnf install smallstep<\/pre>\n<p>The package installs a skeleton config for a step-ca service in <kbd>\/var\/lib\/step-ca<\/kbd>. Let&#8217;s flesh out the config as step-ca and generate an intermediate cert request (&#8220;csr&#8221;).<\/p>\n<pre class=\"wp-block-preformatted\">$ cd \/var\/lib\/step-ca<br \/>$ sudo -u step-ca bash -l<br \/>$ ls<br \/>certs config db secrets templates<br \/>$ cp \/etc\/pki\/CA\/root_ca.crt certs<br \/>$ openssl req -new -keyout secrets\/intermediate_ca.key -out intermediate_ca.csr<br \/>...<br \/>$ nano config\/ca.json<br \/>$ exit<\/pre>\n<p>Again, openssl will ask for subject identifiers. I used the same as for the root CA, but with the common name <kbd>ca.fedora<\/kbd>. Use your favorite text editor; &#8220;nano&#8221; is beginner friendly. Change <kbd>MYCABAL<\/kbd> to <kbd>FEDORA<\/kbd> and <kbd>ca.mycabal.org<\/kbd> to <kbd>ca.fedora<\/kbd>. If you provided a password for intermediate_ca.key, put it in the &#8220;password&#8221; field of ca.json. <em>Do not set the password in ca.json to the empty string.<\/em> This will make step-ca try to prompt for it at startup &#8211; which is not allowed under systemd, and fails with an error opening <kbd>\/dev\/tty<\/kbd>. For the intermediate cert, the common name is important. Smallstep will auto generate a host cert for &#8220;ca.fedora&#8221; (it is, after all, a certificate authority), and it must match the hostname ACME clients use to sign certs. Now we need to sign the intermediate cert with the root CA. 1825 days is 5 years. Intermediate certs should be shorter lived than the root CA. Not too short, if you are manually resigning the certs.<\/p>\n<pre class=\"wp-block-preformatted\">$ cd \/etc\/pki\/CA<br \/>$ sudo install --mode=644 \/dev\/stdin ca.fedora.ext &lt;&lt; EOF<br \/>subjectAltName=DNS:ca.fedora<br \/>subjectKeyIdentifier = hash<br \/>authorityKeyIdentifier = keyid:always,issuer<br \/>basicConstraints = critical, CA:true, pathlen:0<br \/>keyUsage = critical, digitalSignature, cRLSign, keyCertSign<br \/>EOF<br \/>$ sudo openssl x509 -req -in \/var\/lib\/step-ca\/intermediate_ca.csr -CA root_ca.crt -CAkey private\/root_ca.key -CAcreateserial -out intermediate_ca.crt -days 1825 -sha256 -extfile ca.fedora.ext<br \/>$ sudo -u step-ca cp intermediate_ca.crt \/var\/lib\/step-ca\/certs<br \/>$ sudo systemctl start step-ca<br \/>$ sudo systemctl status step-ca<br \/>...<br \/>Mar 31 15:18:56 test.gathman.org step-ca[2814912]: 2026\/03\/31 15:18:56 Serving HTTPS on :9000 ...<\/pre>\n<h2 class=\"wp-block-heading\">Use httpd to serve hello.fedora web page<\/h2>\n<p>Running a web server was a prerequisite. I&#8217;ll use apache as an example, and hopefully users of nginx and others can translate. First, <kbd>\/etc\/httpd\/conf.d\/hello.conf<\/kbd><\/p>\n<pre class=\"wp-block-preformatted\">&lt;VirtualHost *:80&gt;<br \/>ServerName hello.fedora<br \/>DocumentRoot \"\/var\/www\/html\/hello\"<br \/>#RedirectMatch ^((?!\\\/\\.well-known\\\/).*)$ https:\/\/hello.fedora$1<br \/>&lt;Location \"\/.well-known\/acme-challenge\/\"&gt;<br \/> Options -Indexes<br \/> Order allow,deny<br \/> Allow from all<br \/>&lt;\/Location&gt;<br \/> &lt;Location \"\/\"&gt;<br \/> Options FollowSymLinks Indexes<br \/> Require all granted<br \/> &lt;\/Location&gt;<br \/>&lt;\/VirtualHost&gt;<\/pre>\n<p>The redirect is commented out until we have a signed cert. Assuming httpd is already running, use <kbd>sudo apachectl graceful<\/kbd> to load the changes. Then a simple document in <kbd>\/var\/www\/html\/hello\/index.html<\/kbd><\/p>\n<pre class=\"wp-block-preformatted\">&lt;html&gt;<br \/>\t&lt;head&gt;<br \/> &lt;title&gt; Hello Fedora &lt;\/title&gt;<br \/>\t&lt;\/head&gt;<br \/>\t&lt;body&gt;<br \/> &lt;h1&gt; Hello Fedora! &lt;\/h1&gt;<br \/>\t&lt;\/body&gt;<br \/>&lt;\/html&gt;<\/pre>\n<h2 class=\"wp-block-heading\">Use acme-tiny to sign a TLS cert with step-ca<\/h2>\n<h3 class=\"wp-block-heading\">Add private root CA<\/h3>\n<p>Acme-tiny needs to trust the root CA to use the ACME service. The step-ca service provides a handy API to fetch the root ca:<\/p>\n<pre class=\"wp-block-preformatted\">$ cd \/etc\/pki\/ca-trust\/source\/anchors<br \/>$ sudo curl https:\/\/ca.fedora:9000\/roots.pem -o fedora_ca.crt<br \/>curl: (60) SSL certificate problem: unable to get local issuer certificate<\/pre>\n<p>Ooops! Catch 22. You need the root CA to use the handy API that gets the root CA. So we&#8217;ll have to tell curl to accept the strange root cert. (Or use rsync, cp on the same machine, copy\/paste between terminal windows, or other more secure method.)<\/p>\n<pre class=\"wp-block-preformatted\">$ sudo curl -k https:\/\/ca.fedora:9000\/roots.pem -o fedora_ca.crt\n$ sudo update-ca-trust extract<\/pre>\n<p>Now, we are ready to run acme-tiny. Once again, <kbd>openssl req<\/kbd> will prompt for subject identifiers. The only one browsers care about is Common Name, which should be &#8220;hello.fedora&#8221;. However, users may care about the other fields when they use browser features to inspect certs.<\/p>\n<pre class=\"wp-block-preformatted\">$ sudo dnf install acme-tiny<br \/>$ sudo apachectl graceful<br \/>$ cd \/var\/lib\/acme<br \/>$ sudo -u acme bash -l<br \/>$ ls<br \/>certs csr private<br \/>$ \/usr\/libexec\/acme-tiny\/sign # NOTE: generates account.key if needed<br \/>$ ls private<br \/>account.key<br \/>$ openssl req -new -passout pass:'' -keyout private\/hello.key -out csr\/hello.csr<br \/>$ \/usr\/sbin\/acme_tiny --account-key private\/account.key --csr csr\/hello.csr --acme-dir \/var\/www\/challenges\/ --ca https:\/\/ca.fedora:9000\/acme\/FEDORA &gt;certs\/hello.crt<br \/>$ exit<br \/>$ sudo nano \/etc\/httpd\/conf.d\/hello.conf<\/pre>\n<p>Now uncomment the Redirect Match and append the below SSL virtual host definition to <kbd>hello.conf<\/kbd>. Use <kbd>apachectl graceful<\/kbd> to load the changes.<\/p>\n<pre class=\"wp-block-preformatted\">&lt;VirtualHost *:443&gt;<br \/>ServerName hello.fedora:443<br \/>SSLEngine on<br \/>SSLProtocol all -SSLv2 -SSLv3<br \/>SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA<br \/>DocumentRoot \"\/var\/www\/html\/hello\"<br \/>SSLCertificateFile \/var\/lib\/acme\/certs\/hello.crt<br \/>SSLCACertificateFile \/var\/lib\/acme\/certs\/hello.crt<br \/>SSLCertificateKeyFile \/var\/lib\/acme\/private\/hello.key<br \/>CustomLog logs\/ssl_request_log \\<br \/> \"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \\\"%r\\\" %b\"<br \/> &lt;Location \"\/\"&gt;<br \/> Options FollowSymLinks Indexes<br \/> &lt;\/Location&gt;<br \/>&lt;\/VirtualHost&gt;<\/pre>\n<p>The current acme-tiny package auto-renews certs only for the letsencrypt.org CA. That should be extended soon. Meanwhile, feel free to add something hacky. (I&#8217;ll try to have it lookup tlds in <kbd>\/etc\/sysconfig<\/kbd> or something to get custom CA url.)<\/p>\n<h2 class=\"wp-block-heading\">Use a browser to display the web page<\/h2>\n<p>On the machine with your web browser, you need 2 things: the new root CA and some way to lookup names in the .FEDORA TLD, either by pointing DNS to the server you set up with the private zone, or by appending the lines to <kbd>\/etc\/hosts<\/kbd> for ca.fedora and hello.fedora.<\/p>\n<p>Now the curl should work without <kbd>-k<\/kbd>. And your browser should work to display <a href=\"https:\/\/hello.fedora\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/hello.fedora<\/a>, although you might have to restart it. If it doesn&#8217;t read Fedora ca-trust store on startup, you might need to find an option to import CA on the browser menu.<\/p>\n<pre class=\"wp-block-preformatted\">$ curl https:\/\/hello.fedora<br \/>&lt;html&gt;<br \/>\t&lt;head&gt;<br \/> &lt;title&gt; Hello Fedora &lt;\/title&gt;<br \/>\t&lt;\/head&gt;<br \/>\t&lt;body&gt;<br \/> &lt;h1&gt; Hello Fedora! &lt;\/h1&gt;<br \/>\t&lt;\/body&gt;<br \/>&lt;\/html&gt;<\/pre>\n<p>Now, that your root CA is up and running, don&#8217;t lose sight of what can be done by having it go rogue. Get lots of people to install it so they can access your cool new TLDS. Then start forging certs for arbitrary web sites, and conquer the world!! Bwa! ha! ha! (A future article can address PKCS#11 and restricting how you trust CAs in browsers and other software.)<\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this article you will learn how TLS (Transport Layer Security) and SSH (Secure SHell) use public\/private key-pairs to authenticate web servers you visit and linux machines you log in to. You will also learn how the TLS framework installed by default in mainstream web browsers fails to prevent MITM (Man In The Middle) attacks [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":136682,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48],"tags":[606,45,43,46,47],"class_list":["post-136681","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fedora-os","tag-faqs-and-guides","tag-fedora","tag-for-system-administrators","tag-magazine","tag-news"],"_links":{"self":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts\/136681","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/comments?post=136681"}],"version-history":[{"count":0,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts\/136681\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/media\/136682"}],"wp:attachment":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/media?parent=136681"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/categories?post=136681"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/tags?post=136681"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}