<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Certificate on Janik von Rotz</title>
    <link>https://janikvonrotz.ch/tags/certificate/</link>
    <description>Recent content in Certificate on Janik von Rotz</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Thu, 22 Dec 2022 17:16:38 +0100</lastBuildDate>
    <atom:link href="https://janikvonrotz.ch/tags/certificate/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>E-ID</title>
      <link>https://janikvonrotz.ch/2022/12/22/22-ei-d/</link>
      <pubDate>Thu, 22 Dec 2022 17:16:38 +0100</pubDate>
      <guid>https://janikvonrotz.ch/2022/12/22/22-ei-d/</guid>
      <description>&lt;p&gt;Die E-ID ist ein staatlich anerkannter Identifikationsnachweis. Alle Informationen zur E-ID werden unter &lt;a href=&#34;http://eid.ch&#34;&gt;http://eid.ch&lt;/a&gt; publiziert. Ich verfolge das Projekt nur am Rande, bin am Thema aber sehr interessiert. Kryptographie, Politik und Wirtschaft treffen hier aufeinander.&lt;/p&gt;&#xA;&lt;p&gt;Bei &lt;a href=&#34;https://www.adnovum.com/&#34;&gt;AdNovum&lt;/a&gt; war ich als Identity und Access Management (IAM) Integrator angestellt. Dabei habe ich viel über Zertifikate, Infrastruktur, Kryptographie und Systemtechnik im Allgemeinen gelernt. Mit diesem Wissen habe versucht eine E-ID zu skizzieren. Die folgende Grafik zeigt wie eine E-ID konzeptionell funktionieren könnte:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://janikvonrotz.ch/images/Beh%C3%B6rde.svg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ich bin gespannt wie sich das Projekt entwickelt wird und mal schauen ob es Überschneidungen mit meiner Vorstellung gibt.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Generate PEM key- and truststores With Puppet</title>
      <link>https://janikvonrotz.ch/2019/03/07/generate-pem-key-and-truststores-with-puppet/</link>
      <pubDate>Thu, 07 Mar 2019 10:23:04 +0100</pubDate>
      <guid>https://janikvonrotz.ch/2019/03/07/generate-pem-key-and-truststores-with-puppet/</guid>
      <description>&lt;p&gt;This post is a follow-up of &lt;a href=&#34;https://janikvonrotz.ch/2019/01/30/generate-pkcs12-key-and-truststores-with-puppet/&#34;&gt;Generate pkcs12 key- and truststores with Puppet&lt;/a&gt;.&lt;br&gt;&#xA;In this post we are going to create &lt;a href=&#34;https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail&#34;&gt;PEM&lt;/a&gt; key- and truststores with Puppet.&lt;/p&gt;&#xA;&lt;p&gt;PEM files are base64 encoded &lt;a href=&#34;https://en.wikipedia.org/wiki/X.509&#34;&gt;X.509&lt;/a&gt; certificates. Enclosed between &lt;code&gt;-----BEGIN CERTIFICATE-----&lt;/code&gt; and &lt;code&gt;-----END CERTIFICATE-----&lt;/code&gt; multiple PEM files can be concatinated into key- and truststores. And that is exactly what we are going to do using a Puppet manifest.&lt;/p&gt;&#xA;&lt;p&gt;For the example use case multiple certificate files are required. Using the commands from the &lt;a href=&#34;https://janikvonrotz.ch/2019/01/21/create-a-certificate-authority-ca-and-sign-server-certificates-without-prompting-using-openssl/&#34;&gt;Create a certificate authority and sign server certificates without prompting using openssl&lt;/a&gt; post the following files must be provided:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;localhost_cert.pem&lt;/li&gt;&#xA;&lt;li&gt;localhost_key.pem&lt;/li&gt;&#xA;&lt;li&gt;example.com_cert.pem&lt;/li&gt;&#xA;&lt;li&gt;ca_cert.pem&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The certificates will be concatinated into the following stores:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;webservice-keystore.pem&#xA;&lt;ul&gt;&#xA;&lt;li&gt;localhost - private key entry&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;webservice-truststore.pem&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ca - trusted cert entry&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;custom-truststore.pem&#xA;&lt;ul&gt;&#xA;&lt;li&gt;example.com - trusted cert entry&lt;/li&gt;&#xA;&lt;li&gt;ca - trusted cert entry&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;All the files are processed in &lt;code&gt;/var/tmp/certificates&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The manifest file is defined as followed:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;modules/certbox/manifests/init.pp&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rb&#34; data-lang=&#34;rb&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; certbox (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    String $host &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    String $cert_dir &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/var/tmp/certificates&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    String $server_ca_cert &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${cert_dir}/ca_cert.pem&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    String $server_cn &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; $host,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    String $server_cert &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${cert_dir}/${host}_cert.pem&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    String $server_key &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${cert_dir}/${host}_key.pem&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    String $server_key_pass &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    String $server_keystore &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${cert_dir}/webservice-keystore.pem&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    String $server_truststore &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${cert_dir}/webservice-truststore.pem&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Array $custom_trust_entries &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        cn &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;example.com&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        cert &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;example.com_cert.pem&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        cn &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ca&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        cert &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ca_cert.pem&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    String $custom_truststore &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${cert_dir}/custom-truststore.pem&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    String $owner &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;root&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    String $group &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;root&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    String $file_read_mode &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;a=,ug+r&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# component-wide defaulting of the exec path attribute&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;Exec&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    path &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/usr/bin&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/bin&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# create copy of sever cert, if file state changes notify keystore assemble task&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  file { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${server_cert}.tmp&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;ensure&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; file,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    owner  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $owner,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    group  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $group,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mode   &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $file_read_mode,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    source &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $server_cert,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    notify &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;Exec&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;certbox - create server keystore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# check if keystore file does not exist and notify creation task&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  exec { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;certbox - check if server keystore exists&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    onlyif &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;test ! -f $server_keystore&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    command &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;echo &amp;#34;File does not exist.&amp;#34;&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    notify &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;Exec&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;certbox - create server keystore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# create server keystore if temporary file state changed&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  exec { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;certbox - create server keystore&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    refreshonly &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    command     &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;cat ${server_cert} &amp;gt; ${server_keystore}; cat ${server_key} &amp;gt;&amp;gt; ${server_keystore}&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# ensure server keystore file permissions&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  file { $server_keystore:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;ensure&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; file,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    owner  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $owner,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    group  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $group,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mode   &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $file_read_mode,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  file { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${server_ca_cert}.tmp&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;ensure&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; file,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    owner  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $owner,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    group  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $group,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mode   &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $file_read_mode,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    source &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $server_ca_cert,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    notify &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;Exec&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;certbox - create server truststore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  exec { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;certbox - check if server truststore exists&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    onlyif &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;test ! -f $server_truststore&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    command &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;echo &amp;#34;File does not exist.&amp;#34;&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    notify &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;Exec&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;certbox - create server truststore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  exec { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;certbox - create server truststore&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    refreshonly &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    command     &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;cat ${server_ca_cert} &amp;gt; ${server_truststore}&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  file { $server_truststore:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;ensure&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; file,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    owner  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $owner,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    group  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $group,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mode   &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $file_read_mode,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    notify &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;Exec&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;certbox - create server truststore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# create copy for each ca truststore entry&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  $custom_trust_entries&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;each &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; Integer $index, &lt;span style=&#34;color:#66d9ef&#34;&gt;Hash&lt;/span&gt; $entry &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    file { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${cert_dir}/${entry[&amp;#39;cert&amp;#39;]}.ca_trust.icam.tmp&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;ensure&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; file,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      owner  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $owner,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      group  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $group,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      mode   &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $file_read_mode,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      source &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;${cert_dir}/${entry[&amp;#39;cert&amp;#39;]}&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      notify &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;Exec&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;certbox - cleanup ca truststore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;Exec&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;certbox - add pem ${entry[&amp;#39;cn&amp;#39;]} to ca truststore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    exec { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;certbox - check if ca truststore for ${entry[&amp;#39;cn&amp;#39;]} exists&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      onlyif &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;test ! -f $custom_truststore&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      command &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;echo &amp;#34;File does not exist.&amp;#34;&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      notify &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;Exec&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;certbox - add pem ${entry[&amp;#39;cn&amp;#39;]} to ca truststore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# reset ca truststore if temporary entry file state changed&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  exec { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;certbox - cleanup ca truststore&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    refreshonly &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    command     &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;echo &amp;gt; ${custom_truststore}&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# add ca truststore entry if temporary entry file state changed&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  $custom_trust_entries&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;each &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; Integer $index, &lt;span style=&#34;color:#66d9ef&#34;&gt;Hash&lt;/span&gt; $entry &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    exec { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;certbox - add pem ${entry[&amp;#39;cn&amp;#39;]} to ca truststore&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      refreshonly &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      command     &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;echo &amp;gt;&amp;gt; ${custom_truststore};cat ${cert_dir}/${entry[&amp;#39;cert&amp;#39;]} &amp;gt;&amp;gt; ${custom_truststore}&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  file { $custom_truststore:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;ensure&lt;/span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; file,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    owner   &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $owner,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    group   &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $group,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mode    &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $file_read_mode,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This manifest checks if the source PEM files have changed or the target stores does not exist. If one of these cases apply the manifests creates the key- or truststore. Finally, it sets the file mode and ownership.&lt;/p&gt;&#xA;&lt;p&gt;To apply the manifest with Puppet run the following command:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo puppet apply --modulepath=modules/ -e &amp;quot;include certbox&amp;quot;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;To verify if the files have been assembled correctly use this keytool commands:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo keytool -printcert -file /var/tmp/certificates/custom-truststore.pem&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Let me know if this post helped you to resolve a particular use case.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Generate pkcs12 key- and truststores with Puppet</title>
      <link>https://janikvonrotz.ch/2019/01/30/generate-pkcs12-key-and-truststores-with-puppet/</link>
      <pubDate>Wed, 30 Jan 2019 11:16:52 +0100</pubDate>
      <guid>https://janikvonrotz.ch/2019/01/30/generate-pkcs12-key-and-truststores-with-puppet/</guid>
      <description>&lt;p&gt;In &lt;a href=&#34;https://janikvonrotz.ch/2019/01/22/create-pkcs12-key-and-truststore-with-keytool-and-openssl/&#34;&gt;my last post&lt;/a&gt; I have showed how to generate pkcs12 key- and truststores using openssl and keytool.&lt;/p&gt;&#xA;&lt;p&gt;For this post we assume that we want to automate the store assembling with Puppet. &lt;a href=&#34;https://puppet.com/&#34;&gt;Puppet&lt;/a&gt; is a configuration management tool that shares many ideas with &lt;a href=&#34;https://www.ansible.com/&#34;&gt;Ansible&lt;/a&gt;. In the world of Puppet you define a &lt;a href=&#34;https://puppet.com/docs/puppet/5.5/lang_summary.html#files&#34;&gt;manifest file&lt;/a&gt; that describes a state of how a file, service or any type of resource should look like. Puppet applies these manifests and makes sure that the targeted system reaches the defined state.&lt;/p&gt;&#xA;&lt;p&gt;Using Puppets &lt;a href=&#34;https://puppet.com/docs/puppet/5.3/types/exec.html&#34;&gt;exec resource&lt;/a&gt; we are going to define key- and truststores using openssl and keytool.&lt;/p&gt;&#xA;&lt;p&gt;Our manifest assure that the stores are assembled as defined. Puppet will be able to detect deltas and act accordingly.&lt;/p&gt;&#xA;&lt;p&gt;For our use-case we assume we have generate multiple certificates under &lt;code&gt;/var/tmp/certificates&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;localhost_cert.pem&lt;/li&gt;&#xA;&lt;li&gt;localhost_key.pem&lt;/li&gt;&#xA;&lt;li&gt;example.com_cert.pem&lt;/li&gt;&#xA;&lt;li&gt;example.com_key.pem&lt;/li&gt;&#xA;&lt;li&gt;ca_cert.pem&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Our fictive webservice requires a key- and truststore containing the provided certificates and keys:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;webservice-keystore.pkcs12&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ca - trusted cert entry&lt;/li&gt;&#xA;&lt;li&gt;localhost - private key entry&lt;/li&gt;&#xA;&lt;li&gt;example.com - private key entry&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;webservice-truststore.pkcs12&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ca - trusted cert entry&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Puppet is installed on our system and we are ready to declare and apply our manifest file.&lt;/p&gt;&#xA;&lt;p&gt;Our Puppet module will be called &lt;em&gt;certbox&lt;/em&gt;. Modules must follow a strict naming and folder structure.&lt;/p&gt;&#xA;&lt;p&gt;Below is a copy-and-paste definition for our Puppet module. Create the manifest file and folders as showed.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;modules/certbox/manifests/init.pp&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rb&#34; data-lang=&#34;rb&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; certbox (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $certDir &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/var/tmp/certificates&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $caCert &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$certDir/ca_cert.pem&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $cn1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $cert1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$certDir/${cn1}_cert.pem&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $key1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$certDir/${cn1}_key.pem&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $keyPassword1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;password&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $cn2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;example.com&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $tmpKeystore2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$certDir/$cn2.pkcs12&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $cert2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$certDir/${cn2}_cert.pem&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $key2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$certDir/${cn2}_key.pem&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $keyPassword2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;password&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $keystore &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$certDir/webservice-keystore.pkcs12&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $truststore &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$certDir/webservice-truststore.pkcs12&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $keystorePassword &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;password&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $truststorePassword &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;password&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $owner &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;root&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $group &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;root&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  String $fileReadMode &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;a=,ug+r&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  exec { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;remove keystore for $cn1 if password changed or is empty&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    onlyif &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/keytool -list -storetype PKCS12 -keystore $keystore -storepass $keystorePass | grep &amp;#39;password was incorrect&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;|file exists, but is empty&amp;#39;&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    command &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/rm $keystore1&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  exec { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;create pkcs12 keystore for $cn1&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    onlyif &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/keytool -list -keystore $keystore -storepass $keystorePassword | grep $(openssl x509 -noout -fingerprint -sha1 -in $cert1 | cut -f2 -d &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;);test $? -eq 1&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    command &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/openssl pkcs12  -export -in $cert1 -inkey $key1 -passin pass:$keyPassword1 -certfile $caCert -out $keystore -passout pass:$keystorePassword -name $cn1&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  exec { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;remove keystore for $cn2 if password changed or is empty&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    onlyif &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/keytool -list -storetype PKCS12 -keystore $tmpKeystore2 -storepass $keystorePass | grep &amp;#39;password was incorrect&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;|file exists, but is empty&amp;#39;&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    command &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/rm $tmpKeystore2&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  exec { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;create pkcs12 keystore for $cn2&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    onlyif &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/keytool -list -keystore $tmpKeystore2 -storepass $keystorePassword | grep $(openssl x509 -noout -fingerprint -sha1 -in $cert2 | cut -f2 -d &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;);test $? -eq 1&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    command &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/openssl pkcs12 -in $cert2 -inkey $key2 -passin pass:$keyPassword2 -export -out $tmpKeystore2 -passout pass:$keystorePassword -name $cn2&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  exec { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;merge $cn2 into $cn1 keystore&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    onlyif &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/keytool -list -keystore $keystore -storepass $keystorePassword | grep $(openssl x509 -noout -fingerprint -sha1 -in $cert2 | cut -f2 -d &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;);test $? -eq 1&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    command &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/keytool -importkeystore -storetype PKCS12 -destkeystore $keystore -deststorepass $keystorePassword -destkeypass $keystorePassword \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      -srckeystore $tmpKeystore2 -srcstoretype PKCS12 -srcstorepass $keystorePassword -alias $cn2 -noprompt&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  file { $keystore:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;ensure&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; file,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    owner &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $owner,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    group &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $group,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mode &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $fileReadMode,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  exec { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;remove truststore for $cn1 if password changed&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    onlyif &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/keytool -list -storetype PKCS12 -keystore $truststore -storepass $truststorePass | grep &amp;#39;password was incorrect&amp;#39;&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    command &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/rm $truststore&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  exec { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;create pkcs12 truststore&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    onlyif &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/keytool -list -keystore $truststore -storepass $truststorePassword | grep $(openssl x509 -noout -fingerprint -sha1 -in $caCert | cut -f2 -d &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;);test $? -eq 1&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    command &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/bin/keytool -importcert -storetype PKCS12 -keystore $truststore -storepass $truststorePassword -alias ca -file $caCert -noprompt&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  file { $truststore:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;ensure&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; file,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    owner &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $owner,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    group &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $group,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mode &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $fileReadMode,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Edit 1:&lt;/strong&gt; Compare sha1 of cert to assert if import should be executed.&lt;br&gt;&#xA;&lt;strong&gt;Edit 2:&lt;/strong&gt; On create keystore check not if store file already exist, but check if cert in keystore matches the sha1. The check should also act as expected if file does not exist.&lt;br&gt;&#xA;&lt;strong&gt;Edit 3:&lt;/strong&gt; Remove the create empty truststore task. If the truststore file does not exist, the keytool import command will create the file.&lt;br&gt;&#xA;&lt;strong&gt;Edit 4:&lt;/strong&gt; Added exec task that remove the store file if the password has changed.&lt;/p&gt;&#xA;&lt;p&gt;The manifest is kept fairly simple. However, you might ask why we have to merge our second certificate from a pkcs12 store. The answer is a bit more complicated. The openssl and keytool utilities help generating and managing key material. They provide similar tasks, but differ heavy in specific features. Here are the most important differences:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Openssl cannot manipulate existing pkcs12 stores.&lt;/li&gt;&#xA;&lt;li&gt;Openssl cannot create pkcs12 with multiple certificates and keys.&lt;/li&gt;&#xA;&lt;li&gt;Keytool cannot import certificates and keys into an existing pkcs12 store, however, it can import a pkcs12 store into an existing one.&lt;/li&gt;&#xA;&lt;li&gt;Keytool cannot create pkcs12 stores from a certificate and key.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Hope this helps to understand the design decisions made here much better.&lt;/p&gt;&#xA;&lt;p&gt;To apply the manifest with Puppet run the following command:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo puppet apply --modulepath=modules/ -e &amp;quot;include certbox&amp;quot;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;At this point Puppet should create the key- and truststores.&lt;/p&gt;&#xA;&lt;p&gt;If you ended up with an error or faced some other issues let me know!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create pkcs12 key- and truststore with keytool and openssl</title>
      <link>https://janikvonrotz.ch/2019/01/22/create-pkcs12-key-and-truststore-with-keytool-and-openssl/</link>
      <pubDate>Tue, 22 Jan 2019 14:05:15 +0100</pubDate>
      <guid>https://janikvonrotz.ch/2019/01/22/create-pkcs12-key-and-truststore-with-keytool-and-openssl/</guid>
      <description>&lt;p&gt;In my &lt;a href=&#34;https://janikvonrotz.ch/2019/01/21/create-a-certificate-authority-ca-and-sign-server-certificates-without-prompting-using-openssl/&#34;&gt;last post&lt;/a&gt; I&amp;rsquo;ve showed you how to create a custom certificate authority and sign a server cert using openssl without user interaction.&lt;/p&gt;&#xA;&lt;p&gt;For this post I assume that we want to set up a webservice that requires a &lt;a href=&#34;https://en.wikipedia.org/wiki/PKCS_12&#34;&gt;pkcs12&lt;/a&gt; keystore. Using openssl and the java keytool we are going to create a pkcs12 store and add our ca cert, server cert and server key. Further, we assume that the application also requires a truststore containing the ca cert only.&lt;/p&gt;&#xA;&lt;p&gt;Make sure to walk through the last post before getting started.&lt;/p&gt;&#xA;&lt;p&gt;Configure new environment variables.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;APPLICATION_NAME&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;webservice&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;KEYSTORE_PASSWORD&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;password&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TRUSTSTORE_PASSWORD&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;password&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SERVER_CERT_PASSWORD&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;password&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;localhost&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create the pkcs12 store containing the server cert and the ca trust.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssl pkcs12 -in &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;_cert.pem -inkey &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;_key.pem -passin pass:$SERVER_CERT_PASSWORD -certfile ca_cert.pem &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -export -out &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;APPLICATION_NAME&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;_&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;-keystore.pkcs12 -passout pass:$KEYSTORE_PASSWORD -name $SERVER_CERT_CN&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Show the content of keystore.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;keytool -list -storetype PKCS12 -keystore $APPLICATION_NAME-keystore.pkcs12 &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -storepass $KEYSTORE_PASSWORD&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Openssl cannot create a pkcs12 store from cert without key. This is why we create the truststore with the keytool.&lt;/p&gt;&#xA;&lt;p&gt;Create a pkcs12 truststore containing the ca cert.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;keytool -importcert -storetype PKCS12 -keystore $APPLICATION_NAME-truststore.pkcs12 &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -storepass $TRUSTSTORE_PASSWORD -alias ca -file ca_cert.pem -noprompt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Show the content of the truststore.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;keytool -list -storetype PKCS12 -keystore $APPLICATION_NAME-truststore.pkcs12 &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -storepass $TRUSTSTORE_PASSWORD&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Edit 1&lt;/strong&gt;: Removed keystore ca import step. The openssl &lt;em&gt;certfile&lt;/em&gt; parameter accepts a bundled .pem containing trusted certs.&lt;br&gt;&#xA;&lt;strong&gt;Edit 2&lt;/strong&gt;: Removed the create empty truststore step. Keytool will create the truststore file if it does not exist.&lt;/p&gt;&#xA;&lt;p&gt;Not sure if it is a bug that openssl cannot create pkcs12 stores from certs without keys. Nonetheless, the two step workflow is a convenient solution. Openssl creates the initial pkcs12 store and the keytool manipulates the store as required.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: It seems you cannot import a certificate and its key with keytool. So you need to create the store with openssl in order to import the key.&lt;/p&gt;&#xA;&lt;p&gt;Source: &lt;a href=&#34;https://stackoverflow.com/questions/906402/how-to-import-an-existing-x509-certificate-and-private-key-in-java-keystore-to-u&#34;&gt;Stackoverflow - How to import an existing x509 certificate and private key in Java keystore to use in SSL?&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create a certificate authority and sign server certificates without prompting using openssl</title>
      <link>https://janikvonrotz.ch/2019/01/21/create-a-certificate-authority-ca-and-sign-server-certificates-without-prompting-using-openssl/</link>
      <pubDate>Mon, 21 Jan 2019 16:20:35 +0100</pubDate>
      <guid>https://janikvonrotz.ch/2019/01/21/create-a-certificate-authority-ca-and-sign-server-certificates-without-prompting-using-openssl/</guid>
      <description>&lt;p&gt;Most of the times people want to get a certificate for the hostname &lt;em&gt;localhost&lt;/em&gt;, &lt;a href=&#34;https://letsencrypt.org/docs/certificates-for-localhost/&#34;&gt;let&amp;rsquo;s encrypt wrote a nice post&lt;/a&gt; about this, but sometimes people want a certificate for any hostname. And further, signed by a custom CA and if possible should the key material be generated without user interaction. In this post I have covered the less likely case.&lt;/p&gt;&#xA;&lt;p&gt;Below you&amp;rsquo;ll find a list of bash commands. You can copy and paste all of them into a bash script or run each command at a time in the shell.&lt;/p&gt;&#xA;&lt;p&gt;Set environment variables for key material configuration.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CA_CERT_PASSWORD&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;password&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SERVER_CERT_PASSWORD&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;password&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;localhost&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SERVER_ALT_NAME&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;localhost&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create the CA key.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssl genrsa -des3 -passout pass:$CA_CERT_PASSWORD -out ca_key.pem &lt;span style=&#34;color:#ae81ff&#34;&gt;4096&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create the CA certificate.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssl req -x509 -new -nodes -key ca_key.pem -passin pass:$CA_CERT_PASSWORD -sha256 -days &lt;span style=&#34;color:#ae81ff&#34;&gt;1825&lt;/span&gt; -out ca_cert.pem &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -subj &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/C=CH/ST=Bern/L=Bern/O=AdNovum AG/CN=ca&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create the server key.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssl genrsa -des3 -passout pass:$SERVER_CERT_PASSWORD -out &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;_key.pem &lt;span style=&#34;color:#ae81ff&#34;&gt;2048&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create the server certificate signing request.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssl req -new -key &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;_key.pem -passin pass:$SERVER_CERT_PASSWORD -out &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;.csr &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -subj &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/CN=&lt;/span&gt;$SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create server certificate extension configuration.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat &amp;gt; ./&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;.cnf &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;&amp;lt;EOT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;authorityKeyIdentifier=keyid,issuer&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;keyUsage=digitalSignature&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;extendedKeyUsage=serverAuth&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;subjectAltName = @alt_names&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;[alt_names]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;DNS.1 = $SERVER_ALT_NAME&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;EOT&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sign the server certificate signing request.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssl x509 -req -in &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;.csr -CA ca_cert.pem -CAkey ca_key.pem -passin pass:$CA_CERT_PASSWORD -CAcreateserial &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -out &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;_cert.pem -days &lt;span style=&#34;color:#ae81ff&#34;&gt;1825&lt;/span&gt; -sha256 -extfile &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;.cnf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To create additional server certificates use the snippet below.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CA_CERT_PASSWORD&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;password&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SERVER_CERT_PASSWORD&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;password&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;hostname&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SERVER_ALT_NAME&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;hostname&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssl genrsa -des3 -passout pass:$SERVER_CERT_PASSWORD -out &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;_key.pem &lt;span style=&#34;color:#ae81ff&#34;&gt;2048&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssl req -new -key &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;_key.pem -passin pass:$SERVER_CERT_PASSWORD -out &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;.csr &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -subj &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/CN=&lt;/span&gt;$SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat &amp;gt; ./&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;.cnf &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;&amp;lt;EOT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;authorityKeyIdentifier=keyid,issuer&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;keyUsage=digitalSignature&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;extendedKeyUsage=serverAuth&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;subjectAltName = @alt_names&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;[alt_names]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;DNS.1 = $SERVER_ALT_NAME&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;EOT&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssl x509 -req -in &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;.csr -CA ca_cert.pem -CAkey ca_key.pem -passin pass:$CA_CERT_PASSWORD -CAcreateserial &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -out &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;_cert.pem -days &lt;span style=&#34;color:#ae81ff&#34;&gt;1825&lt;/span&gt; -sha256 -extfile &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;SERVER_CERT_CN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;.cnf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Configure Let’s Encrypt auto renewal for certificates</title>
      <link>https://janikvonrotz.ch/2016/02/14/configure-lets-encrypt-auto-renewal-for-certificates/</link>
      <pubDate>Sun, 14 Feb 2016 22:28:26 +0000</pubDate>
      <guid>https://janikvonrotz.ch/2016/02/14/configure-lets-encrypt-auto-renewal-for-certificates/</guid>
      <description>&lt;p&gt;&lt;em&gt;This post is part of my &lt;a href=&#34;https://janikvonrotz.ch/your-own-virtual-private-server-hosting-solution/&#34;&gt;Your own Virtual Private Server hosting solution&lt;/a&gt; project.&lt;/em&gt;&lt;br&gt;&#xA;&lt;em&gt;Get the latest version of this article here: &lt;a href=&#34;https://gist.github.com/ddce334cd8ab21a40941&#34;&gt;https://gist.github.com/ddce334cd8ab21a40941&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;&#xA;&lt;p&gt;Let’s Encrypt is a free, automated, and open certificate authority (CA), run for the public’s benefit. So far it works well and makes it easy to obtain a free certificate. Now the created certificates will expire withing 90 days. This post will show you how you can auto renew these certificates before they expire.&lt;/p&gt;&#xA;&lt;h1 id=&#34;requirements&#34;&gt;Requirements&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://janikvonrotz.ch/2014/03/13/deploy-ubuntu-server/&#34;&gt;Ubuntu server&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://janikvonrotz.ch/2015/10/22/install-python/&#34;&gt;Python&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://janikvonrotz.ch/2014/03/31/install-nginx/&#34;&gt;Nginx&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://janikvonrotz.ch/2014/04/01/nginx-minimal-website/&#34;&gt;Nginx minimal website&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://janikvonrotz.ch/2014/04/03/nginx-ssl-website/&#34;&gt;Nginx SSL website&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://janikvonrotz.ch/2015/12/04/install-lets-encrypt-and-create-a-free-ssl-certificate/&#34;&gt;Install Let’s Encrypt and create a free SSL certificate&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;installation&#34;&gt;Installation&lt;/h1&gt;&#xA;&lt;p&gt;Create a new bash script and it to the monthly cron folder for sheduling.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;cd /etc/cron.monthly/&#xA;sudo vi letsencrypt-renew&#xA;sudo chmod +x letsencrypt-renew&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Add the following code to the &lt;code&gt;letsencrypt-renew&lt;/code&gt;script.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;cd /usr/local/src/letsencrypt&#xA;sudo service nginx stop&#xA;sudo -H ./letsencrypt-auto renew&#xA;sudo service nginx start&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Now run the script and check if it succeeds.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo ./letsencrypt-renew&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h1 id=&#34;source&#34;&gt;Source&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://letsencrypt.readthedocs.org/en/latest/using.html#renewal&#34;&gt;Official Let&amp;rsquo;s Encrypt client documentation - Renewal&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Install Let’s Encrypt and create a free SSL certificate</title>
      <link>https://janikvonrotz.ch/2015/12/04/install-lets-encrypt-and-create-a-free-ssl-certificate/</link>
      <pubDate>Fri, 04 Dec 2015 11:23:57 +0000</pubDate>
      <guid>https://janikvonrotz.ch/2015/12/04/install-lets-encrypt-and-create-a-free-ssl-certificate/</guid>
      <description>&lt;p&gt;&lt;em&gt;This post is part of my &lt;a href=&#34;https://janikvonrotz.ch/your-own-virtual-private-server-hosting-solution/&#34;&gt;Your own Virtual Private Server hosting solution&lt;/a&gt; project.&lt;/em&gt;&lt;br&gt;&#xA;&lt;em&gt;Get the latest version of this article here: &lt;a href=&#34;https://gist.github.com/2e0ee4cf7e04bb75742d&#34;&gt;https://gist.github.com/2e0ee4cf7e04bb75742d&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://letsencrypt.org/&#34;&gt;Let’s Encrypt&lt;/a&gt; is a free, automated, and open certificate authority (CA), run for the public’s benefit. Let’s Encrypt is a service provided by the Internet Security Research Group (ISRG). This guide shows you how you can obtain a free SSL certificate.&lt;/p&gt;&#xA;&lt;h1 id=&#34;requirements&#34;&gt;Requirements&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://janikvonrotz.ch/2014/03/13/deploy-ubuntu-server/&#34;&gt;Ubuntu server&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://janikvonrotz.ch/2015/10/22/install-python/&#34;&gt;Python&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://janikvonrotz.ch/2014/03/31/install-nginx/&#34;&gt;Nginx&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://janikvonrotz.ch/2014/04/01/nginx-minimal-website/&#34;&gt;Nginx minimal website&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://janikvonrotz.ch/2014/04/03/nginx-ssl-website/&#34;&gt;Nginx SSL website&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;installation&#34;&gt;Installation&lt;/h1&gt;&#xA;&lt;p&gt;Download the client code from the Github repository.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;cd /usr/local/src/&#xA;sudo git clone https://github.com/letsencrypt/letsencrypt&#xA;cd letsencrypt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Run the letsencrypt wrapper script.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo -h ./letsencrypt-auto&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;If you experience an error like this:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:79: &#xA;          InsecurePlatformWarning: A true SSLContext object is not available. &#xA;          This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. &#xA;          For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.&#xA;  InsecurePlatformWarning&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You have to update some pyhton libraries by running this command.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;pip install pyopenssl ndg-httpsclient pyasn1&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Now you can request a new ssl certificate. I assume you&amp;rsquo;re running Nignx as your web server. To request a certificate we have to stop the web service temporarily.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo service nginx stop&#xA;sudo -H ./letsencrypt-auto certonly --email hostmaster@domain.com -d domain.com&#xA;sudo service nginx start&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;The new certificates are stored here: &lt;code&gt;/etc/letsencrypt/live/domain.com&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Update the Nginx configuration file for your domain.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo vi /etc/nginx/conf.d/domain.com.conf&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Add the new certificates:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;&#xA;ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Test your Nginx configuration file.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo nginx -t&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;And restart the service&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo service nginx reload&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Finally check your Nginx SSL configuration here: &lt;a href=&#34;https://globalsign.ssllabs.com/&#34;&gt;https://globalsign.ssllabs.com/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;source&#34;&gt;Source&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://letsencrypt.readthedocs.org/en/latest/&#34;&gt;Official Let&amp;rsquo;s Encrypt client documentation&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>free SSL for everybody</title>
      <link>https://janikvonrotz.ch/2015/03/23/free-ssl-for-everybody/</link>
      <pubDate>Mon, 23 Mar 2015 09:09:11 +0000</pubDate>
      <guid>https://janikvonrotz.ch/2015/03/23/free-ssl-for-everybody/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://letsencrypt.org/&#34;&gt;Let&amp;rsquo;s Encrypt&lt;/a&gt; is the latest initiative by the &lt;a href=&#34;https://letsencrypt.org/about/&#34;&gt;Internet Security Research Group (ISRG)&lt;/a&gt;.&#xA;Their goal is simple, every site on the internet has to be SSL secured.&lt;/p&gt;&#xA;&lt;p&gt;They want to achieve that by serving an open certificate authority (CA) and also provide a tool to set up a secured site the easiest way possible.&lt;/p&gt;&#xA;&lt;p&gt;And now the big deal about this, their service is free of charge!&lt;/p&gt;&#xA;&lt;p&gt;If this is really a thing, it will be a disaster for the SSL economy. As you might know SSL certificates are everything else than cheap. So good luck to every company that relays on selling SSL certificates as their core competence.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Configure hybrid search results from SharePoint Online in SharePoint on-premise</title>
      <link>https://janikvonrotz.ch/2014/05/14/configure-hybrid-search-results-from-sharepoint-online-in-sharepoint-on-premise/</link>
      <pubDate>Wed, 14 May 2014 07:03:29 +0000</pubDate>
      <guid>https://janikvonrotz.ch/2014/05/14/configure-hybrid-search-results-from-sharepoint-online-in-sharepoint-on-premise/</guid>
      <description>&lt;p&gt;&lt;em&gt;This post of is part of my &lt;a href=&#34;https://janikvonrotz.ch/projects/install-sharepoint-2013-three-tier-farm/&#34;&gt;Install SharePoint 2013 Three-tier Farm&lt;/a&gt; project.&lt;/em&gt;&#xA;&lt;em&gt;Get the latest version of this article here: &lt;a href=&#34;https://gist.github.com/10871110&#34;&gt;https://gist.github.com/10871110&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;&#xA;&lt;p&gt;In this post I&amp;rsquo;ll show you how to get search results from your SharePoint Online in your SharePoint 2013 on-premise search center.&#xA;&lt;img src=&#34;https://janikvonrotz.ch/wp-content/uploads/2014/04/SharePoint-Hybrid-Outbound-search.jpg&#34; alt=&#34;SharePoint Hybrid Outbound search&#34;&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;requirements&#34;&gt;Requirements&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;User synchronisation ActiveDirectory to Office 365 with DirSync&lt;/li&gt;&#xA;&lt;li&gt;DirSync password sync or ADFS SSO&lt;/li&gt;&#xA;&lt;li&gt;SharePoint Online&lt;/li&gt;&#xA;&lt;li&gt;SharePoint 2013 on-premise&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Enterprise Search service&lt;/li&gt;&#xA;&lt;li&gt;SharePoint Online Management Shell&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;instructions&#34;&gt;Instructions&lt;/h1&gt;&#xA;&lt;p&gt;All configuration will be done either in the Search Administration of the Central Administration or in the PowerShell console of your on-premise SharePoint 2013 server.&lt;/p&gt;&#xA;&lt;h1 id=&#34;set-up-sever-to-server-trust&#34;&gt;Set up Sever to Server Trust&lt;/h1&gt;&#xA;&lt;h2 id=&#34;export-certificates&#34;&gt;Export certificates&lt;/h2&gt;&#xA;&lt;p&gt;To create a server to server trust we need two certificates.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;[certificate name].pfx&lt;/strong&gt;: In order to replace the STS certificate, the certificate is needed in Personal Information Exchange (PFX) format including the private key.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;[certificate name].cer&lt;/strong&gt;: In order to set up a trust with Office 365 and Windows Azure ACS, the certificate is needed in CER Base64 format.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;First launch the &lt;strong&gt;Internet Information Services (IIS) Manager&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;Select your &lt;strong&gt;SharePoint web server&lt;/strong&gt; and double-click &lt;strong&gt;Server Certificates&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;In the &lt;strong&gt;Actions&lt;/strong&gt; pane, click &lt;strong&gt;Create Self-Signed Certificate&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;Enter a name for the certificate and save it with &lt;strong&gt;OK&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;To export the new certificate in the Pfx format select it and click &lt;strong&gt;Export&lt;/strong&gt; in the &lt;strong&gt;Actions&lt;/strong&gt; pane&lt;/li&gt;&#xA;&lt;li&gt;Fill the fields and click &lt;strong&gt;OK&lt;/strong&gt;&#xA;Export to: &lt;code&gt;C:\[certificate name].pfx&lt;/code&gt;&#xA;Password: &lt;code&gt;[password]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Also we need to export the certificate in the CER Base64 format. For that purpose make a &lt;strong&gt;right-click&lt;/strong&gt; on the certificate and click on &lt;strong&gt;View&amp;hellip;&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;Click the &lt;strong&gt;Details&lt;/strong&gt; tab and then click &lt;strong&gt;Copy to File&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;On the Welcome to the Certificate Export Wizard page, click &lt;strong&gt;Next&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;On the Export Private Key page, click &lt;strong&gt;Next&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;On the Export File Format page, click &lt;strong&gt;Base-64 encoded X.509&lt;/strong&gt; (.CER), and then click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#xA;&lt;li&gt;As file name enter &lt;code&gt;C:\[certificate name].cer&lt;/code&gt; and then click &lt;strong&gt;Next&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;Finish the export&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;import-the-new-sts-sharepoint-token-service-certificate&#34;&gt;Import the new STS (SharePoint Token Service) certificate&lt;/h2&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s update the certificate on the STS. Configure and run the PowerShell script below on your SharePoint server.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;-not&lt;/span&gt; (Get-PSSnapin &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Microsoft.SharePoint.PowerShell&amp;#34;&lt;/span&gt; -ErrorAction SilentlyContinue)){Add-PSSnapin &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Microsoft.SharePoint.PowerShell&amp;#34;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# set the cerficates paths and password&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$PfxCertPath = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;c:\[certificate name].pfx&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$PfxCertPassword = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[password]&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$X64CertPath = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;c:\[certificate name].cer&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# get the encrypted pfx certificate object&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$PfxCert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $PfxCertPath, $PfxCertPassword, &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# import it&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Set-SPSecurityTokenServiceConfig -ImportSigningCertificate $PfxCert&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Type &lt;strong&gt;Yes&lt;/strong&gt; when prompted with the following message.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;You are about to change the signing certificate for the Security Token Service. Changing the certificate to an invalid, inaccessible or non-existent certificate will cause your SharePoint installation to stop functioning. Refer to the following article for instructions on how to change this certificate: &lt;a href=&#34;http://go.microsoft.com/fwlink/?LinkID=178475&#34;&gt;http://go.microsoft.com/fwlink/?LinkID=178475&lt;/a&gt;. Are you sure, you want to continue?&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Restart IIS so STS picks up the new certificate.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;amp; iisreset&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;amp; net stop SPTimerV4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;amp; net start SPTimerV4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now validate the certificate replacement by running several PowerShell commands and compare their outputs.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# set the cerficates paths and password&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$PfxCertPath = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;c:\[certificate name].pfx&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$PfxCertPassword = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[password]&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# get the encrypted pfx certificate object&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $PfxCertPath, $PfxCertPassword, &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# compare the output above with this output&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(Get-SPSecurityTokenServiceConfig).LocalLoginProvider.SigningCertificate&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;establish-the-server-to-server-trust&#34;&gt;Establish the server to server trust&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;-not&lt;/span&gt; (Get-PSSnapin &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Microsoft.SharePoint.PowerShell&amp;#34;&lt;/span&gt; -ErrorAction SilentlyContinue)){Add-PSSnapin &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Microsoft.SharePoint.PowerShell&amp;#34;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Import-Module MSOnline &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Import-Module MSOnlineExtended&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# set the cerficates paths and password&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$PfxCertPath = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;c:\[certificate name].pfx&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$PfxCertPassword = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[password]&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$X64CertPath = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;c:\[certificate name].cer&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# set the onpremise domain that you added to Office 365&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$SPCN = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sharepoint.domain.com&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# your onpremise SharePoint site url&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$SPSite=&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://sharepoint&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# don&amp;#39;t change this value&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$SPOAppID=&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;00000003-0000-0ff1-ce00-000000000000&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# get the encrypted pfx certificate object&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$PfxCert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $PfxCertPath, $PfxCertPassword, &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# get the raw data&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$PfxCertBin = $PfxCert.GetRawCertData()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# create a new certificate object&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$X64Cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# import the base 64 encoded certificate&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$X64Cert.Import($X64CertPath)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# get the raw data&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$X64CertBin = $X64Cert.GetRawCertData()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# save base 64 string in variable&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$CredValue = [&lt;span style=&#34;color:#66d9ef&#34;&gt;System.Convert&lt;/span&gt;]::ToBase64String($X64CertBin)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# connect to office 3656&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Connect-MsolService&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# register the on-premise STS as service principal in Office 365&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# add a new service principal&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;New-MsolServicePrincipalCredential -AppPrincipalId $SPOAppID -Type asymmetric -Usage Verify -Value $CredValue&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$MsolServicePrincipal = Get-MsolServicePrincipal -AppPrincipalId $SPOAppID&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$SPServicePrincipalNames = $MsolServicePrincipal.ServicePrincipalNames&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$SPServicePrincipalNames.Add(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$SPOAppID&lt;span style=&#34;color:#e6db74&#34;&gt;/&lt;/span&gt;$SPCN&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Set-MsolServicePrincipal -AppPrincipalId $SPOAppID -ServicePrincipalNames $SPServicePrincipalNames&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# get the online name identifier&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$MsolCompanyInformationID = (Get-MsolCompanyInformation).ObjectID&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$MsolServicePrincipalID = (Get-MsolServicePrincipal -ServicePrincipalName $SPOAppID).ObjectID&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$MsolNameIdentifier = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$MsolServicePrincipalID&lt;span style=&#34;color:#e6db74&#34;&gt;@&lt;/span&gt;$MsolCompanyInformationID&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# establish the trust from on-premise with ACS (Azure Control Service)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# add a new authenticatio realm&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$SPSite = Get-SPSite $SPSite&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$SPAppPrincipal = Register-SPAppPrincipal -site $SPSite.rootweb -nameIdentifier $MsolNameIdentifier -displayName &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SharePoint Online&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Set-SPAuthenticationRealm -realm $MsolServicePrincipalID&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# register the ACS application proxy and token issuer&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;New-SPAzureAccessControlServiceApplicationProxy -Name &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ACS&amp;#34;&lt;/span&gt; -MetadataServiceEndpointUri &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://accounts.accesscontrol.windows.net/metadata/json/1/&amp;#34;&lt;/span&gt; -DefaultProxyGroup&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;New-SPTrustedSecurityTokenIssuer -MetadataEndpoint &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://accounts.accesscontrol.windows.net/metadata/json/1/&amp;#34;&lt;/span&gt; -IsTrustBroker -Name &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ACS&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;add-a-new-result-source&#34;&gt;Add a new result source&lt;/h1&gt;&#xA;&lt;p&gt;To get search results from SharePoint Online we have to add a new result source. Run the following script in a PowerShell ISE session on your SharePoint 2013 on-premise server.&#xA;Don&amp;rsquo;t forget to update the settings region&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;-not&lt;/span&gt; (Get-PSSnapin &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Microsoft.SharePoint.PowerShell&amp;#34;&lt;/span&gt; -ErrorAction SilentlyContinue)){Add-PSSnapin &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Microsoft.SharePoint.PowerShell&amp;#34;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# region settings &lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$RemoteSharePointUrl = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://[example].sharepoint.com&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ResultSourceName = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SharePoint Online&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$QueryTransform = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{searchTerms}&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$Provier = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SharePoint-Remoteanbieter&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# region settings end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$SPEnterpriseSearchServiceApplication = Get-SPEnterpriseSearchServiceApplication&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$FederationManager = New-Object Microsoft.Office.Server.Search.Administration.Query.FederationManager($SPEnterpriseSearchServiceApplication)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$SPEnterpriseSearchOwner = Get-SPEnterpriseSearchOwner -Level Ssa  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ResultSource = $FederationManager.GetSourceByName($ResultSourceName, $SPEnterpriseSearchOwner)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(!$ResultSource){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Write-Host &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Result source does not exist. Creating...&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $ResultSource = $FederationManager.CreateSource($SPEnterpriseSearchOwner)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ResultSource.Name = $ResultSourceName&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ResultSource.ProviderId = $FederationManager.ListProviders()[$Provier].Id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ResultSource.ConnectionUrlTemplate = $RemoteSharePointUrl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ResultSource.CreateQueryTransform($QueryTransform)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ResultSource.Commit()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;add-a-new-query-rule&#34;&gt;Add a new query rule&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;In the Search Administration click on &lt;strong&gt;Query Rules&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;Select &lt;strong&gt;Local SharePoint&lt;/strong&gt; as Result Source&lt;/li&gt;&#xA;&lt;li&gt;Click &lt;strong&gt;New Query Rule&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;Enter a Rule name f.g. Search results from SharePoint Online&lt;/li&gt;&#xA;&lt;li&gt;Expand the &lt;strong&gt;Context&lt;/strong&gt; section&lt;/li&gt;&#xA;&lt;li&gt;Under &lt;strong&gt;Query is performed on these sources&lt;/strong&gt; click on &lt;strong&gt;Add Source&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;Select your SharePoint Online result source&lt;/li&gt;&#xA;&lt;li&gt;In the &lt;strong&gt;Query Conditions&lt;/strong&gt; section click on &lt;strong&gt;Remove Condition&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;In the &lt;strong&gt;Actions&lt;/strong&gt; section click on &lt;strong&gt;Add Result Block&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;As &lt;strong&gt;title&lt;/strong&gt; enter &lt;strong&gt;Results for &amp;ldquo;{subjectTerms}&amp;rdquo; from SharePoint Online&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;In the &lt;strong&gt;Search this Source&lt;/strong&gt; dropdown select your SharePoint Online result source&lt;/li&gt;&#xA;&lt;li&gt;Select 3 in the &lt;strong&gt;Items&lt;/strong&gt; dropdown&lt;/li&gt;&#xA;&lt;li&gt;Expand the &lt;strong&gt;Settings&lt;/strong&gt; section and select &lt;strong&gt;&amp;ldquo;More&amp;rdquo; link goes to the following URL&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;In the box below enter this Url &lt;strong&gt;https://[example].sharepoint.com/search/pages/results.aspx?k={subjectTerms}&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;Select &lt;strong&gt;This block is always shown above core results&lt;/strong&gt; and click the OK button&lt;/li&gt;&#xA;&lt;li&gt;Save the new query rule&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h1 id=&#34;source&#34;&gt;Source&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://technet.microsoft.com/en-us/library/dn197173.aspx&#34;&gt;Display hybrid search results in SharePoint Server 2013&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;http://blogs.msdn.com/b/spses/archive/2013/10/22/office-365-configure-hybrid-search-with-directory-synchronization.aspx&#34;&gt;Office 365-Configure Hybrid Search with Directory Synchronization –Password Sync&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;http://blogs.msdn.com/b/spses/archive/2014/01/05/office-365-configure-hybrid-search-with-directory-synchronization-password-sync-part2.aspx&#34;&gt;Office 365-Configure Hybrid Search with Directory Synchronization –Password Sync –Part2&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Nginx SSL website</title>
      <link>https://janikvonrotz.ch/2014/04/03/nginx-ssl-website/</link>
      <pubDate>Thu, 03 Apr 2014 07:54:04 +0000</pubDate>
      <guid>https://janikvonrotz.ch/2014/04/03/nginx-ssl-website/</guid>
      <description>&lt;p&gt;&lt;em&gt;This post is part of my &lt;a href=&#34;https://janikvonrotz.ch/your-own-virtual-private-server-hosting-solution/&#34;&gt;Your own Virtual Private Server hosting solution&lt;/a&gt; project.&lt;/em&gt;&lt;br&gt;&#xA;&lt;em&gt;Get the latest version of this article here: &lt;a href=&#34;https://gist.github.com/9408793&#34;&gt;https://gist.github.com/9408793&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;&#xA;&lt;p&gt;This best practice shows you the most advanced SSL configurations for your Nginx website.&#xA;For productive usage it&amp;rsquo;s recommended to use only public-signed certificates.&lt;/p&gt;&#xA;&lt;h1 id=&#34;requirements&#34;&gt;Requirements&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://janikvonrotz.ch/2014/03/13/deploy-ubuntu-server/&#34;&gt;Ubuntu server&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://janikvonrotz.ch/2014/03/26/get-a-free-verified-ssl-certificate-from-startssl/&#34;&gt;Get a free verified SSL certificate from StartSSL (optional)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://janikvonrotz.ch/2014/03/27/convert-ssl-certificates/&#34;&gt;Converted SSL certificates (optional)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://janikvonrotz.ch/2014/03/31/install-nginx/&#34;&gt;Nginx&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://janikvonrotz.ch/2014/04/01/nginx-minimal-website/&#34;&gt;Nginx minimal website&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;installation&#34;&gt;Installation&lt;/h1&gt;&#xA;&lt;p&gt;Create a ssl folder to store key and cert files&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo mkdir /etc/nginx/ssl&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Upload your key and cert files into this folder.&lt;/p&gt;&#xA;&lt;p&gt;Now we need to generate stronger DHE parameter:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;cd /etc/ssl/certs&#xA;sudo openssl dhparam -out dhparam.pem 4096&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Add this Nginx configuration to your website config.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;server{&#xA;&#xA;        # set ssl port&#xA;        listen 443;&#xA;        &#xA;        ...&#xA;        &#xA;        # basic ssl configuration&#xA;        ssl on;&#xA;        ssl_certificate /etc/nginx/ssl/[certificate.crt.ca.bundle];&#xA;        ssl_certificate_key /etc/nginx/ssl/[host].key;&#xA;&#xA;        # Force to use stronger DHE parameters &#xA;        ssl_dhparam /etc/ssl/certs/dhparam.pem;&#xA;        &#xA;        # limitation of ssl protocols and algortyhtms&#xA;        &#xA;        # we don&amp;#39;t want to support SSL v2 and SSL v3, it&amp;#39;s known to be insecure&#xA;        # FIPS 140-2 compliance, TLS1+ only&#xA;        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;&#xA;        &#xA;        # don&amp;#39;t let the client decide what ciphers to use, we&amp;#39;ve told the server which to allow&#xA;        ssl_ciphers &amp;#39;EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH&amp;#39;;&#xA;        ssl_prefer_server_ciphers on;&#xA;        &#xA;        # reduce ssl cpu load&#xA;        &#xA;        # we want to enable ssl session resumption to avoid&#xA;        # having to start the handshake from scratch each page load&#xA;        # so first we enable a shared cache, named SSL (creative!) that is 10mb large&#xA;        ssl_session_cache shared:SSL:10m;&#xA;        &#xA;        # save things in the cache for10 minutes&#xA;        # if you&amp;#39;re not making a request at least every 10 minutes, this isn&amp;#39;t going&#xA;        # to accomplish anything anyway&#xA;        ssl_session_timeout 10m;&#xA;        &#xA;        ...&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you wish to redirect all http traffic to https you can add this additional Nginx server configuration.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;server{&#xA;&#xA;      listen 80;&#xA;      &#xA;      server_name [host];&#xA;&#xA;      return 301 https://[host]$request_uri;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Test config and reload Nginx service.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo nginx -t &amp;amp;&amp;amp; sudo service nginx reload&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h1 id=&#34;source&#34;&gt;Source&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://nginx.org/en/docs/http/converting_rewrite_rules.html&#34;&gt;Nginx converting rewrite rules&lt;/a&gt;&#xA;&lt;a href=&#34;http://nginx.org/en/docs/http/configuring_https_servers.html&#34;&gt;Configuring HTTPS servers&lt;/a&gt;&#xA;&lt;a href=&#34;https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html&#34;&gt;Strong SSL Security on nginx by Raymii&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Convert SSL certificates</title>
      <link>https://janikvonrotz.ch/2014/03/27/convert-ssl-certificates/</link>
      <pubDate>Thu, 27 Mar 2014 14:01:50 +0000</pubDate>
      <guid>https://janikvonrotz.ch/2014/03/27/convert-ssl-certificates/</guid>
      <description>&lt;p&gt;&lt;em&gt;This post is part of my &lt;a href=&#34;https://janikvonrotz.ch/your-own-virtual-private-server-hosting-solution/&#34;&gt;Your own Virtual Private Server hosting solution&lt;/a&gt; project.&lt;/em&gt;&lt;br&gt;&#xA;&lt;em&gt;Get the latest version of this article here: &lt;a href=&#34;https://gist.github.com/9413205&#34;&gt;https://gist.github.com/9413205&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;requirements&#34;&gt;Requirements&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://janikvonrotz.ch/2014/03/26/get-a-free-verified-ssl-certificate-from-startssl/&#34;&gt;Get a free verified SSL certificate from StartSSL (optional)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;instructions&#34;&gt;Instructions&lt;/h1&gt;&#xA;&lt;p&gt;When buying a certificate from you CA (Certification Authority) e.g. a wildcard certificate for *.example.org, you have to convert this file to different formats in order to use them with your webserver installation.&lt;/p&gt;&#xA;&lt;p&gt;To convert these files use OpenSSL.&lt;/p&gt;&#xA;&lt;p&gt;First file you’ll need is the public certificate.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo openssl pkcs12 -in [yourfile.pfx] -clcerts -nokeys -out [certificate.crt]&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Now you can chose between the encrypted and decrypted key file.&lt;/p&gt;&#xA;&lt;p&gt;If chosing the encrypted key file your webserver will prompt every time starting the web service for the certificate pass-phrase.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo openssl pkcs12 -in [yourfile.pfx] -nocerts -out [keyfile-encrypted.key]&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Otherwise your webserver won’t prompt for an pass-pharase, but be aware, if you’re losing this decrypted key file you certificate will be worthless.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo openssl pkcs12 -in [yourfile.pfx] -nodes -out [keyfile-decrypted.key]&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;certificate-chain&#34;&gt;Certificate chain&lt;/h2&gt;&#xA;&lt;p&gt;During the SSL negotiation, a server provides its certificate along with the &amp;ldquo;intermediate&amp;rdquo; certificates that exist between it and the root. This allows clients to validate the server&amp;rsquo;s certificate without going through a discovery processes that not all browsers support, and for those that do, without an additional performance penalty.&lt;/p&gt;&#xA;&lt;p&gt;Download the CA server certificate on their website&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo sh -c &amp;quot;cat [certificate.crt] &amp;gt; [certificate.crt.ca.bundle]&amp;quot;&#xA;sudo sh -c &amp;quot;cat [certificate.ca.crt] &amp;gt;&amp;gt; [certificate.crt.ca.bundle]&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Get a free verified SSL certificate from StartSSL</title>
      <link>https://janikvonrotz.ch/2014/03/26/get-a-free-verified-ssl-certificate-from-startssl/</link>
      <pubDate>Wed, 26 Mar 2014 10:29:07 +0000</pubDate>
      <guid>https://janikvonrotz.ch/2014/03/26/get-a-free-verified-ssl-certificate-from-startssl/</guid>
      <description>&lt;p&gt;&lt;em&gt;This post is part of my &lt;a href=&#34;https://janikvonrotz.ch/your-own-virtual-private-server-hosting-solution/&#34;&gt;Your own Virtual Private Server hosting solution&lt;/a&gt; project.&lt;/em&gt;&lt;br&gt;&#xA;&lt;em&gt;Get the latest version of this article here: &lt;a href=&#34;https://gist.github.com/9430791&#34;&gt;https://gist.github.com/9430791&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;SSL certificates aren&amp;rsquo;t cheap. You can create them on your own for private use.&#xA;However for internet use you have to get a verified certificate.&lt;/p&gt;&#xA;&lt;p&gt;Luckily there&amp;rsquo;s &lt;a href=&#34;https://www.startssl.com/&#34;&gt;https://www.startssl.com/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;They offer you a class 1 SSL certificate for free. Their site might not look trustworthy, but I&amp;rsquo;m quite shure they do a great job.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Apache vHost with SSL Certicate converted from .pfx Export file</title>
      <link>https://janikvonrotz.ch/2014/01/27/apache-vhost-with-ssl-certicate-converted-from-pfx-export-file/</link>
      <pubDate>Mon, 27 Jan 2014 14:03:40 +0000</pubDate>
      <guid>https://janikvonrotz.ch/2014/01/27/apache-vhost-with-ssl-certicate-converted-from-pfx-export-file/</guid>
      <description>&lt;p&gt;This is an simple example for an Apache vHost SSL vHost configuration:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;VirtualHost 192.168.0.1:443&amp;gt;&#xA;DocumentRoot /var/www/&#xA;SSLEngine on&#xA;SSLCertificateFile /path/to/certificate.crt&#xA;SSLCertificateKeyFile /path/to/keyfile.key&#xA;&amp;lt;/VirtualHost&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;When buying a certificate from you CA (Certification Authority) e.g. a wildcard certificate for *.domain.com, you have to convert this file to different formats in order to use them with you Apache installation.&lt;/p&gt;&#xA;&lt;p&gt;To convert these files use &lt;!-- raw HTML omitted --&gt;OpenSSL&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;&#xA;&lt;p&gt;First file you&amp;rsquo;ll need is the public certificate.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;openssl pkcs12 -in [yourfile.pfx] -clcerts -nokeys -out [certificate.crt]&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now you can chose between the encrypted and decrypted key file.&lt;/p&gt;&#xA;&lt;p&gt;If chosing the encrypted key file, Apache will prompt every time starting or starting the web service for the certificate pass-phrase.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;openssl pkcs12 -in [yourfile.pfx] -nocerts -out [keyfile-encrypted.key]&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Otherwise Apache won&amp;rsquo;t prompt for an pass-pharase, but be aware, if you&amp;rsquo;re losing this decrypted key file you certificate will be worthless.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;openssl rsa -in [keyfile-encrypted.key] -out [keyfile-decrypted.key]&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
  </channel>
</rss>
