<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fakhrulhilal M</title>
    <description>The latest articles on DEV Community by Fakhrulhilal M (@fakhrulhilal).</description>
    <link>https://dev.to/fakhrulhilal</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F129924%2F56fcd649-5f4b-4f93-994d-3d33f0c26e26.png</url>
      <title>DEV Community: Fakhrulhilal M</title>
      <link>https://dev.to/fakhrulhilal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fakhrulhilal"/>
    <language>en</language>
    <item>
      <title>Applying CI/CD for classic ASP project</title>
      <dc:creator>Fakhrulhilal M</dc:creator>
      <pubDate>Thu, 29 Jul 2021 09:00:29 +0000</pubDate>
      <link>https://dev.to/fakhrulhilal/applying-ci-cd-for-classic-asp-project-1c0h</link>
      <guid>https://dev.to/fakhrulhilal/applying-ci-cd-for-classic-asp-project-1c0h</guid>
      <description>&lt;p&gt;A new challenge to add CI/CD support for classic ASP. You might be wondering why I take care of classic ASP project for nowadays😂. But I believe one of you know the reason already😁. Classic ASP project doesn't have configuration system by default. It used to store in ordinary ASP file and place anything in VBscript variables, f.e. config.asp. Fortunately, they used to store in centralized place, so we don't have to scan all configurations in many files.&lt;br&gt;
So the basic idea is simple, introduce placeholder format and replace it before deploying. Let's use &lt;code&gt;#PLACEHOLDER#&lt;/code&gt; as an example. I prefer to use all caps so I can pay attention easily what needed to be changed. See example below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vb"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;

&lt;span class="k"&gt;Dim&lt;/span&gt; &lt;span class="nv"&gt;cfgSocials&lt;/span&gt;
&lt;span class="k"&gt;Set&lt;/span&gt; &lt;span class="n"&gt;cfgSocials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Scripting.Dictionary"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cfgSocials&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt; &lt;span class="s"&gt;"github"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"#SOCIAL_GITHUB#"&lt;/span&gt;
&lt;span class="n"&gt;cfgSocials&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt; &lt;span class="s"&gt;"twitter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"#SOCIAL_TWITTER#"&lt;/span&gt;
&lt;span class="n"&gt;cfgSocials&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt; &lt;span class="s"&gt;"linkedin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"#SOCIAL_LINKEDIN#"&lt;/span&gt;
&lt;span class="n"&gt;cfgSocials&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt; &lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"#SOCIAL_EMAIL#"&lt;/span&gt;

&lt;span class="k"&gt;Dim&lt;/span&gt; &lt;span class="nv"&gt;cfgSite&lt;/span&gt;
&lt;span class="k"&gt;Set&lt;/span&gt; &lt;span class="n"&gt;cfgSite&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Scripting.Dictionary"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cfgSite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt; &lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Portofolio"&lt;/span&gt;
&lt;span class="n"&gt;cfgSite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt; &lt;span class="s"&gt;"fullname"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"#FULL_NAME#"&lt;/span&gt;
&lt;span class="n"&gt;cfgSite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt; &lt;span class="s"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"#ADDRESS#"&lt;/span&gt;

&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, all we need to do read file content, and do find-replace based on placeholder. I'm a fan of powershell, because it's easy to write the script and its dotnet support is deadly insane👍. Here's the quick snippet&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Get-Value&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$Key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Configs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$Key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-not&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;IsNullOrEmpty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$Value&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$Value&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&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="nv"&gt;$Key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$PlaceholderPattern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'#(?&amp;lt;placeholder&amp;gt;\w+)#'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$ParsedContent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$PlaceholderPattern&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="kr"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$Match&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$Match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Success&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nv"&gt;$Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'placeholder'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Value&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nx"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-not&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;IsNullOrEmpty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$Value&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nv"&gt;$Value&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nv"&gt;$Match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Value&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nv"&gt;$Match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Value&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ParsedContent&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In azure pipeline, it exposes all variables to environment variables. So it's easy to populate from pipeline definition to file. &lt;/p&gt;

