<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="346301" data-post-id="346301">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="chgeuer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/chgeuer/120/10510_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  chgeuer
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>How about this one:</p>
<aside class="onebox githubgist" data-onebox-src="https://gist.github.com/chgeuer/b8d87f442846f9fe6aa1bde98b36fb7d">
  <header class="source">

      <a href="https://gist.github.com/chgeuer/b8d87f442846f9fe6aa1bde98b36fb7d" target="_blank" rel="noopener nofollow ugc">gist.github.com</a>
  </header>

  <article class="onebox-body">
    <h4><a href="https://gist.github.com/chgeuer/b8d87f442846f9fe6aa1bde98b36fb7d" target="_blank" rel="noopener nofollow ugc">https://gist.github.com/chgeuer/b8d87f442846f9fe6aa1bde98b36fb7d</a></h4>



  </article>

  <div class="onebox-metadata">
    
    
  </div>

  <div style="clear: both"></div>
</aside>

<h1><a name="p-346301-a-small-demo-to-connect-to-an-azure-postgresql-db-using-postgrex-1" class="anchor" href="#p-346301-a-small-demo-to-connect-to-an-azure-postgresql-db-using-postgrex-1" aria-label="Heading link" rel="nofollow"></a>A small demo to connect to an Azure PostgreSQL DB using Postgrex</h1>
<pre data-code-wrap="elixir"><code class="lang-elixir">Mix.install(
  [
    {:postgrex, "~&gt; 0.19.3"},
    {:req, "~&gt; 0.5.7"}
  ],
  consolidate_protocols: false
)
</code></pre>
<h2><a name="p-346301-a-small-utility-to-download-certs-into-memory-2" class="anchor" href="#p-346301-a-small-utility-to-download-certs-into-memory-2" aria-label="Heading link" rel="nofollow"></a>A small utility to download certs into memory</h2>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MicrosoftCerts do
  # https://learn.microsoft.com/en-us/azure/postgresql/flexible-server/concepts-networking-ssl-tls#download-root-ca-certificates-and-update-application-clients-in-certificate-pinning-scenarios
  # https://www.digicert.com/kb/digicert-root-certificates.htm
  # https://dl.cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem

  defp get_pem(url) do
    %Req.Response{status: 200, body: pem} = Req.get!(url: url)
    pem
  end

  defp get_cer(url) do
    %Req.Response{status: 200, body: cer} = Req.get!(url: url)

    cert_to_pem(cer)
  end

  defp cert_to_pem(cert) when is_binary(cert) do
    cert
    |&gt; Base.encode64()
    |&gt; String.replace(~r/.{64}/, "\\0\n")
    |&gt; then(&amp;"-----BEGIN CERTIFICATE-----\n#{&amp;1}\n-----END CERTIFICATE-----\n\n")
  end

  def ca_pem_data do
    [
      "https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem" |&gt; get_pem(),
      "https://www.microsoft.com/pkiops/certs/microsoft%20azure%20rsa%20tls%20issuing%20ca%2004%20-%20xsign.crt"
      |&gt; get_cer(),
      "https://www.microsoft.com/pkiops/certs/Microsoft%20RSA%20Root%20Certificate%20Authority%202017.crt"
      |&gt; get_cer()
    ]
    |&gt; Enum.join("\n\n\n")
  end

  def ssl_opts(hostname) do
    [
      # log_level: :all,
      protocol: :tls,
      protocol_version: :"tlsv1.3",
      verify: :verify_peer,
      # cacertfile: temp_ca_file,
      cacerts:
        ca_pem_data()
        |&gt; :public_key.pem_decode()
        |&gt; Enum.map(fn {:Certificate, der, :not_encrypted} -&gt; der end),
      server_name_indication: String.to_charlist(hostname),
      depth: 3
    ]
  end
end
</code></pre>
<h2><a name="p-346301-connect-3" class="anchor" href="#p-346301-connect-3" aria-label="Heading link" rel="nofollow"></a>Connect</h2>
<pre data-code-wrap="elixir"><code class="lang-elixir">db_host = "foo.postgres.database.azure.com"

