<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>How-To on BuiltWithCaffeine</title><link>https://blog.builtwithcaffeine.cloud/categories/how-to/</link><description>Recent content in How-To on BuiltWithCaffeine</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>- BuiltWithCaffeine</copyright><lastBuildDate>Sun, 03 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.builtwithcaffeine.cloud/categories/how-to/rss.xml" rel="self" type="application/rss+xml"/><item><title>Practical OpenSSL: Essential Commands for SSL Certificate Management</title><link>https://blog.builtwithcaffeine.cloud/posts/openssl-commands-config/</link><pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate><guid>https://blog.builtwithcaffeine.cloud/posts/openssl-commands-config/</guid><description>&lt;p&gt;OpenSSL is an open-source toolkit used to work with TLS/SSL, certificates, keys, and cryptographic operations.&lt;/p&gt;
&lt;p&gt;If you work in DevOps or platform engineering, you don&amp;rsquo;t need to be a full-time PKI specialist to benefit from it. You just need a reliable set of commands you can use when the usual certificate tasks show up.&lt;/p&gt;
&lt;p&gt;In real environments, this comes up more often than people expect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;checking if a certificate is valid or expired&lt;/li&gt;
&lt;li&gt;inspecting certificate details during incident response&lt;/li&gt;
&lt;li&gt;converting certificate formats between teams and tools&lt;/li&gt;
&lt;li&gt;extracting certs and keys from &lt;code&gt;.pfx&lt;/code&gt; files for load balancers, ingress, or app configs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Knowing a few practical OpenSSL commands helps you troubleshoot faster, automate safely, and avoid guesswork when security-related changes are on the critical path.&lt;/p&gt;
&lt;p&gt;This guide keeps it hands-on: copy/paste-ready commands, plain-English explanations, and no crypto gatekeeping.&lt;/p&gt;
&lt;h2 id="openssl-installation"&gt;OpenSSL Installation
&lt;/h2&gt;&lt;p&gt;First up, let&amp;rsquo;s install OpenSSL and make sure your terminal can find it straight away.&lt;/p&gt;
&lt;p&gt;&lt;style&gt;
.code-switcher {
position: relative;
margin: 1.75rem 0;
border: 1px solid var(--card-separator-color);
border-radius: var(--card-border-radius);
background: var(--card-background);
padding: clamp(1rem, 2vw, 1.35rem);
box-shadow: var(--shadow-l1);
transition: box-shadow 0.2s ease, border-color 0.2s ease;
}
.code-switcher:hover {
box-shadow: var(--shadow-l2);
}
[data-scheme="dark"] .code-switcher {
box-shadow: none;
border-color: rgba(255, 255, 255, 0.12);
}
.code-switcher__input {
position: absolute;
opacity: 0;
pointer-events: none;
}
.code-switcher__controls-wrapper {
display: flex;
justify-content: flex-start;
flex: 1 1 auto;
min-width: 0;
overflow-x: auto;
scrollbar-width: none;
-ms-overflow-style: none;
}
.code-switcher__controls-wrapper::-webkit-scrollbar {
display: none;
}
.code-switcher__header {
display: flex;
align-items: flex-start;
justify-content: space-between;
flex-wrap: wrap;
gap: 0.75rem;
margin-bottom: 1rem;
}
.code-switcher__controls {
--switch-count: 2;
--switch-control-font-size: 0.95rem;
--switch-control-line-height: 1.25;
--switch-control-padding-y: 0.5rem;
--switch-control-padding-x: 0.85rem;
--switch-control-radius: calc(var(--card-border-radius) - 6px);
position: relative;
display: inline-flex;
gap: 0.35rem;
padding: 0.35rem;
border-radius: calc(var(--card-border-radius) - 4px);
background: rgba(0, 0, 0, 0.04);
border: 1px solid var(--card-separator-color);
margin-bottom: 0;
flex-wrap: nowrap;
justify-content: flex-start;
white-space: nowrap;
min-width: max-content;
max-width: 100%;
}
[data-scheme="dark"] .code-switcher__controls {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.14);
}
.code-switcher__copy {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.35rem;
padding: 0.4rem 0.8rem;
border-radius: var(--tag-border-radius);
border: 1px solid var(--card-separator-color);
background: var(--card-background);
color: var(--card-text-color-main);
font-weight: 600;
font-size: 0.875rem;
line-height: var(--switch-control-line-height);
cursor: pointer;
min-width: 7.25ch;
margin-left: auto;
align-self: flex-start;
transition: background-color 0.2s ease, color 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}
.code-switcher__copy:focus-visible,
.code-switcher__label:focus-visible {
outline: 2px solid var(--accent-color);
outline-offset: 2px;
}
.code-switcher__copy:hover {
background: var(--card-background-highlight, rgba(0, 0, 0, 0.05));
box-shadow: var(--shadow-l1);
}
[data-scheme="dark"] .code-switcher__copy {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.14);
color: rgba(255, 255, 255, 0.85);
}
[data-scheme="dark"] .code-switcher__copy:hover {
background: rgba(255, 255, 255, 0.16);
color: #fff;
}
.code-switcher__copy:disabled,
.code-switcher__copy[aria-disabled="true"] {
cursor: not-allowed;
opacity: 0.6;
box-shadow: none;
}
.code-switcher__copy.is-success {
background: var(--accent-color);
border-color: var(--accent-color);
color: var(--accent-color-text);
box-shadow: var(--shadow-l2);
}
[data-scheme="dark"] .code-switcher__copy.is-success {
background: var(--accent-color-darker);
border-color: var(--accent-color-darker);
color: #111;
}
.code-switcher__copy.is-error {
background: #c62828;
border-color: #c62828;
color: #fff;
box-shadow: var(--shadow-l2);
}
[data-scheme="dark"] .code-switcher__copy.is-error {
background: #ef5350;
border-color: #ef5350;
color: #111;
}
.code-switcher__slider {
display: none;
}
.code-switcher__label {
display: inline-flex;
flex: 1 1 auto;
justify-content: center;
align-items: center;
min-width: 140px;
padding: var(--switch-control-padding-y) var(--switch-control-padding-x);
border-radius: var(--switch-control-radius);
text-align: center;
font-weight: 600;
color: var(--card-text-color-secondary);
cursor: pointer;
-webkit-user-select: none;
user-select: none;
line-height: var(--switch-control-line-height);
font-size: var(--switch-control-font-size);
transition: color 0.2s ease, background-color 0.2s ease, box-shadow 0.2s ease;
}
[data-scheme="dark"] .code-switcher__label {
color: rgba(255, 255, 255, 0.65);
}
.code-switcher__label:hover {
color: var(--card-text-color-main);
}
[data-scheme="dark"] .code-switcher__label:hover {
color: rgba(255, 255, 255, 0.85);
}
.code-switcher__label .code-switcher__label-title {
display: block;
font-size: 1em;
}
.code-switcher__label .code-switcher__label-subtitle {
display: block;
font-size: 0.72rem;
letter-spacing: 0.04em;
font-weight: 500;
opacity: 0.7;
text-transform: uppercase;
}
.code-switcher__label.is-active {
background: var(--accent-color);
color: var(--accent-color-text);
box-shadow: var(--shadow-l2);
}
[data-scheme="dark"] .code-switcher__label.is-active {
background: var(--accent-color-darker);
color: #111;
box-shadow: none;
}
.code-switcher__label.has-focus {
outline: 2px solid var(--accent-color);
outline-offset: 2px;
}
.code-switcher__panels {
border-radius: calc(var(--card-border-radius) - 4px);
overflow: clip;
}
.code-switcher__panel {
display: none;
border-radius: inherit;
}
.code-switcher__panel.is-active {
display: block;
}
.code-switcher__panel .highlight {
margin: 0;
border-radius: inherit;
position: relative;
overflow-x: auto;
overflow-y: hidden;
-webkit-overflow-scrolling: touch;
scrollbar-width: none;
-ms-overflow-style: none;
}
.code-switcher__panel .highlight::-webkit-scrollbar {
display: none;
}
.code-switcher__panel .highlight .chroma .lntable &gt; tbody &gt; tr &gt; td:last-child {
scrollbar-width: none;
-ms-overflow-style: none;
}
.code-switcher__panel .highlight .chroma .lntable &gt; tbody &gt; tr &gt; td:last-child::-webkit-scrollbar {
display: none;
}
.code-switcher__panel pre {
margin: 0;
padding-block: 0.75rem;
font-family: var(--code-font-family);
background: var(--pre-background-color);
color: var(--pre-text-color);
position: relative;
overflow: visible;
scrollbar-width: none;
-ms-overflow-style: none;
}
.code-switcher__sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.code-switcher__panel pre::-webkit-scrollbar {
display: none;
}
.code-switcher__panel .copyCodeButton {
display: none;
}
.code-switcher:not(.is-ready) .code-switcher__panel {
display: block;
}
@media (max-width: 680px) {
.code-switcher__header {
flex-direction: column;
align-items: stretch;
gap: 0.65rem;
}
.code-switcher__controls {
width: 100%;
justify-content: flex-start;
}
.code-switcher__copy {
align-self: flex-end;
margin-left: 0;
}
.code-switcher__label {
flex: 1 1 100%;
min-width: auto;
}
}
&lt;/style&gt;
&lt;script&gt;
(function () {
if (window.__codeSwitcherLoaded) {
return;
}
window.__codeSwitcherLoaded = true;
var init = function () {
var switchers = document.querySelectorAll('[data-code-switcher]');
if (!switchers.length) {
return;
}
switchers.forEach(function (wrapper) {
var inputs = wrapper.querySelectorAll('.code-switcher__input');
if (!inputs.length) {
return;
}
var labels = wrapper.querySelectorAll('.code-switcher__label');
var panels = wrapper.querySelectorAll('.code-switcher__panel');
var copyButton = wrapper.querySelector('[data-code-switch-copy]');
var statusNode = wrapper.querySelector('[data-code-switch-status]');
var copyLabel = copyButton ? (copyButton.getAttribute('data-copy-label') || copyButton.textContent || 'Copy') : 'Copy';
var copiedLabel = copyButton ? (copyButton.getAttribute('data-copied-label') || 'Copied!') : 'Copied!';
var errorLabel = copyButton ? (copyButton.getAttribute('data-error-label') || 'Error') : 'Error';
var count = inputs.length;
wrapper.style.setProperty('--switch-count', count);
wrapper.classList.add('is-ready');
if (copyButton) {
copyButton.textContent = copyLabel;
}
var activeIndex = 0;
var feedbackTimeout = null;
var setStatus = function (message) {
if (statusNode) {
statusNode.textContent = message || '';
}
};
var setCopyFeedback = function (state) {
if (!copyButton) {
return;
}
if (feedbackTimeout) {
clearTimeout(feedbackTimeout);
feedbackTimeout = null;
}
copyButton.classList.remove('is-success');
copyButton.classList.remove('is-error');
if (state === 'success') {
copyButton.textContent = copiedLabel;
copyButton.classList.add('is-success');
setStatus('Code copied to clipboard');
} else if (state === 'error') {
copyButton.textContent = errorLabel;
copyButton.classList.add('is-error');
setStatus('Unable to copy code to clipboard');
} else {
copyButton.textContent = copyLabel;
setStatus('');
}
if (state === 'success' || state === 'error') {
feedbackTimeout = setTimeout(function () {
copyButton.textContent = copyLabel;
copyButton.classList.remove('is-success');
copyButton.classList.remove('is-error');
setStatus('');
}, 1500);
}
};
var resolveCodeElement = function (panel) {
if (!panel) {
return null;
}
var lineTableCode = panel.querySelector('.chroma .lntable .lntd:last-child code');
if (lineTableCode) {
return lineTableCode;
}
var preferred = panel.querySelectorAll('code[data-lang]');
if (preferred &amp;&amp; preferred.length) {
return preferred[preferred.length - 1];
}
var codeNodes = panel.querySelectorAll('code');
if (codeNodes &amp;&amp; codeNodes.length) {
return codeNodes[codeNodes.length - 1];
}
var preNode = panel.querySelector('pre');
return preNode || null;
};
var activate = function (index) {
wrapper.style.setProperty('--active-index', index);
inputs.forEach(function (input, idx) {
var isActive = idx === index;
input.checked = isActive;
if (labels[idx]) {
labels[idx].classList.toggle('is-active', isActive);
labels[idx].setAttribute('aria-selected', isActive ? 'true' : 'false');
labels[idx].setAttribute('tabindex', isActive ? '0' : '-1');
}
if (panels[idx]) {
panels[idx].classList.toggle('is-active', isActive);
panels[idx].hidden = !isActive;
panels[idx].setAttribute('aria-hidden', isActive ? 'false' : 'true');
}
});
activeIndex = index;
if (copyButton) {
var activePanel = panels[index];
var codeElement = resolveCodeElement(activePanel);
var clipboardAvailable = typeof navigator !== 'undefined' &amp;&amp; navigator.clipboard &amp;&amp; typeof navigator.clipboard.writeText === 'function';
var isDisabled = !codeElement || !clipboardAvailable;
copyButton.disabled = isDisabled;
copyButton.setAttribute('aria-disabled', isDisabled ? 'true' : 'false');
setCopyFeedback('default');
}
};
var current = Array.prototype.findIndex.call(inputs, function (input) {
return input.checked;
});
if (current &lt; 0) {
current = 0;
}
activate(current);
inputs.forEach(function (input, idx) {
input.addEventListener('change', function () {
if (input.checked) {
activate(idx);
}
});
input.addEventListener('focus', function () {
if (labels[idx]) {
labels[idx].classList.add('has-focus');
}
});
input.addEventListener('blur', function () {
if (labels[idx]) {
labels[idx].classList.remove('has-focus');
}
});
});
labels.forEach(function (label, idx) {
label.addEventListener('click', function () {
if (!inputs[idx].checked) {
inputs[idx].checked = true;
inputs[idx].dispatchEvent(new Event('change', { bubbles: true }));
}
});
label.addEventListener('keydown', function (evt) {
if (evt.key === 'ArrowRight' || evt.key === 'ArrowDown') {
evt.preventDefault();
var next = (idx + 1) % count;
inputs[next].focus();
inputs[next].checked = true;
inputs[next].dispatchEvent(new Event('change', { bubbles: true }));
} else if (evt.key === 'ArrowLeft' || evt.key === 'ArrowUp') {
evt.preventDefault();
var prev = (idx - 1 + count) % count;
inputs[prev].focus();
inputs[prev].checked = true;
inputs[prev].dispatchEvent(new Event('change', { bubbles: true }));
} else if (evt.key === 'Home') {
evt.preventDefault();
inputs[0].focus();
inputs[0].checked = true;
inputs[0].dispatchEvent(new Event('change', { bubbles: true }));
} else if (evt.key === 'End') {
evt.preventDefault();
inputs[count - 1].focus();
inputs[count - 1].checked = true;
inputs[count - 1].dispatchEvent(new Event('change', { bubbles: true }));
} else if (evt.key === 'Enter' || evt.key === ' ') {
evt.preventDefault();
if (!inputs[idx].checked) {
inputs[idx].checked = true;
inputs[idx].dispatchEvent(new Event('change', { bubbles: true }));
}
}
});
});
var clipboardSupported = typeof navigator !== 'undefined' &amp;&amp; navigator.clipboard &amp;&amp; typeof navigator.clipboard.writeText === 'function';
if (copyButton &amp;&amp; clipboardSupported) {
copyButton.addEventListener('click', function () {
if (copyButton.disabled) {
return;
}
var activePanel = panels[activeIndex];
if (!activePanel) {
return;
}
var codeElement = resolveCodeElement(activePanel);
if (!codeElement) {
return;
}
var codeText = codeElement.innerText || codeElement.textContent || '';
if (!codeText) {
return;
}
navigator.clipboard.writeText(codeText).then(function () {
setCopyFeedback('success');
}).catch(function () {
setCopyFeedback('error');
});
});
} else if (copyButton) {
copyButton.disabled = true;
copyButton.setAttribute('aria-disabled', 'true');
copyButton.title = 'Clipboard access is not supported in this browser';
}
});
};
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init, { once: true });
} else {
init();
}
})();
&lt;/script&gt;
&lt;div class="code-switcher" id="openssl-install-platform" data-code-switcher="2" data-code-switch-copy="true"&gt;&lt;input type="radio" name="openssl-install-platform-selector" id="openssl-install-platform-option-0" class="code-switcher__input" checked&gt;&lt;input type="radio" name="openssl-install-platform-selector" id="openssl-install-platform-option-1" class="code-switcher__input"&gt;&lt;div class="code-switcher__header"&gt;
&lt;div class="code-switcher__controls-wrapper"&gt;
&lt;div class="code-switcher__controls" role="tablist" aria-label="Code example language tabs"&gt;&lt;label class="code-switcher__label" for="openssl-install-platform-option-0" role="tab" aria-controls="openssl-install-platform-panel-0" aria-selected="true" tabindex="0"&gt;
&lt;span class="code-switcher__label-title"&gt;PowerShell&lt;/span&gt;&lt;/label&gt;&lt;label class="code-switcher__label" for="openssl-install-platform-option-1" role="tab" aria-controls="openssl-install-platform-panel-1" aria-selected="false" tabindex="-1"&gt;
&lt;span class="code-switcher__label-title"&gt;Bash&lt;/span&gt;&lt;/label&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button type="button"
class="code-switcher__copy"
data-code-switch-copy
data-copy-label="Copy"
data-copied-label="Copied!"
data-error-label="Error"
aria-label="Copy current code example"&gt;
Copy
&lt;/button&gt;
&lt;span class="code-switcher__sr-only" data-code-switch-status aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="code-switcher__panels"&gt;&lt;div class="code-switcher__panel" id="openssl-install-platform-panel-0" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Install OpenSSL Package&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="o"&gt;-exact&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-id&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;FireDaemon.OpenSSL&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Reload Environment Paths&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$env:Path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;System.Environment&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;GetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Path&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Machine&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;System.Environment&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;GetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Path&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;User&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Check OpenSSL Version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="code-switcher__panel" id="openssl-install-platform-panel-1" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install OpenSSL Package&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y openssl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Check OpenSSL Version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h2 id="openssl-commands"&gt;OpenSSL Commands
&lt;/h2&gt;&lt;p&gt;The examples below use a local &lt;code&gt;cert-lab&lt;/code&gt; folder so you can test safely before touching real certificates.&lt;/p&gt;
&lt;style type="text/css"&gt;
.box-shortcode {
display: flex;
gap: 0.75em;
padding: 1.6em;
padding-top: 1.4em;
line-height: 1.6;
margin: 1em 0 2em;
border-radius: 8px;
color: #000;
background: #f3ebe850;
align-items: flex-start;
}
[data-scheme="dark"] .box-shortcode {
color: #fff;
background: #333;
}
.box-shortcode.warning { background: #ff6b6b4f; }
.box-shortcode.info { background: #0089e41c; box-shadow: 3px 3px 5px #0089e410; }
.box-shortcode.important { background: #f7ec2c7d; }
.box-shortcode.tip { background: #a3ffa34d; box-shadow: 3px 3px 5px #0089e410; }
.icon-box {
display: inline-flex;
flex: 0 0 auto;
line-height: 1;
align-self: flex-start;
margin-top: 0.2em;
}
.icon-box svg {
height: 1.2em;
width: 1.2em;
fill: currentColor;
}
.box-shortcode .box-body {
flex: 1 1 auto;
min-width: 0;
}
.box-shortcode .box-body &gt; :first-child {
margin-top: 0;
}
.box-shortcode .box-body &gt; :last-child {
margin-bottom: 0;
}
.box-shortcode .sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.box-shortcode :not(pre) &gt; code {
border-radius: 4px;
padding: 0.15em 0.45em;
background: #f1f3f5;
border: 1px solid #e0e4e8;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
font-size: 0.85em;
line-height: 1.25em;
white-space: normal;
display: inline-block;
vertical-align: baseline;
}
.box-shortcode p &gt; code,
.box-shortcode li &gt; code,
.box-shortcode span &gt; code,
.box-shortcode div &gt; code,
.box-shortcode em &gt; code,
.box-shortcode strong &gt; code {
background: #f1f3f5;
border: 1px solid #e0e4e8;
padding: 0.15em 0.45em;
border-radius: 4px;
font-weight: 600;
}
[data-scheme="dark"] .box-shortcode :not(pre) &gt; code {
background: #2d333b;
border-color: #3b424b;
color: #e6edf3;
}
[data-scheme="dark"] .box-shortcode p &gt; code,
[data-scheme="dark"] .box-shortcode li &gt; code,
[data-scheme="dark"] .box-shortcode span &gt; code,
[data-scheme="dark"] .box-shortcode div &gt; code,
[data-scheme="dark"] .box-shortcode em &gt; code,
[data-scheme="dark"] .box-shortcode strong &gt; code {
background: #2d333b;
border-color: #3b424b;
color: #e6edf3;
font-weight: 600;
}
.box-shortcode strong,
.box-shortcode strong code,
.box-shortcode p strong code,
.box-shortcode li strong code {
font-weight: 600 !important;
}
.box-shortcode pre,
.box-shortcode .highlight {
margin: 1em auto;
overflow: hidden;
display: block;
border-radius: 6px;
box-sizing: border-box;
position: relative;
isolation: isolate;
max-width: 100%;
}
.box-shortcode .highlight {
padding-left: 0;
padding-right: 0;
margin-right: 0;
width: 100%;
max-width: 100%;
}
@media (min-width: 1100px) {
.box-shortcode pre,
.box-shortcode .highlight {
max-width: 900px;
}
}
.box-shortcode pre code,
.box-shortcode .highlight pre,
.box-shortcode .highlight code {
display: block;
border-radius: inherit;
background-clip: padding-box;
margin: 0;
}
.box-shortcode .highlight-wrapper {
margin: 1em auto;
border-radius: 6px;
overflow: hidden;
box-sizing: border-box;
isolation: isolate;
max-width: 100%;
}
@media (min-width: 1100px) {
.box-shortcode .highlight-wrapper {
max-width: 900px;
}
}
.box-shortcode .highlight-wrapper .highlight {
border-radius: inherit;
overflow: hidden;
}
.box-shortcode .highlight button.copy {
position: absolute;
top: 0.5em;
right: 0.5em;
z-index: 1;
border-radius: 4px;
}
&lt;/style&gt;
&lt;svg width="0" height="0" display="none" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;symbol id="tip-box" viewBox="0 0 512 512" preserveAspectRatio="xMidYMid meet"&gt;
&lt;path
d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"/&gt;
&lt;/symbol&gt;
&lt;symbol id="important-box" viewBox="0 0 512 512" preserveAspectRatio="xMidYMid meet"&gt;
&lt;path
d="M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zm-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z"/&gt;
&lt;/symbol&gt;
&lt;symbol id="warning-box" viewBox="0 0 576 512" preserveAspectRatio="xMidYMid meet"&gt;
&lt;path
d="M569.517 440.013C587.975 472.007 564.806 512 527.94 512H48.054c-36.937 0-59.999-40.055-41.577-71.987L246.423 23.985c18.467-32.009 64.72-31.951 83.154 0l239.94 416.028zM288 354c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z"/&gt;
&lt;/symbol&gt;
&lt;symbol id="info-box" viewBox="0 0 512 512" preserveAspectRatio="xMidYMid meet"&gt;
&lt;path
d="M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z"/&gt;
&lt;/symbol&gt;
&lt;/svg&gt;&lt;div class="box box-shortcode important" data-variant="important" role="note"&gt;
&lt;span class="icon-box"&gt;
&lt;span class="sr-only"&gt;Important&lt;/span&gt;
&lt;svg&gt;&lt;use href="#important-box"&gt;&lt;/use&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="box-body"&gt;
&lt;p&gt;&lt;strong&gt;IMPORTANT&lt;/strong&gt; &lt;br&gt;
These examples are for local testing and learning only. Don&amp;rsquo;t use self-signed certs in production.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="generate-a-local-test-certificate"&gt;Generate a local test certificate
&lt;/h3&gt;&lt;p&gt;
&lt;div class="code-switcher" id="openssl-generate-local-cert" data-code-switcher="2" data-code-switch-copy="true"&gt;&lt;input type="radio" name="openssl-generate-local-cert-selector" id="openssl-generate-local-cert-option-0" class="code-switcher__input" checked&gt;&lt;input type="radio" name="openssl-generate-local-cert-selector" id="openssl-generate-local-cert-option-1" class="code-switcher__input"&gt;&lt;div class="code-switcher__header"&gt;
&lt;div class="code-switcher__controls-wrapper"&gt;
&lt;div class="code-switcher__controls" role="tablist" aria-label="Code example language tabs"&gt;&lt;label class="code-switcher__label" for="openssl-generate-local-cert-option-0" role="tab" aria-controls="openssl-generate-local-cert-panel-0" aria-selected="true" tabindex="0"&gt;
&lt;span class="code-switcher__label-title"&gt;PowerShell&lt;/span&gt;&lt;/label&gt;&lt;label class="code-switcher__label" for="openssl-generate-local-cert-option-1" role="tab" aria-controls="openssl-generate-local-cert-panel-1" aria-selected="false" tabindex="-1"&gt;
&lt;span class="code-switcher__label-title"&gt;Bash&lt;/span&gt;&lt;/label&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button type="button"
class="code-switcher__copy"
data-code-switch-copy
data-copy-label="Copy"
data-copied-label="Copied!"
data-error-label="Error"
aria-label="Copy current code example"&gt;
Copy
&lt;/button&gt;
&lt;span class="code-switcher__sr-only" data-code-switch-status aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="code-switcher__panels"&gt;&lt;div class="code-switcher__panel" id="openssl-generate-local-cert-panel-0" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Create a local working folder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-Item&lt;/span&gt; &lt;span class="n"&gt;-ItemType&lt;/span&gt; &lt;span class="n"&gt;Directory&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt; &lt;span class="n"&gt;-Force&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Out-Null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Set-Location&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Generate key + self-signed cert (30 days)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="n"&gt;-x509&lt;/span&gt; &lt;span class="n"&gt;-newkey&lt;/span&gt; &lt;span class="n"&gt;rsa&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;2048&lt;/span&gt; &lt;span class="n"&gt;-sha256&lt;/span&gt; &lt;span class="n"&gt;-days&lt;/span&gt; &lt;span class="mf"&gt;30&lt;/span&gt; &lt;span class="n"&gt;-nodes&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-keyout&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;key&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-out&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;crt&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-subj&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/CN=localhost&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-addext&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;subjectAltName=DNS:localhost,IP:127.0.0.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Quick sanity check&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;x509&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;crt&lt;/span&gt; &lt;span class="n"&gt;-noout&lt;/span&gt; &lt;span class="n"&gt;-subject&lt;/span&gt; &lt;span class="n"&gt;-issuer&lt;/span&gt; &lt;span class="n"&gt;-dates&lt;/span&gt; &lt;span class="n"&gt;-ext&lt;/span&gt; &lt;span class="n"&gt;subjectAltName&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="code-switcher__panel" id="openssl-generate-local-cert-panel-1" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Create a local working folder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p ./cert-lab
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ./cert-lab
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Generate key + self-signed cert (30 days)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl req -x509 -newkey rsa:2048 -sha256 -days &lt;span class="m"&gt;30&lt;/span&gt; -nodes &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -keyout localhost.key &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -out localhost.crt &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -subj &lt;span class="s2"&gt;&amp;#34;/CN=localhost&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -addext &lt;span class="s2"&gt;&amp;#34;subjectAltName=DNS:localhost,IP:127.0.0.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Quick sanity check&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl x509 -in localhost.crt -noout -subject -issuer -dates -ext subjectAltName&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h3 id="generate-a-local-test-certificate-pfx"&gt;Generate a local test certificate pfx
&lt;/h3&gt;&lt;p&gt;This is useful when an app, gateway, or platform expects a &lt;code&gt;.pfx/.p12&lt;/code&gt; bundle.&lt;/p&gt;
&lt;p&gt;
&lt;div class="code-switcher" id="openssl-create-pfx" data-code-switcher="2" data-code-switch-copy="true"&gt;&lt;input type="radio" name="openssl-create-pfx-selector" id="openssl-create-pfx-option-0" class="code-switcher__input" checked&gt;&lt;input type="radio" name="openssl-create-pfx-selector" id="openssl-create-pfx-option-1" class="code-switcher__input"&gt;&lt;div class="code-switcher__header"&gt;
&lt;div class="code-switcher__controls-wrapper"&gt;
&lt;div class="code-switcher__controls" role="tablist" aria-label="Code example language tabs"&gt;&lt;label class="code-switcher__label" for="openssl-create-pfx-option-0" role="tab" aria-controls="openssl-create-pfx-panel-0" aria-selected="true" tabindex="0"&gt;
&lt;span class="code-switcher__label-title"&gt;PowerShell&lt;/span&gt;&lt;/label&gt;&lt;label class="code-switcher__label" for="openssl-create-pfx-option-1" role="tab" aria-controls="openssl-create-pfx-panel-1" aria-selected="false" tabindex="-1"&gt;
&lt;span class="code-switcher__label-title"&gt;Bash&lt;/span&gt;&lt;/label&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button type="button"
class="code-switcher__copy"
data-code-switch-copy
data-copy-label="Copy"
data-copied-label="Copied!"
data-error-label="Error"
aria-label="Copy current code example"&gt;
Copy
&lt;/button&gt;
&lt;span class="code-switcher__sr-only" data-code-switch-status aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="code-switcher__panels"&gt;&lt;div class="code-switcher__panel" id="openssl-create-pfx-panel-0" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Create Pfx Certificate file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;pkcs12&lt;/span&gt; &lt;span class="n"&gt;-export&lt;/span&gt; &lt;span class="n"&gt;-out&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;pfx&lt;/span&gt; &lt;span class="n"&gt;-inkey&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;key&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;crt&lt;/span&gt; &lt;span class="n"&gt;-passout&lt;/span&gt; &lt;span class="n"&gt;pass&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ChangeMe123&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Inspect package metadata (no key output)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;pkcs12&lt;/span&gt; &lt;span class="n"&gt;-info&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;pfx&lt;/span&gt; &lt;span class="n"&gt;-noout&lt;/span&gt; &lt;span class="n"&gt;-passin&lt;/span&gt; &lt;span class="n"&gt;pass&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ChangeMe123&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="code-switcher__panel" id="openssl-create-pfx-panel-1" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl pkcs12 -export -out ./cert-lab/localhost.pfx -inkey ./cert-lab/localhost.key -in ./cert-lab/localhost.crt -passout pass:ChangeMe123!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Inspect package metadata (no key output)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl pkcs12 -info -in ./cert-lab/localhost.pfx -noout -passin pass:ChangeMe123!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h3 id="inspect-certificate-details"&gt;Inspect certificate details
&lt;/h3&gt;&lt;p&gt;
&lt;div class="code-switcher" id="openssl-inspect-cert" data-code-switcher="2" data-code-switch-copy="true"&gt;&lt;input type="radio" name="openssl-inspect-cert-selector" id="openssl-inspect-cert-option-0" class="code-switcher__input" checked&gt;&lt;input type="radio" name="openssl-inspect-cert-selector" id="openssl-inspect-cert-option-1" class="code-switcher__input"&gt;&lt;div class="code-switcher__header"&gt;
&lt;div class="code-switcher__controls-wrapper"&gt;
&lt;div class="code-switcher__controls" role="tablist" aria-label="Code example language tabs"&gt;&lt;label class="code-switcher__label" for="openssl-inspect-cert-option-0" role="tab" aria-controls="openssl-inspect-cert-panel-0" aria-selected="true" tabindex="0"&gt;
&lt;span class="code-switcher__label-title"&gt;PowerShell&lt;/span&gt;&lt;/label&gt;&lt;label class="code-switcher__label" for="openssl-inspect-cert-option-1" role="tab" aria-controls="openssl-inspect-cert-panel-1" aria-selected="false" tabindex="-1"&gt;
&lt;span class="code-switcher__label-title"&gt;Bash&lt;/span&gt;&lt;/label&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button type="button"
class="code-switcher__copy"
data-code-switch-copy
data-copy-label="Copy"
data-copied-label="Copied!"
data-error-label="Error"
aria-label="Copy current code example"&gt;
Copy
&lt;/button&gt;
&lt;span class="code-switcher__sr-only" data-code-switch-status aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="code-switcher__panels"&gt;&lt;div class="code-switcher__panel" id="openssl-inspect-cert-panel-0" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;x509&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;crt&lt;/span&gt; &lt;span class="n"&gt;-text&lt;/span&gt; &lt;span class="n"&gt;-noout&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="code-switcher__panel" id="openssl-inspect-cert-panel-1" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl x509 -in ./cert-lab/localhost.crt -text -noout&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h3 id="check-expiry-and-validity-window-quickly"&gt;Check expiry and validity window quickly
&lt;/h3&gt;&lt;p&gt;
&lt;div class="code-switcher" id="openssl-check-expiry" data-code-switcher="2" data-code-switch-copy="true"&gt;&lt;input type="radio" name="openssl-check-expiry-selector" id="openssl-check-expiry-option-0" class="code-switcher__input" checked&gt;&lt;input type="radio" name="openssl-check-expiry-selector" id="openssl-check-expiry-option-1" class="code-switcher__input"&gt;&lt;div class="code-switcher__header"&gt;
&lt;div class="code-switcher__controls-wrapper"&gt;
&lt;div class="code-switcher__controls" role="tablist" aria-label="Code example language tabs"&gt;&lt;label class="code-switcher__label" for="openssl-check-expiry-option-0" role="tab" aria-controls="openssl-check-expiry-panel-0" aria-selected="true" tabindex="0"&gt;
&lt;span class="code-switcher__label-title"&gt;PowerShell&lt;/span&gt;&lt;/label&gt;&lt;label class="code-switcher__label" for="openssl-check-expiry-option-1" role="tab" aria-controls="openssl-check-expiry-panel-1" aria-selected="false" tabindex="-1"&gt;
&lt;span class="code-switcher__label-title"&gt;Bash&lt;/span&gt;&lt;/label&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button type="button"
class="code-switcher__copy"
data-code-switch-copy
data-copy-label="Copy"
data-copied-label="Copied!"
data-error-label="Error"
aria-label="Copy current code example"&gt;
Copy
&lt;/button&gt;
&lt;span class="code-switcher__sr-only" data-code-switch-status aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="code-switcher__panels"&gt;&lt;div class="code-switcher__panel" id="openssl-check-expiry-panel-0" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Show notBefore / notAfter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;x509&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;crt&lt;/span&gt; &lt;span class="n"&gt;-noout&lt;/span&gt; &lt;span class="n"&gt;-dates&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Returns success if cert is valid for at least 30 more days (2,592,000 seconds)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;x509&lt;/span&gt; &lt;span class="n"&gt;-checkend&lt;/span&gt; &lt;span class="mf"&gt;2592000&lt;/span&gt; &lt;span class="n"&gt;-noout&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;crt&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="code-switcher__panel" id="openssl-check-expiry-panel-1" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Show notBefore / notAfter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl x509 -in ./cert-lab/localhost.crt -noout -dates
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Returns success if cert is valid for at least 30 more days (2,592,000 seconds)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl x509 -checkend &lt;span class="m"&gt;2592000&lt;/span&gt; -noout -in ./cert-lab/localhost.crt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h3 id="check-and-validate-a-csr"&gt;Check and validate a CSR
&lt;/h3&gt;&lt;p&gt;Use this before submitting a request to your CA so you can catch mistakes early.&lt;/p&gt;
&lt;p&gt;
&lt;div class="code-switcher" id="openssl-check-csr" data-code-switcher="2" data-code-switch-copy="true"&gt;&lt;input type="radio" name="openssl-check-csr-selector" id="openssl-check-csr-option-0" class="code-switcher__input" checked&gt;&lt;input type="radio" name="openssl-check-csr-selector" id="openssl-check-csr-option-1" class="code-switcher__input"&gt;&lt;div class="code-switcher__header"&gt;
&lt;div class="code-switcher__controls-wrapper"&gt;
&lt;div class="code-switcher__controls" role="tablist" aria-label="Code example language tabs"&gt;&lt;label class="code-switcher__label" for="openssl-check-csr-option-0" role="tab" aria-controls="openssl-check-csr-panel-0" aria-selected="true" tabindex="0"&gt;
&lt;span class="code-switcher__label-title"&gt;PowerShell&lt;/span&gt;&lt;/label&gt;&lt;label class="code-switcher__label" for="openssl-check-csr-option-1" role="tab" aria-controls="openssl-check-csr-panel-1" aria-selected="false" tabindex="-1"&gt;
&lt;span class="code-switcher__label-title"&gt;Bash&lt;/span&gt;&lt;/label&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button type="button"
class="code-switcher__copy"
data-code-switch-copy
data-copy-label="Copy"
data-copied-label="Copied!"
data-error-label="Error"
aria-label="Copy current code example"&gt;
Copy
&lt;/button&gt;
&lt;span class="code-switcher__sr-only" data-code-switch-status aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="code-switcher__panels"&gt;&lt;div class="code-switcher__panel" id="openssl-check-csr-panel-0" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Full CSR details + signature verification&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;csr&lt;/span&gt; &lt;span class="n"&gt;-noout&lt;/span&gt; &lt;span class="n"&gt;-text&lt;/span&gt; &lt;span class="n"&gt;-verify&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Quick subject check&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;csr&lt;/span&gt; &lt;span class="n"&gt;-noout&lt;/span&gt; &lt;span class="n"&gt;-subject&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="code-switcher__panel" id="openssl-check-csr-panel-1" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Full CSR details + signature verification&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl req -in ./cert-lab/request.csr -noout -text -verify
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Quick subject check&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl req -in ./cert-lab/request.csr -noout -subject&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h3 id="decrypt-an-encrypted-private-key-remove-passphrase"&gt;Decrypt an encrypted private key (remove passphrase)
&lt;/h3&gt;&lt;p&gt;Use this when automation or a service account needs a non-interactive key file.&lt;/p&gt;
&lt;div class="box box-shortcode important" data-variant="important" role="note"&gt;
&lt;span class="icon-box"&gt;
&lt;span class="sr-only"&gt;Important&lt;/span&gt;
&lt;svg&gt;&lt;use href="#important-box"&gt;&lt;/use&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="box-body"&gt;
&lt;p&gt;&lt;strong&gt;IMPORTANT&lt;/strong&gt; &lt;br&gt;
A decrypted private key is sensitive. Lock down file permissions and only use where required.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;div class="code-switcher" id="openssl-decrypt-private-key" data-code-switcher="2" data-code-switch-copy="true"&gt;&lt;input type="radio" name="openssl-decrypt-private-key-selector" id="openssl-decrypt-private-key-option-0" class="code-switcher__input" checked&gt;&lt;input type="radio" name="openssl-decrypt-private-key-selector" id="openssl-decrypt-private-key-option-1" class="code-switcher__input"&gt;&lt;div class="code-switcher__header"&gt;
&lt;div class="code-switcher__controls-wrapper"&gt;
&lt;div class="code-switcher__controls" role="tablist" aria-label="Code example language tabs"&gt;&lt;label class="code-switcher__label" for="openssl-decrypt-private-key-option-0" role="tab" aria-controls="openssl-decrypt-private-key-panel-0" aria-selected="true" tabindex="0"&gt;
&lt;span class="code-switcher__label-title"&gt;PowerShell&lt;/span&gt;&lt;/label&gt;&lt;label class="code-switcher__label" for="openssl-decrypt-private-key-option-1" role="tab" aria-controls="openssl-decrypt-private-key-panel-1" aria-selected="false" tabindex="-1"&gt;
&lt;span class="code-switcher__label-title"&gt;Bash&lt;/span&gt;&lt;/label&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button type="button"
class="code-switcher__copy"
data-code-switch-copy
data-copy-label="Copy"
data-copied-label="Copied!"
data-error-label="Error"
aria-label="Copy current code example"&gt;
Copy
&lt;/button&gt;
&lt;span class="code-switcher__sr-only" data-code-switch-status aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="code-switcher__panels"&gt;&lt;div class="code-switcher__panel" id="openssl-decrypt-private-key-panel-0" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Convert encrypted key -&amp;gt; unencrypted key (you will be prompted for the input key passphrase)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;pkey&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;encrypted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;key&lt;/span&gt; &lt;span class="n"&gt;-out&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Optional: confirm key is readable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;pkey&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;key&lt;/span&gt; &lt;span class="n"&gt;-check&lt;/span&gt; &lt;span class="n"&gt;-noout&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="code-switcher__panel" id="openssl-decrypt-private-key-panel-1" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Convert encrypted key -&amp;gt; unencrypted key (you will be prompted for the input key passphrase)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl pkey -in ./cert-lab/encrypted.key -out ./cert-lab/private.key
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Optional: confirm key is readable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl pkey -in ./cert-lab/private.key -check -noout&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h3 id="split-a-pfx-into-leaf-cert-chain-certs-and-private-key"&gt;Split a &lt;code&gt;.pfx&lt;/code&gt; into leaf cert, chain certs, and private key
&lt;/h3&gt;&lt;p&gt;This is one of the most common DevOps tasks when moving certs between systems.&lt;/p&gt;
&lt;p&gt;
&lt;div class="code-switcher" id="openssl-split-pfx" data-code-switcher="2" data-code-switch-copy="true"&gt;&lt;input type="radio" name="openssl-split-pfx-selector" id="openssl-split-pfx-option-0" class="code-switcher__input" checked&gt;&lt;input type="radio" name="openssl-split-pfx-selector" id="openssl-split-pfx-option-1" class="code-switcher__input"&gt;&lt;div class="code-switcher__header"&gt;
&lt;div class="code-switcher__controls-wrapper"&gt;
&lt;div class="code-switcher__controls" role="tablist" aria-label="Code example language tabs"&gt;&lt;label class="code-switcher__label" for="openssl-split-pfx-option-0" role="tab" aria-controls="openssl-split-pfx-panel-0" aria-selected="true" tabindex="0"&gt;
&lt;span class="code-switcher__label-title"&gt;PowerShell&lt;/span&gt;&lt;/label&gt;&lt;label class="code-switcher__label" for="openssl-split-pfx-option-1" role="tab" aria-controls="openssl-split-pfx-panel-1" aria-selected="false" tabindex="-1"&gt;
&lt;span class="code-switcher__label-title"&gt;Bash&lt;/span&gt;&lt;/label&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button type="button"
class="code-switcher__copy"
data-code-switch-copy
data-copy-label="Copy"
data-copied-label="Copied!"
data-error-label="Error"
aria-label="Copy current code example"&gt;
Copy
&lt;/button&gt;
&lt;span class="code-switcher__sr-only" data-code-switch-status aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="code-switcher__panels"&gt;&lt;div class="code-switcher__panel" id="openssl-split-pfx-panel-0" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Create output folder for split artifacts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-Item&lt;/span&gt; &lt;span class="n"&gt;-ItemType&lt;/span&gt; &lt;span class="n"&gt;Directory&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;decompiled&lt;/span&gt; &lt;span class="n"&gt;-Force&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Out-Null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Leaf/end-entity certificate only&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;pkcs12&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;pfx&lt;/span&gt; &lt;span class="n"&gt;-clcerts&lt;/span&gt; &lt;span class="n"&gt;-nokeys&lt;/span&gt; &lt;span class="n"&gt;-out&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;decompiled&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;leaf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;crt&lt;/span&gt; &lt;span class="n"&gt;-passin&lt;/span&gt; &lt;span class="n"&gt;pass&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ChangeMe123&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# CA chain certificates (intermediate/root if present in bundle)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;pkcs12&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;pfx&lt;/span&gt; &lt;span class="n"&gt;-cacerts&lt;/span&gt; &lt;span class="n"&gt;-nokeys&lt;/span&gt; &lt;span class="n"&gt;-out&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;decompiled&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;crt&lt;/span&gt; &lt;span class="n"&gt;-passin&lt;/span&gt; &lt;span class="n"&gt;pass&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ChangeMe123&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Private key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;pkcs12&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;pfx&lt;/span&gt; &lt;span class="n"&gt;-nocerts&lt;/span&gt; &lt;span class="n"&gt;-nodes&lt;/span&gt; &lt;span class="n"&gt;-out&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;decompiled&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;key&lt;/span&gt; &lt;span class="n"&gt;-passin&lt;/span&gt; &lt;span class="n"&gt;pass&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ChangeMe123&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Quick inspect: identify leaf vs chain by Subject/Issuer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;x509&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;decompiled&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;leaf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;crt&lt;/span&gt; &lt;span class="n"&gt;-noout&lt;/span&gt; &lt;span class="n"&gt;-subject&lt;/span&gt; &lt;span class="n"&gt;-issuer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# You now have split outputs in .\cert-lab\decompiled\&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="code-switcher__panel" id="openssl-split-pfx-panel-1" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Create output folder for split artifacts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p ./cert-lab/decompiled
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Leaf/end-entity certificate only&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl pkcs12 -in ./cert-lab/localhost.pfx -clcerts -nokeys -out ./cert-lab/decompiled/leaf.crt -passin pass:ChangeMe123!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# CA chain certificates (intermediate/root if present in bundle)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl pkcs12 -in ./cert-lab/localhost.pfx -cacerts -nokeys -out ./cert-lab/decompiled/chain.crt -passin pass:ChangeMe123!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Private key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl pkcs12 -in ./cert-lab/localhost.pfx -nocerts -nodes -out ./cert-lab/decompiled/private.key -passin pass:ChangeMe123!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Quick inspect: identify leaf vs chain by Subject/Issuer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl x509 -in ./cert-lab/decompiled/leaf.crt -noout -subject -issuer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# You now have split outputs in ./cert-lab/decompiled/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h3 id="verify-that-certificate--csr--private-key-match"&gt;Verify that certificate / CSR / private key match
&lt;/h3&gt;&lt;p&gt;The safest way is to compare a hash of each public key.&lt;/p&gt;
&lt;p&gt;If the hashes are the same, they belong together.&lt;/p&gt;
&lt;p&gt;
&lt;div class="code-switcher" id="openssl-verify-key-pairing" data-code-switcher="2" data-code-switch-copy="true"&gt;&lt;input type="radio" name="openssl-verify-key-pairing-selector" id="openssl-verify-key-pairing-option-0" class="code-switcher__input" checked&gt;&lt;input type="radio" name="openssl-verify-key-pairing-selector" id="openssl-verify-key-pairing-option-1" class="code-switcher__input"&gt;&lt;div class="code-switcher__header"&gt;
&lt;div class="code-switcher__controls-wrapper"&gt;
&lt;div class="code-switcher__controls" role="tablist" aria-label="Code example language tabs"&gt;&lt;label class="code-switcher__label" for="openssl-verify-key-pairing-option-0" role="tab" aria-controls="openssl-verify-key-pairing-panel-0" aria-selected="true" tabindex="0"&gt;
&lt;span class="code-switcher__label-title"&gt;PowerShell&lt;/span&gt;&lt;/label&gt;&lt;label class="code-switcher__label" for="openssl-verify-key-pairing-option-1" role="tab" aria-controls="openssl-verify-key-pairing-panel-1" aria-selected="false" tabindex="-1"&gt;
&lt;span class="code-switcher__label-title"&gt;Bash&lt;/span&gt;&lt;/label&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button type="button"
class="code-switcher__copy"
data-code-switch-copy
data-copy-label="Copy"
data-copied-label="Copied!"
data-error-label="Error"
aria-label="Copy current code example"&gt;
Copy
&lt;/button&gt;
&lt;span class="code-switcher__sr-only" data-code-switch-status aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="code-switcher__panels"&gt;&lt;div class="code-switcher__panel" id="openssl-verify-key-pairing-panel-0" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Cert public key fingerprint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;x509&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;decompiled&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;leaf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;crt&lt;/span&gt; &lt;span class="n"&gt;-noout&lt;/span&gt; &lt;span class="n"&gt;-pubkey&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;pkey&lt;/span&gt; &lt;span class="n"&gt;-pubin&lt;/span&gt; &lt;span class="n"&gt;-outform&lt;/span&gt; &lt;span class="n"&gt;der&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;sha256&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Private key public key fingerprint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;pkey&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;decompiled&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;key&lt;/span&gt; &lt;span class="n"&gt;-pubout&lt;/span&gt; &lt;span class="n"&gt;-outform&lt;/span&gt; &lt;span class="n"&gt;der&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;sha256&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# CSR public key fingerprint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;csr&lt;/span&gt; &lt;span class="n"&gt;-noout&lt;/span&gt; &lt;span class="n"&gt;-pubkey&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;pkey&lt;/span&gt; &lt;span class="n"&gt;-pubin&lt;/span&gt; &lt;span class="n"&gt;-outform&lt;/span&gt; &lt;span class="n"&gt;der&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;sha256&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="code-switcher__panel" id="openssl-verify-key-pairing-panel-1" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Cert public key fingerprint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl x509 -in ./cert-lab/decompiled/leaf.crt -noout -pubkey &lt;span class="p"&gt;|&lt;/span&gt; openssl pkey -pubin -outform der &lt;span class="p"&gt;|&lt;/span&gt; openssl sha256
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Private key public key fingerprint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl pkey -in ./cert-lab/decompiled/private.key -pubout -outform der &lt;span class="p"&gt;|&lt;/span&gt; openssl sha256
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# CSR public key fingerprint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl req -in ./cert-lab/request.csr -noout -pubkey &lt;span class="p"&gt;|&lt;/span&gt; openssl pkey -pubin -outform der &lt;span class="p"&gt;|&lt;/span&gt; openssl sha256&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h2 id="troubleshooting-and-issues"&gt;Troubleshooting and Issues
&lt;/h2&gt;&lt;p&gt;Even when your commands are correct, certificate tasks can fail for non-obvious reasons. Here are the issues that come up most often.&lt;/p&gt;
&lt;h3 id="key-values-mismatch-or-cert-wont-bind-to-service"&gt;&amp;ldquo;Key values mismatch&amp;rdquo; or cert won&amp;rsquo;t bind to service
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; The certificate and private key are from different keypairs. &lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; Compare public key fingerprints from cert and key. They must match.&lt;/p&gt;
&lt;p&gt;
&lt;div class="code-switcher" id="openssl-troubleshoot-key-mismatch" data-code-switcher="2" data-code-switch-copy="true"&gt;&lt;input type="radio" name="openssl-troubleshoot-key-mismatch-selector" id="openssl-troubleshoot-key-mismatch-option-0" class="code-switcher__input" checked&gt;&lt;input type="radio" name="openssl-troubleshoot-key-mismatch-selector" id="openssl-troubleshoot-key-mismatch-option-1" class="code-switcher__input"&gt;&lt;div class="code-switcher__header"&gt;
&lt;div class="code-switcher__controls-wrapper"&gt;
&lt;div class="code-switcher__controls" role="tablist" aria-label="Code example language tabs"&gt;&lt;label class="code-switcher__label" for="openssl-troubleshoot-key-mismatch-option-0" role="tab" aria-controls="openssl-troubleshoot-key-mismatch-panel-0" aria-selected="true" tabindex="0"&gt;
&lt;span class="code-switcher__label-title"&gt;PowerShell&lt;/span&gt;&lt;/label&gt;&lt;label class="code-switcher__label" for="openssl-troubleshoot-key-mismatch-option-1" role="tab" aria-controls="openssl-troubleshoot-key-mismatch-panel-1" aria-selected="false" tabindex="-1"&gt;
&lt;span class="code-switcher__label-title"&gt;Bash&lt;/span&gt;&lt;/label&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button type="button"
class="code-switcher__copy"
data-code-switch-copy
data-copy-label="Copy"
data-copied-label="Copied!"
data-error-label="Error"
aria-label="Copy current code example"&gt;
Copy
&lt;/button&gt;
&lt;span class="code-switcher__sr-only" data-code-switch-status aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="code-switcher__panels"&gt;&lt;div class="code-switcher__panel" id="openssl-troubleshoot-key-mismatch-panel-0" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;x509&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;decompiled&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;leaf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;crt&lt;/span&gt; &lt;span class="n"&gt;-noout&lt;/span&gt; &lt;span class="n"&gt;-pubkey&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;pkey&lt;/span&gt; &lt;span class="n"&gt;-pubin&lt;/span&gt; &lt;span class="n"&gt;-outform&lt;/span&gt; &lt;span class="n"&gt;der&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;sha256&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;pkey&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;decompiled&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;key&lt;/span&gt; &lt;span class="n"&gt;-pubout&lt;/span&gt; &lt;span class="n"&gt;-outform&lt;/span&gt; &lt;span class="n"&gt;der&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;sha256&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="code-switcher__panel" id="openssl-troubleshoot-key-mismatch-panel-1" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl x509 -in ./cert-lab/decompiled/leaf.crt -noout -pubkey &lt;span class="p"&gt;|&lt;/span&gt; openssl pkey -pubin -outform der &lt;span class="p"&gt;|&lt;/span&gt; openssl sha256
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl pkey -in ./cert-lab/decompiled/private.key -pubout -outform der &lt;span class="p"&gt;|&lt;/span&gt; openssl sha256&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h3 id="browserapp-says-hostname-is-invalid"&gt;Browser/app says hostname is invalid
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; The certificate SAN does not include the hostname you&amp;rsquo;re using. &lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; Reissue cert with the correct &lt;code&gt;subjectAltName&lt;/code&gt; values (DNS/IP).&lt;/p&gt;
&lt;p&gt;Quick check:&lt;/p&gt;
&lt;p&gt;
&lt;div class="code-switcher" id="openssl-troubleshoot-san" data-code-switcher="2" data-code-switch-copy="true"&gt;&lt;input type="radio" name="openssl-troubleshoot-san-selector" id="openssl-troubleshoot-san-option-0" class="code-switcher__input" checked&gt;&lt;input type="radio" name="openssl-troubleshoot-san-selector" id="openssl-troubleshoot-san-option-1" class="code-switcher__input"&gt;&lt;div class="code-switcher__header"&gt;
&lt;div class="code-switcher__controls-wrapper"&gt;
&lt;div class="code-switcher__controls" role="tablist" aria-label="Code example language tabs"&gt;&lt;label class="code-switcher__label" for="openssl-troubleshoot-san-option-0" role="tab" aria-controls="openssl-troubleshoot-san-panel-0" aria-selected="true" tabindex="0"&gt;
&lt;span class="code-switcher__label-title"&gt;PowerShell&lt;/span&gt;&lt;/label&gt;&lt;label class="code-switcher__label" for="openssl-troubleshoot-san-option-1" role="tab" aria-controls="openssl-troubleshoot-san-panel-1" aria-selected="false" tabindex="-1"&gt;
&lt;span class="code-switcher__label-title"&gt;Bash&lt;/span&gt;&lt;/label&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button type="button"
class="code-switcher__copy"
data-code-switch-copy
data-copy-label="Copy"
data-copied-label="Copied!"
data-error-label="Error"
aria-label="Copy current code example"&gt;
Copy
&lt;/button&gt;
&lt;span class="code-switcher__sr-only" data-code-switch-status aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="code-switcher__panels"&gt;&lt;div class="code-switcher__panel" id="openssl-troubleshoot-san-panel-0" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;x509&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;decompiled&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;leaf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;crt&lt;/span&gt; &lt;span class="n"&gt;-noout&lt;/span&gt; &lt;span class="n"&gt;-ext&lt;/span&gt; &lt;span class="n"&gt;subjectAltName&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="code-switcher__panel" id="openssl-troubleshoot-san-panel-1" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl x509 -in ./cert-lab/decompiled/leaf.crt -noout -ext subjectAltName&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h3 id="certificate-chain-errors-incomplete-chain--unknown-ca"&gt;Certificate chain errors (incomplete chain / unknown CA)
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; Only leaf cert is deployed, missing intermediate(s). &lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; Deploy full chain in the order your platform expects (usually leaf + intermediate).&lt;/p&gt;
&lt;p&gt;Quick check:&lt;/p&gt;
&lt;p&gt;
&lt;div class="code-switcher" id="openssl-troubleshoot-chain" data-code-switcher="2" data-code-switch-copy="true"&gt;&lt;input type="radio" name="openssl-troubleshoot-chain-selector" id="openssl-troubleshoot-chain-option-0" class="code-switcher__input" checked&gt;&lt;input type="radio" name="openssl-troubleshoot-chain-selector" id="openssl-troubleshoot-chain-option-1" class="code-switcher__input"&gt;&lt;div class="code-switcher__header"&gt;
&lt;div class="code-switcher__controls-wrapper"&gt;
&lt;div class="code-switcher__controls" role="tablist" aria-label="Code example language tabs"&gt;&lt;label class="code-switcher__label" for="openssl-troubleshoot-chain-option-0" role="tab" aria-controls="openssl-troubleshoot-chain-panel-0" aria-selected="true" tabindex="0"&gt;
&lt;span class="code-switcher__label-title"&gt;PowerShell&lt;/span&gt;&lt;/label&gt;&lt;label class="code-switcher__label" for="openssl-troubleshoot-chain-option-1" role="tab" aria-controls="openssl-troubleshoot-chain-panel-1" aria-selected="false" tabindex="-1"&gt;
&lt;span class="code-switcher__label-title"&gt;Bash&lt;/span&gt;&lt;/label&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button type="button"
class="code-switcher__copy"
data-code-switch-copy
data-copy-label="Copy"
data-copied-label="Copied!"
data-error-label="Error"
aria-label="Copy current code example"&gt;
Copy
&lt;/button&gt;
&lt;span class="code-switcher__sr-only" data-code-switch-status aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="code-switcher__panels"&gt;&lt;div class="code-switcher__panel" id="openssl-troubleshoot-chain-panel-0" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;verify&lt;/span&gt; &lt;span class="n"&gt;-CAfile&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;decompiled&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;crt&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;decompiled&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;leaf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;crt&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="code-switcher__panel" id="openssl-troubleshoot-chain-panel-1" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl verify -CAfile ./cert-lab/decompiled/chain.crt ./cert-lab/decompiled/leaf.crt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h3 id="bad-decrypt--mac-verify-failure-when-opening-pfx"&gt;&amp;ldquo;bad decrypt&amp;rdquo; / &amp;ldquo;mac verify failure&amp;rdquo; when opening &lt;code&gt;.pfx&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; Wrong password, corrupted file, or incompatible encoding/transfer. &lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Re-check password source (watch hidden whitespace)&lt;/li&gt;
&lt;li&gt;Re-export PFX from original source if possible&lt;/li&gt;
&lt;li&gt;Re-transfer file in binary-safe mode&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quick check:&lt;/p&gt;
&lt;p&gt;
&lt;div class="code-switcher" id="openssl-troubleshoot-pfx-password" data-code-switcher="2" data-code-switch-copy="true"&gt;&lt;input type="radio" name="openssl-troubleshoot-pfx-password-selector" id="openssl-troubleshoot-pfx-password-option-0" class="code-switcher__input" checked&gt;&lt;input type="radio" name="openssl-troubleshoot-pfx-password-selector" id="openssl-troubleshoot-pfx-password-option-1" class="code-switcher__input"&gt;&lt;div class="code-switcher__header"&gt;
&lt;div class="code-switcher__controls-wrapper"&gt;
&lt;div class="code-switcher__controls" role="tablist" aria-label="Code example language tabs"&gt;&lt;label class="code-switcher__label" for="openssl-troubleshoot-pfx-password-option-0" role="tab" aria-controls="openssl-troubleshoot-pfx-password-panel-0" aria-selected="true" tabindex="0"&gt;
&lt;span class="code-switcher__label-title"&gt;PowerShell&lt;/span&gt;&lt;/label&gt;&lt;label class="code-switcher__label" for="openssl-troubleshoot-pfx-password-option-1" role="tab" aria-controls="openssl-troubleshoot-pfx-password-panel-1" aria-selected="false" tabindex="-1"&gt;
&lt;span class="code-switcher__label-title"&gt;Bash&lt;/span&gt;&lt;/label&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button type="button"
class="code-switcher__copy"
data-code-switch-copy
data-copy-label="Copy"
data-copied-label="Copied!"
data-error-label="Error"
aria-label="Copy current code example"&gt;
Copy
&lt;/button&gt;
&lt;span class="code-switcher__sr-only" data-code-switch-status aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="code-switcher__panels"&gt;&lt;div class="code-switcher__panel" id="openssl-troubleshoot-pfx-password-panel-0" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;pkcs12&lt;/span&gt; &lt;span class="n"&gt;-info&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;pfx&lt;/span&gt; &lt;span class="n"&gt;-noout&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="code-switcher__panel" id="openssl-troubleshoot-pfx-password-panel-1" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl pkcs12 -info -in ./cert-lab/localhost.pfx -noout&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h3 id="unable-to-load-private-key"&gt;&amp;ldquo;unable to load private key&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; Wrong file format, encrypted key without passphrase provided, or key file damage. &lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Try reading with &lt;code&gt;openssl pkey -in ...&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Convert to PKCS#8 if needed&lt;/li&gt;
&lt;li&gt;Confirm the file begins with a valid PEM header (for PEM files)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quick check:&lt;/p&gt;
&lt;p&gt;
&lt;div class="code-switcher" id="openssl-troubleshoot-load-key" data-code-switcher="2" data-code-switch-copy="true"&gt;&lt;input type="radio" name="openssl-troubleshoot-load-key-selector" id="openssl-troubleshoot-load-key-option-0" class="code-switcher__input" checked&gt;&lt;input type="radio" name="openssl-troubleshoot-load-key-selector" id="openssl-troubleshoot-load-key-option-1" class="code-switcher__input"&gt;&lt;div class="code-switcher__header"&gt;
&lt;div class="code-switcher__controls-wrapper"&gt;
&lt;div class="code-switcher__controls" role="tablist" aria-label="Code example language tabs"&gt;&lt;label class="code-switcher__label" for="openssl-troubleshoot-load-key-option-0" role="tab" aria-controls="openssl-troubleshoot-load-key-panel-0" aria-selected="true" tabindex="0"&gt;
&lt;span class="code-switcher__label-title"&gt;PowerShell&lt;/span&gt;&lt;/label&gt;&lt;label class="code-switcher__label" for="openssl-troubleshoot-load-key-option-1" role="tab" aria-controls="openssl-troubleshoot-load-key-panel-1" aria-selected="false" tabindex="-1"&gt;
&lt;span class="code-switcher__label-title"&gt;Bash&lt;/span&gt;&lt;/label&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button type="button"
class="code-switcher__copy"
data-code-switch-copy
data-copy-label="Copy"
data-copied-label="Copied!"
data-error-label="Error"
aria-label="Copy current code example"&gt;
Copy
&lt;/button&gt;
&lt;span class="code-switcher__sr-only" data-code-switch-status aria-live="polite"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="code-switcher__panels"&gt;&lt;div class="code-switcher__panel" id="openssl-troubleshoot-load-key-panel-0" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;pkey&lt;/span&gt; &lt;span class="n"&gt;-in&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;cert-lab&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;decompiled&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;key&lt;/span&gt; &lt;span class="n"&gt;-check&lt;/span&gt; &lt;span class="n"&gt;-noout&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="code-switcher__panel" id="openssl-troubleshoot-load-key-panel-1" role="tabpanel"ZgotmplZ&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl pkey -in ./cert-lab/decompiled/private.key -check -noout&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h3 id="csr-looks-fine-but-issued-cert-is-still-wrong"&gt;CSR looks fine but issued cert is still wrong
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; CA template/profile overrides CSR fields (common in enterprise PKI). &lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; Validate both sides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;inspect CSR before submission&lt;/li&gt;
&lt;li&gt;inspect issued cert after issuance&lt;/li&gt;
&lt;li&gt;compare SAN/subject/key usage/extended key usage&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="wrap-up"&gt;Wrap Up
&lt;/h2&gt;&lt;p&gt;OpenSSL covers a lot of ground, but most day-to-day certificate work comes down to a small set of commands you&amp;rsquo;ll reach for repeatedly — inspecting certs, checking expiry, exporting to &lt;code&gt;.pfx&lt;/code&gt;, splitting bundles, and verifying key pairs.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;cert-lab&lt;/code&gt; setup at the start of this guide gives you a safe place to practice all of it without touching production certificates. Run through the commands, break things intentionally, and get comfortable reading the output before you need it under pressure.&lt;/p&gt;
&lt;p&gt;A few things worth keeping in mind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Always verify a cert/key pair matches before deploying&lt;/li&gt;
&lt;li&gt;Check SANs match the hostname your service is actually using&lt;/li&gt;
&lt;li&gt;When in doubt about a chain error, &lt;code&gt;openssl verify&lt;/code&gt; is your first stop&lt;/li&gt;
&lt;li&gt;Decrypted private keys need tight file permissions — treat them like passwords&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you hit an error not covered here, the output from &lt;code&gt;openssl ... -text -noout&lt;/code&gt; usually gives you enough to work with.&lt;/p&gt;</description></item></channel></rss>