<?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>DEV Community: vibi</title>
    <description>The latest articles on DEV Community by vibi (@mailvibi).</description>
    <link>https://dev.to/mailvibi</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4121292%2F31765eef-1dd7-42dd-bbe7-295497fed104.png</url>
      <title>DEV Community: vibi</title>
      <link>https://dev.to/mailvibi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mailvibi"/>
    <language>en</language>
    <item>
      <title>I Was Tired of Typing OpenSSL Commands. So I Built a Certificate Generator in Rust</title>
      <dc:creator>vibi</dc:creator>
      <pubDate>Fri, 11 Sep 2026 19:34:56 +0000</pubDate>
      <link>https://dev.to/mailvibi/i-was-tired-of-typing-openssl-commands-so-i-built-a-certificate-generator-in-rust-e44</link>
      <guid>https://dev.to/mailvibi/i-was-tired-of-typing-openssl-commands-so-i-built-a-certificate-generator-in-rust-e44</guid>
      <description>&lt;h1&gt;
  
  
  I Was Tired of Typing OpenSSL Commands. So I Built a Certificate Generator in Rust
&lt;/h1&gt;

&lt;p&gt;Generate self-signed TLS certificates directly in your browser — no installation, no server, and your private keys never leave your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔐 Try It First
&lt;/h2&gt;

&lt;h3&gt;
  
  
  👉 &lt;a href="https://mailvibi.github.io/selfsignedcert/" rel="noopener noreferrer"&gt;SelfSignedCert&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Need a certificate right now? Just use it.&lt;/p&gt;

&lt;p&gt;Enter your hostname, add your Subject Alternative Names, choose the expiry, and generate your certificate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No installation. No signup. No OpenSSL commands to remember.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;SelfSignedCert running entirely in the browser.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you just need a certificate, go ahead and use it. If you're curious about how it works, read on.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;If you've ever needed HTTPS for local development or an internal service, you've probably used something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl req &lt;span class="nt"&gt;-x509&lt;/span&gt; &lt;span class="nt"&gt;-newkey&lt;/span&gt; rsa:4096 ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you have to look up the flags again.&lt;/p&gt;

&lt;p&gt;How do I add Subject Alternative Names?&lt;/p&gt;

&lt;p&gt;Why is my browser rejecting the certificate?&lt;/p&gt;

&lt;p&gt;What configuration do I need?&lt;/p&gt;

&lt;p&gt;OpenSSL is incredibly powerful, but creating a simple development certificate can be more complicated than necessary.&lt;/p&gt;

&lt;p&gt;I also wasn't comfortable with sending private-key material to an online certificate-generation service.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;SelfSignedCert&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Make certificate generation easy while keeping the cryptographic operations in the browser.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🔐 Your Private Key Stays in Your Browser
&lt;/h2&gt;

&lt;p&gt;SelfSignedCert uses &lt;strong&gt;Rust compiled to WebAssembly&lt;/strong&gt;. Certificate and key-generation operations happen locally in your browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;              Your Browser
                   │
                   ▼
          Rust + WebAssembly
                   │
          ┌────────┴────────┐
          ▼                 ▼
    Generate Key      Create Certificate
          │                 │
          └────────┬────────┘
                   ▼
              Download PEM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no certificate-generation backend that needs to receive your private key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The browser is the certificate-generation environment.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Subject Alternative Names Made Simple
&lt;/h2&gt;

&lt;p&gt;Modern browsers use &lt;strong&gt;Subject Alternative Names (SANs)&lt;/strong&gt; for hostname verification.&lt;/p&gt;

&lt;p&gt;SelfSignedCert makes SANs easy to configure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;localhost
127.0.0.1
::1
myapp.internal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application distinguishes between DNS names and IP addresses when constructing the certificate.&lt;/p&gt;

&lt;p&gt;No OpenSSL configuration file required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a Local Certificate Authority
&lt;/h2&gt;