{:ok, conn} = Postgrex.start_link(
  hostname: db_host,
  port: 5432,
  username: "adminpostgrex",
  password: "xxx",
  database: "postgres",
  ssl: MicrosoftCerts.ssl_opts(db_host)
  # stacktrace: true,
  # show_sensitive_data_on_connection_error: true,
)
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="346301" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/how-to-connect-an-elixir-application-with-azure-database-for-postgresql-using-ssl-certificate/44529/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-346301" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="346301"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #11"></div>
  </section>
</div>
    <div class="postbit" id="346366" data-post-id="346366">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="chgeuer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/chgeuer/120/10510_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  chgeuer
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Here’s a quick blog article</p>
<aside class="onebox allowlistedgeneric" data-onebox-src="https://cookbook.geuer-pollmann.de/azure/postgrex-on-azure">
  <header class="source">
      <img src="https://cookbook.geuer-pollmann.de/~gitbook/icon?size=small&amp;theme=light" class="site-icon" alt="" width="48" height="48">

      <a href="https://cookbook.geuer-pollmann.de/azure/postgrex-on-azure" target="_blank" rel="noopener nofollow ugc">cookbook.geuer-pollmann.de</a>
  </header>

  <article class="onebox-body">
    <div class="aspect-image" style="--aspect-ratio:690/362;"><img src="https://cookbook.geuer-pollmann.de/~gitbook/ogimage/BXWDkAymv3UBy3AVVNbd" class="thumbnail" alt="" width="690" height="362"></div>

<h3><a href="https://cookbook.geuer-pollmann.de/azure/postgrex-on-azure" target="_blank" rel="noopener nofollow ugc">Postgrex on Azure - Connecting to Azure PostgreSQL from Elixir |...</a></h3>



  </article>

  <div class="onebox-metadata">
    
    
  </div>

  <div style="clear: both"></div>
</aside>
 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="346366" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/how-to-connect-an-elixir-application-with-azure-database-for-postgresql-using-ssl-certificate/44529/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-346366" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="346366"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-most-liked cat-most-liked" title="One of the top 3 liked posts in this thread!"></div>
  </section>
</div>
    <div class="postbit" id="346431" data-post-id="346431">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="KristerV" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/KristerV/120/13808_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  KristerV
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>oh man, I still get <code>TLS :client: In state :wait_cert at ssl_handshake.erl:2177 generated CLIENT ALERT: Fatal - Unknown CA</code>.</p>
<p>The only difference seems to be the cert itself. what kind of a cert are you using? the name says “bundle” - what is that? I just got the CA version <a href="https://learn.microsoft.com/en-us/azure/postgresql/flexible-server/concepts-networking-ssl-tls#download-root-ca-certificates-and-update-application-clients-in-certificate-pinning-scenarios" rel="noopener nofollow ugc">from Microsoft docs</a>, is that not correct?</p>
<p><strong>edit: it works!</strong> those SSL settings were exactly correct! and “bundle” means you put the 3 certs together:</p>
<pre data-code-wrap="bash"><code class="lang-bash">cat DigiCertGlobalRootCA.pem DigiCertGlobalRootG2.crt.pem MicrosoftRSARoot2017.pem &gt; combined_ca.pem
</code></pre>
<p>thank you so much! what a pain this was.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="346431" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/how-to-connect-an-elixir-application-with-azure-database-for-postgresql-using-ssl-certificate/44529/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-346431" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="346431"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #13"></div>
  </section>
</div>
    <div class="postbit" id="350433" data-post-id="350433">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sameer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sameer/120/37007_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sameer
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks, that was very helpful.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="350433" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/how-to-connect-an-elixir-application-with-azure-database-for-postgresql-using-ssl-certificate/44529/15">Post #14</a>
	                </div>
	            </div>
              <div id="likers-container-350433" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="350433"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-most-liked cat-most-liked" title="One of the top 3 liked posts in this thread!"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <span class="all-loaded">— All posts loaded —</span>
</div></template></turbo-stream>