&lt;p&gt;Take a look at &lt;a href="https://dev.azure.com/fakhrulhilal/OpenSource/_git/asp-classic-demo"&gt;demo repo&lt;/a&gt; and give me feedback😊. I put all the details there.&lt;/p&gt;

</description>
      <category>aspclassic</category>
      <category>ci</category>
      <category>transformation</category>
      <category>pipeline</category>
    </item>
    <item>
      <title>Getting started with GPG key for signing git commit</title>
      <dc:creator>Fakhrulhilal M</dc:creator>
      <pubDate>Sun, 04 Jul 2021 05:27:49 +0000</pubDate>
      <link>https://dev.to/fakhrulhilal/getting-started-with-gpg-key-5eea</link>
      <guid>https://dev.to/fakhrulhilal/getting-started-with-gpg-key-5eea</guid>
      <description>&lt;h2&gt;
  
  
  Configuring Git and GPG
&lt;/h2&gt;

&lt;p&gt;After installing &lt;a href="https://git-scm.com/downloads"&gt;git&lt;/a&gt;, you need to add git's binary path to the PATH environment, located in &lt;code&gt;%ProgramFiles%\Git\usr\bin&lt;/code&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  GPG Key
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create new key
&lt;/h3&gt;

&lt;p&gt;Generate a key: &lt;code&gt;gpg --default-new-key-algo rsa4096 --gen-key&lt;/code&gt;. After that, check again with this command:  &lt;code&gt;gpg --list-secret-keys --keyid-format LONG&lt;/code&gt;, result example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gpg &lt;span class="nt"&gt;--list-secret-keys&lt;/span&gt; &lt;span class="nt"&gt;--keyid-format&lt;/span&gt; LONG
/c/Users/fmaktum/.gnupg/pubring.gpg
&lt;span class="nt"&gt;-----------------------------------&lt;/span&gt;
sec   rsa4096/E170165D27E434C2 2018-07-22 &lt;span class="o"&gt;[&lt;/span&gt;SC] &lt;span class="o"&gt;[&lt;/span&gt;expires: 2022-07-23]
      FE428E022494CC3ED85ACDD3E170165D27E434C2
uid                 &lt;span class="o"&gt;[&lt;/span&gt;ultimate] Fakhrulhilal Maktum &amp;lt;fakhrulhilal@gmail.com&amp;gt;
uid                 &lt;span class="o"&gt;[&lt;/span&gt;ultimate] Fakhrulhilal Maktum &amp;lt;fakhrulhilal@outlook.com&amp;gt;
uid                 &lt;span class="o"&gt;[&lt;/span&gt;ultimate] &lt;span class="o"&gt;[&lt;/span&gt;jpeg image of size 13093]
ssb   rsa4096/C0D8267ED759FC4B 2018-07-22 &lt;span class="o"&gt;[&lt;/span&gt;E] &lt;span class="o"&gt;[&lt;/span&gt;expires: 2022-07-23]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in that case, key ID is &lt;code&gt;3AA5C34371567BD2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Next, we need to associate with the email address. To do that, we need to edit first by this command: &lt;code&gt;gpg --edit-key 3AA5C34371567BD2&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpg&amp;gt; adduid
Real name: Fakhrulhilal Maktum
Email address: fakhrulhilal@outlook.com
Comment: 
You selected this USER-ID:
    &lt;span class="s2"&gt;"Fakhrulhilal Maktum &amp;lt;fakhrulhilal@outlook.com&amp;gt;"&lt;/span&gt;

Change &lt;span class="o"&gt;(&lt;/span&gt;N&lt;span class="o"&gt;)&lt;/span&gt;ame, &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt;omment, &lt;span class="o"&gt;(&lt;/span&gt;E&lt;span class="o"&gt;)&lt;/span&gt;mail or &lt;span class="o"&gt;(&lt;/span&gt;O&lt;span class="o"&gt;)&lt;/span&gt;kay/&lt;span class="o"&gt;(&lt;/span&gt;Q&lt;span class="o"&gt;)&lt;/span&gt;uit? o
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Optionally, we can add the picture (suggested to use 240x288)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg&amp;gt; addphoto

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After all changes, we can know save it&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpg&amp;gt; save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Extending Expired Public Key
&lt;/h3&gt;