&lt;p&gt;The tool also supports creating a &lt;strong&gt;self-signed Certificate Authority (CA)&lt;/strong&gt; and using it to sign certificates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             Root CA
                │
        ┌───────┼───────┐
        ▼       ▼       ▼
     Service  Service  Service
        A        B        C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lets you experiment with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Root CA certificates&lt;/li&gt;
&lt;li&gt;CA-signed certificates&lt;/li&gt;
&lt;li&gt;Certificate chains&lt;/li&gt;
&lt;li&gt;Internal PKI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also specify certificate expiration either as a number of days or as a specific date, making it useful for testing certificate renewal and expiration handling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Rust + WebAssembly?
&lt;/h2&gt;

&lt;p&gt;The core implementation is written in &lt;strong&gt;Rust&lt;/strong&gt; and compiled to &lt;strong&gt;WebAssembly&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It uses cryptographic and certificate-related crates including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;p256&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ecdsa&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x509-cert&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Certificate generation uses &lt;strong&gt;NIST P-256 (secp256r1)&lt;/strong&gt; with &lt;strong&gt;ECDSA + SHA-256&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The generated certificates are intended to work with common TLS software such as OpenSSL, Go's &lt;code&gt;crypto/tls&lt;/code&gt;, Nginx, and Envoy.&lt;/p&gt;

&lt;p&gt;WebAssembly allows the Rust implementation to run directly in the browser without requiring a native installation or a certificate-generation server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source
&lt;/h2&gt;

&lt;p&gt;SelfSignedCert is open source.&lt;/p&gt;

&lt;p&gt;You can inspect the implementation, build it yourself, self-host it, or contribute improvements.&lt;/p&gt;

&lt;p&gt;For security-related tooling, I think being able to see how the software works is important.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 30-Second Workflow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://mailvibi.github.io/selfsignedcert/" rel="noopener noreferrer"&gt;SelfSignedCert&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Enter your hostname, for example &lt;code&gt;localhost&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add your SANs, such as &lt;code&gt;127.0.0.1&lt;/code&gt; and &lt;code&gt;::1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Choose the certificate expiration.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Generate&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Download the PEM files.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No OpenSSL command to remember.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No installation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No private-key upload.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Give It a Try
&lt;/h2&gt;

&lt;p&gt;If you've ever searched for an OpenSSL command just to generate a certificate for &lt;code&gt;localhost&lt;/code&gt;, this might save you a few minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔐 &lt;a href="https://mailvibi.github.io/selfsignedcert/" rel="noopener noreferrer"&gt;Generate a certificate with SelfSignedCert →&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Free to use. Runs in your browser. No private-key upload.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;Some ideas for future improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More certificate configuration options&lt;/li&gt;
&lt;li&gt;Additional key algorithms&lt;/li&gt;
&lt;li&gt;Certificate inspection&lt;/li&gt;
&lt;li&gt;Certificate-chain visualization&lt;/li&gt;
&lt;li&gt;Additional PKI workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is open source, so feedback and contributions are welcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;I didn't build SelfSignedCert because OpenSSL is bad. OpenSSL is incredibly powerful.&lt;/p&gt;

&lt;p&gt;I built it because &lt;strong&gt;sometimes powerful isn't the same as convenient&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When I'm setting up HTTPS for a local project, I want to spend my time working on the project — not remembering certificate-generation syntax.&lt;/p&gt;

&lt;p&gt;Rust + WebAssembly made it possible to build a different kind of certificate-generation workflow:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A simple UI on top of local cryptographic operations.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you just need a certificate, give it a try:&lt;/p&gt;

&lt;h3&gt;
  
  
  👉 &lt;a href="https://mailvibi.github.io/selfsignedcert/" rel="noopener noreferrer"&gt;SelfSignedCert&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Happy securing! 🔒&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>webassembly</category>
      <category>security</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