&lt;p&gt;You need to edit the key by using this command: &lt;code&gt;gpg --edit-key&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpg&amp;gt; expire
Changing expiration &lt;span class="nb"&gt;time &lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;a subkey.
Please specify how long the key should be valid.
         0 &lt;span class="o"&gt;=&lt;/span&gt; key does not expire
      &amp;lt;n&amp;gt;  &lt;span class="o"&gt;=&lt;/span&gt; key expires &lt;span class="k"&gt;in &lt;/span&gt;n days
      &amp;lt;n&amp;gt;w &lt;span class="o"&gt;=&lt;/span&gt; key expires &lt;span class="k"&gt;in &lt;/span&gt;n weeks
      &amp;lt;n&amp;gt;m &lt;span class="o"&gt;=&lt;/span&gt; key expires &lt;span class="k"&gt;in &lt;/span&gt;n months
      &amp;lt;n&amp;gt;y &lt;span class="o"&gt;=&lt;/span&gt; key expires &lt;span class="k"&gt;in &lt;/span&gt;n years
Key is valid &lt;span class="k"&gt;for&lt;/span&gt;? &lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt; 2y
Key expires at Sun Jul 24 06:36:28 2022 SEAST
Is this correct? &lt;span class="o"&gt;(&lt;/span&gt;y/N&lt;span class="o"&gt;)&lt;/span&gt; y

sec  rsa4096/E170165D27E434C2
     created: 2018-07-22  expires: 2023-07-23  usage: SC
     trust: ultimate      validity: ultimate
ssb&lt;span class="k"&gt;*&lt;/span&gt; rsa4096/C0D8267ED759FC4B
     created: 2018-07-22  expires: 2022-07-23  usage: E
&lt;span class="o"&gt;[&lt;/span&gt;ultimate] &lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; Fakhrulhilal Maktum &amp;lt;fakhrulhilal@gmail.com&amp;gt;
&lt;span class="o"&gt;[&lt;/span&gt;ultimate] &lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;  Fakhrulhilal Maktum &amp;lt;fakhrulhilal@outlook.com&amp;gt;
&lt;span class="o"&gt;[&lt;/span&gt;ultimate] &lt;span class="o"&gt;(&lt;/span&gt;3&lt;span class="o"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;[&lt;/span&gt;jpeg image of size 13093]

gpg&amp;gt; key 1

sec  rsa4096/E170165D27E434C2
     created: 2018-07-22  expires: 2023-07-23  usage: SC
     trust: ultimate      validity: ultimate
ssb  rsa4096/C0D8267ED759FC4B
     created: 2018-07-22  expires: 2022-07-23  usage: E
&lt;span class="o"&gt;[&lt;/span&gt;ultimate] &lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; Fakhrulhilal Maktum &amp;lt;fakhrulhilal@gmail.com&amp;gt;
&lt;span class="o"&gt;[&lt;/span&gt;ultimate] &lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;  Fakhrulhilal Maktum &amp;lt;fakhrulhilal@outlook.com&amp;gt;
&lt;span class="o"&gt;[&lt;/span&gt;ultimate] &lt;span class="o"&gt;(&lt;/span&gt;3&lt;span class="o"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;[&lt;/span&gt;jpeg image of size 13093]

gpg&amp;gt; expire
Changing expiration &lt;span class="nb"&gt;time &lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;the primary key.
Please specify how long the key should be valid.
         0 &lt;span class="o"&gt;=&lt;/span&gt; key does not expire
      &amp;lt;n&amp;gt;  &lt;span class="o"&gt;=&lt;/span&gt; key expires &lt;span class="k"&gt;in &lt;/span&gt;n days
      &amp;lt;n&amp;gt;w &lt;span class="o"&gt;=&lt;/span&gt; key expires &lt;span class="k"&gt;in &lt;/span&gt;n weeks
      &amp;lt;n&amp;gt;m &lt;span class="o"&gt;=&lt;/span&gt; key expires &lt;span class="k"&gt;in &lt;/span&gt;n months
      &amp;lt;n&amp;gt;y &lt;span class="o"&gt;=&lt;/span&gt; key expires &lt;span class="k"&gt;in &lt;/span&gt;n years
Key is valid &lt;span class="k"&gt;for&lt;/span&gt;? &lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt; 2y
Key expires at Sun Jul 24 06:36:36 2022 SEAST
Is this correct? &lt;span class="o"&gt;(&lt;/span&gt;y/N&lt;span class="o"&gt;)&lt;/span&gt; y

sec  rsa4096/E170165D27E434C2
     created: 2018-07-22  expires: 2022-07-23  usage: SC
     trust: ultimate      validity: ultimate
ssb  rsa4096/C0D8267ED759FC4B
     created: 2018-07-22  expires: 2022-07-23  usage: E
&lt;span class="o"&gt;[&lt;/span&gt;ultimate] &lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; Fakhrulhilal Maktum &amp;lt;fakhrulhilal@gmail.com&amp;gt;
&lt;span class="o"&gt;[&lt;/span&gt;ultimate] &lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;  Fakhrulhilal Maktum &amp;lt;fakhrulhilal@outlook.com&amp;gt;
&lt;span class="o"&gt;[&lt;/span&gt;ultimate] &lt;span class="o"&gt;(&lt;/span&gt;3&lt;span class="o"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;[&lt;/span&gt;jpeg image of size 13093]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first key is for extending primary key, the second command is for extending sub encryption key.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backup GPG Key
&lt;/h3&gt;

&lt;p&gt;The easy way to backup all keys is by copy-paste the database&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;public keys: &lt;code&gt;%UserProfile%\.gnupg\pubring.gpg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;secret keys: &lt;code&gt;%UserProfile%\.gnupg\secring.gpg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;trust db: &lt;code&gt;%UserProfile%\.gnupg\trustdb.gpg&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://www.gnupg.org/documentation/manuals/gnupg/GPG-Configuration.html"&gt;GPG manual&lt;/a&gt; suggests this command to backup trust db: &lt;code&gt;gpg --export-ownertrust &amp;gt; gpg-owner-trust.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To backup individual key:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;public key: &lt;code&gt;gpg --armor --export E170165D27E434C2 &amp;gt; public.gpg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;secret key: &lt;code&gt;gpg --armor --export-secret-key E170165D27E434C2&amp;gt; secret.asc&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or you can use the email address instead of the key ID, f.e. &lt;code&gt;git --armor --export fakhrulhilal@gmail.com &amp;gt; public.gpg&lt;/code&gt;. Note that, secret key always contains public key.&lt;/p&gt;

&lt;p&gt;We can also publish the GPG key to public server with this command: &lt;code&gt;gpg --keyserver [server address] --send-keys fakhrulhilal@gmail.com&lt;/code&gt;. Some notable PGP public key servers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pgp.mit.edu&lt;/li&gt;
&lt;li&gt;pgp.key-server.io&lt;/li&gt;
&lt;li&gt;keyserver.pgp.com&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Import/Restore GPG Key
&lt;/h3&gt;

&lt;p&gt;Importing secret key (along with public key): &lt;code&gt;gpg --import fakhrulhilal@gmail.com.asc&lt;/code&gt;. After that, import all owner trust: &lt;code&gt;gpg --import-ownertrust gpg-owner-trust.txt&lt;/code&gt;. Alternatively, we can trust by each key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gpg &lt;span class="nt"&gt;--edit-key&lt;/span&gt; fakhrulhilal@gmail.com
gpg&amp;gt; trust
Your decision? 5 &lt;span class="o"&gt;(&lt;/span&gt;Ultimate trust&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sharing GPG key to public key server
&lt;/h3&gt;

&lt;p&gt;Below is currently active keyservers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pgp.mit.edu&lt;/li&gt;
&lt;li&gt;keyserver.ubuntu.com&lt;/li&gt;
&lt;li&gt;keys.openpgp.org&lt;/li&gt;
&lt;li&gt;keyserver1.pgp.com&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To upload the key using gpg command, use &lt;code&gt;gpg --keyserver the_server --send-keys E170165D27E434C2&lt;/code&gt;. Another way is by uploading manually to them. So we need to go their website and upload the key, commonly, they accept ASCII version of public key (&lt;code&gt;gpg --export --armor E170165D27E434C2&lt;/code&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Associating Git with GPG
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Setting GPG key for git commit
&lt;/h3&gt;

&lt;p&gt;Set the key by using this command: &lt;code&gt;git config user.signingkey E170165D27E434C2&lt;/code&gt;. And then we can sign the commit by &lt;a href="https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work"&gt;&lt;code&gt;-S&lt;/code&gt;&lt;/a&gt; option. Alternatively, we can force all commit to be signed using this command &lt;code&gt;git config commit.gpgsign true&lt;/code&gt;, so we don't have to specify &lt;code&gt;-S&lt;/code&gt; parameter each time committing the change.&lt;/p&gt;

&lt;h3&gt;
  
  
  Uploading public key to github
&lt;/h3&gt;

&lt;p&gt;First, we need to backup the public key as follows: &lt;code&gt;gpg --armor --export E170165D27E434C2 &amp;gt; fakhrulhilal.gpg&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Login to your github account&lt;/li&gt;
&lt;li&gt;Go to menu Settings &amp;gt; SSH and GPG keys&lt;/li&gt;
&lt;li&gt;Add new gpg key&lt;/li&gt;
&lt;li&gt;Copy-paste from &lt;code&gt;fakhrulhilal.gpg&lt;/code&gt; content then save it&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/github/authenticating-to-github/generating-a-new-gpg-key"&gt;Github: Generating a new GPG key&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/github/authenticating-to-github/telling-git-about-your-signing-key"&gt;Github: Telling Git about your signing key&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/chrisroos/1205934"&gt;Backup/restore GPG key&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>gpg</category>
      <category>openpgp</category>
      <category>git</category>
      <category>signing</category>
    </item>
    <item>
      <title>Creating SSL Certificate with Custom CA</title>
      <dc:creator>Fakhrulhilal M</dc:creator>
      <pubDate>Sun, 04 Jul 2021 05:15:51 +0000</pubDate>
      <link>https://dev.to/fakhrulhilal/creating-ssl-certificate-with-custom-ca-402e</link>
      <guid>https://dev.to/fakhrulhilal/creating-ssl-certificate-with-custom-ca-402e</guid>
      <description>&lt;h2&gt;
  
  
  Creating Default OpenSSL Config File
&lt;/h2&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Creating Custom Root CA
&lt;/h2&gt;

&lt;p&gt;Creating the CA key:&lt;br&gt;
&lt;code&gt;openssl genrsa -des3 -out root-CA.key 4096&lt;/code&gt;&lt;br&gt;
Note: remove &lt;code&gt;-des&lt;/code&gt; option to create key without password&lt;/p&gt;

&lt;p&gt;Creating self sign CA certificate&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;openssl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-x509&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-nodes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;root-CA.key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-sha256&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-days&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3650&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;root-CA.crt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-subj&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/C=ID/O=Dev lab/CN=Dev lab Root CA"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-addext&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'keyUsage = cRLSign, keyCertSign, digitalSignature'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-addext&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'extendedKeyUsage = critical, serverAuth, clientAuth, codeSigning, emailProtection, timeStamping'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-addext&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'subjectKeyIdentifier=hash'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-addext&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'authorityKeyIdentifier=keyid:always,issuer:always'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-addext&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"basicConstraints = critical, CA:TRUE"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;subj&lt;/code&gt;&lt;br&gt;
create unattended answer subject&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;basicConstraints&lt;/code&gt;&lt;br&gt;
&lt;em&gt;CA:TRUE&lt;/em&gt; means it's issuer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;keyUsage&lt;/code&gt;&lt;br&gt;
determine what's this cert for: certificate signing (&lt;em&gt;keyCertSign&lt;/em&gt;), CRL signing (&lt;em&gt;cRLSign&lt;/em&gt;), digital signature&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;extendedKeyUsage&lt;/code&gt;&lt;br&gt;
an extended version of &lt;code&gt;keyUsage&lt;/code&gt;: server authentication (&lt;em&gt;serverAuth&lt;/em&gt;), client authentication (&lt;em&gt;clientAuth&lt;/em&gt;), file/code signing (&lt;em&gt;codeSigning&lt;/em&gt;), S/MIME signing (&lt;em&gt;emailProtection&lt;/em&gt;), time stamping&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;subjectKeyIdentifier&lt;/code&gt;&lt;br&gt;
identifier of this cert&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;authoritykKeyIdentifier&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;the identifier which signs the cert, if it's root cert, then it should be itself&lt;/p&gt;

&lt;p&gt;Shorter version&lt;/p&gt;

&lt;p&gt;&lt;code&gt;openssl req -config openssl.cnf -x509 -new -nodes -key root-CA.key -out root-CA.crt -days 3650 -extensions ca_cert -subj "/C=ID/O=Dev Lab/CN=Dev Lab Root CA"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href="https://www.openssl.org/docs/manmaster/man5/x509v3_config.html"&gt;OpenSSL man page&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inspect root CA certificate&lt;br&gt;
&lt;code&gt;openssl x509 -noout -text -in root-CA.crt&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Convert into PKCS12 (.pfx) format&lt;br&gt;
&lt;code&gt;openssl pkcs12 -export -name "Root CA" -out root-CA.pfx -inkey root-CA.key -in root-CA.crt&lt;/code&gt;&lt;br&gt;
Then import the pfx file into local machine placed under &lt;em&gt;Trusted Root Certification Authorities&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Creating Intermediate CA
&lt;/h2&gt;

&lt;p&gt;Creating the intermedia CA key&lt;br&gt;
&lt;code&gt;openssl genrsa -out server-CA.key 4096&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Creating intermediate certificate request&lt;/p&gt;

&lt;p&gt;&lt;code&gt;openssl req -new -key server-CA.key -out server-CA.csr -subj "/C=ID/O=Dev Lab/OU=Development/CN=Dev Lab Server CA"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sign the intermedia CA certificate's request with CA's key and cert:&lt;br&gt;
&lt;code&gt;openssl x509 -extfile openssl.cnf -req -in server-CA.csr -CA root-CA.crt -CAkey root-CA.key -CAcreateserial -out server-CA.crt -extensions ica_cert -days 3650&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Inspect root CA certificate&lt;br&gt;
&lt;code&gt;openssl x509 -noout -text -in server-CA.crt&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Convert into PKCS12 format&lt;br&gt;
&lt;code&gt;openssl pkcs12 -export -name "Dev lab Server CA" -inkey server-CA.key -in server-CA.crt -out server-CA.pfx&lt;/code&gt;&lt;br&gt;
Then import the pfx file into local machine placed under &lt;em&gt;Intermediate Certification Authorities&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Creating User Certificate
&lt;/h2&gt;

&lt;p&gt;Creating the certificate key&lt;br&gt;
&lt;code&gt;openssl genrsa -out dev.lab.key 2048&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Before moving on, the openssl config is configured to accept subject alternate name from environment variable named &lt;code&gt;SAN&lt;/code&gt; (see line 176), so you need to configure first, otherwise, it will fail: &lt;code&gt;$Env:SAN = 'DNS:*.dev.lab, DNS:dev.lab'&lt;/code&gt;. You can set it to the same as CN if you don't want to assign it to wilcard domain. We can also assign it to IP address as follows: &lt;code&gt;$Env:SAN = 'DNS:*.dev.lab,DNS:dev.lab,DNS:localhost,IP:127.0.0.1'&lt;/code&gt;. After that, we can continue to create certificate request&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;openssl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;dev.lab.key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;dev.lab.csr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-subj&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/C=ID/ST=Jakarta/O=Dev Home/OU=Development/CN=*.dev.lab"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sign the certificate request using server CA's key and certificate&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;openssl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;x509&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-extfile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;openssl.cnf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-extensions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;web_cert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-req&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-CA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;server-CA.crt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-CAkey&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;server-CA.key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-CAcreateserial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-days&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;365&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;dev.lab.csr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;dev.lab.crt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Convert into PKCS12 format&lt;br&gt;
&lt;code&gt;openssl pkcs12 -export -name "dev.lab Certificate" -inkey dev.lab.key -in dev.lab.crt -out dev.lab.pfx&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Import the .pfx file into local machine using default location.&lt;/p&gt;
&lt;h2&gt;
  
  
  Creating S/MIME Certificate
&lt;/h2&gt;

&lt;p&gt;Creating the certificate key&lt;/p&gt;

&lt;p&gt;&lt;code&gt;openssl genrsa -out iroel-email.key 2048&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Creating certificate request&lt;br&gt;
&lt;code&gt;openssl req -new -key iroel-email.key -out iroel-email.csr -subj "/C=ID/ST=Jakarta/CN=Fakhrulhilal Maktum/emailAddress=iroel@dev.lab" -addext "subjectAltName = email:iroel@dev.lab, email:iroel@other.lab"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sign the certificate request using server CA's key and certificate&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;SAN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'email:iroel@dev.lab, email:iroel@dev.test'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;openssl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;x509&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-extfile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;openssl.cnf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-extensions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;smime_cert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-req&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-CA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;server-CA.crt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-CAkey&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;server-CA.key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-CAcreateserial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-setalias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Dev email certificate"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;iroel-email.csr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;iroel-email.crt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-trustout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-days&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;365&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Convert into PKCS12 format&lt;br&gt;
&lt;code&gt;openssl pkcs12 -export -name "wilcard.dev.lab Certificate" -inkey dev.lab.key -in dev.lab.crt -out dev.lab.pfx&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Import the .pfx file into local machine using default location.&lt;/p&gt;
&lt;h2&gt;
  
  
  Installing Certificates
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Installing CAs' Certificate
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Install root certificate (root-CA.crt) to &lt;em&gt;Trusted Root Certification Authorities&lt;/em&gt; in machine level&lt;/li&gt;
&lt;li&gt;Install intermediate certificate (server-CA.crt) to &lt;em&gt;Intermediate Certification Authorities&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Install IIS Express Certificate
&lt;/h3&gt;

&lt;p&gt;Install the certificate in Local Machine wide and in default location (Personal). Run this powershell with administrator privilege. Friendly name is &lt;code&gt;-name&lt;/code&gt; parameter value when converting into PKCS12 format.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$PfxPassword&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'pfx_password'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;#$Certificate = Get-ChildItem Cert:\LocalMachine\My | ?{ $_.FriendlyName -eq 'localhost' }&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Certificate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-PfxCertificate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\dev.lab.pfx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ConvertTo-SecureString&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$PfxPassword&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AsPlainText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$IisExpress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_Product&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Name like "IIS%Express%"'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;44300&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-lt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;44400&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Port&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;netsh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;delete&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sslcert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ipport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$Port&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;netsh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sslcert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ipport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$Port&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;certhash&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;$Certificate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Thumbprint&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;appid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;$IisExpress&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IdentifyingNumber&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Installing Kestrel Certificate
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Using environment variable&lt;br&gt;
&lt;code&gt;ASPNETCORE_Kestrel__Certificates__Default__Path&lt;/code&gt; = path to pfx file&lt;br&gt;
&lt;code&gt;ASPNETCORE_Kestrel__Certificates__Default__Password&lt;/code&gt; = pfx's password&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using appsettings.json&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Kestrel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Certificates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"path/to/pfx/file"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pfx's password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;/*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;.crt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;*/&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;/*&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"path/to/crt/file"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"KeyPath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"path/to/key/file"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;*/&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reference: &lt;a href="https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel/endpoints"&gt;Configure endpoints for the ASP.NET Core Kestrel web server&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Using dotnet tool: &lt;code&gt;dotnet dev-certs https --clean -i .\dev.lab.pfx -p the_password&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Installing remote desktop certificate
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$PfxPassword&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'pfx_password'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;#$Certificate = Get-ChildItem Cert:\LocalMachine\My | ?{ $_.FriendlyName -eq 'localhost' }&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$Certificate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-PfxCertificate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\dev.lab.pfx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ConvertTo-SecureString&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$PfxPassword&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AsPlainText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;wmic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/namespace:\\root\cimv2\TerminalServices&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PATH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_TSGeneralSetting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SSLCertificateSHA1Hash&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;$Certificate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Thumbprint&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
`&lt;/p&gt;

</description>
      <category>openssl</category>
      <category>certificate</category>
      <category>x509</category>
      <category>selfsign</category>
    </item>
  </channel>
</rss>
