<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Schema Registry certificate auth with Unity Catalog volumes. in Data Engineering</title>
    <link>https://community.databricks.com/t5/data-engineering/schema-registry-certificate-auth-with-unity-catalog-volumes/m-p/139455#M51206</link>
    <description>&lt;P class="qt3gz91 paragraph"&gt;Thanks for the detailed context—here’s a concise, actionable troubleshooting plan tailored to Databricks with Unity Catalog volumes and Avro + Confluent Schema Registry over APIM with mTLS.&lt;/P&gt;
&lt;H3 class="_7uu25p0 qt3gz9c _7pq7t612 heading3 _7uu25p1"&gt;What’s likely going wrong&lt;/H3&gt;
&lt;P class="qt3gz91 paragraph"&gt;Based on your description, the &lt;STRONG&gt;initial TLS handshake succeeds&lt;/STRONG&gt; (APIM logs show a successful request), but &lt;STRONG&gt;message decoding fails&lt;/STRONG&gt; in Spark/Kafka consumers, with errors surfacing only in logs on 14.3 LTS single-user and similar behavior on 15.4 LTS shared clusters. That pattern typically points to one of the following:&lt;/P&gt;
&lt;UL class="qt3gz97 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;&lt;STRONG&gt;Avro conversion path not finding/using the keystore/truststore correctly when reading from Unity Catalog volumes&lt;/STRONG&gt;, especially if the path or volume access semantics differ from DBFS mount assumptions. This often shows up after handshake success if the schema registry client can connect but cannot complete certificate chain validation or client auth for subsequent calls due to path resolution or scope issues. The Databricks doc that describes using truststore/keystore from Unity Catalog volumes could not be read via Glean, so I can’t verify exact syntax from that page right now.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;&lt;STRONG&gt;Schema registry auth header or SSL options mismatch for the Confluent client inside from_avro&lt;/STRONG&gt;, particularly when using APIM as a gateway. If APIM requires a client certificate, the Confluent Avro deserializer must be given the correct SSL properties, and they must be discoverable on executors.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;&lt;STRONG&gt;Classpath/library version incompatibility&lt;/STRONG&gt; between:&lt;/P&gt;
&lt;UL class="qt3gz98 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;Spark 3.4/3.5 runtime (14.3 LTS / 15.4 LTS),&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;azure-eventhubs-spark_2.12:2.3.22,&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;Confluent schema-registry and Avro deserializer libraries (which are implicitly used by &lt;CODE class="qt3gz9f"&gt;from_avro&lt;/CODE&gt;). This can lead to silent deserialization failures logged in log4j but not thrown to the application, especially with shaded/relocated dependencies.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;&lt;STRONG&gt;Executor access to the keystore/truststore files&lt;/STRONG&gt; within UC volumes. The driver may access them, but executors might fail if paths aren’t accessible in the same way or if you’re referencing a local filesystem path that isn’t distributed.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 class="_7uu25p0 qt3gz9c _7pq7t612 heading3 _7uu25p1"&gt;Recommended fixes and checks&lt;/H3&gt;
&lt;P class="qt3gz91 paragraph"&gt;Please try these in order; they’re low-risk and address the most common causes.&lt;/P&gt;
&lt;UL class="qt3gz97 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;Validate the &lt;STRONG&gt;path syntax for Unity Catalog volumes&lt;/STRONG&gt; and use a path that executors can read:&lt;/P&gt;
&lt;UL class="qt3gz98 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;Prefer reading keystore/truststore into the &lt;STRONG&gt;driver/executors’ local filesystem&lt;/STRONG&gt; from the UC volume before initializing from_avro, rather than pointing the Confluent client to a UC volume path directly. For example:&lt;/P&gt;
&lt;UL class="qt3gz99 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;Copy files at cluster start (init script) from UC volume to &lt;CODE class="qt3gz9f"&gt;/local_disk/…&lt;/CODE&gt; and reference those paths in &lt;CODE class="qt3gz9f"&gt;fromAvroOptions&lt;/CODE&gt;.&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;Or programmatically copy once per session:
&lt;DIV class="go8b9g1 _7pq7t6cl" data-ui-element="code-block-container"&gt;
&lt;PRE&gt;&lt;CODE class="qt3gz9e hljs language-bash _1ymogdh2"&gt;dbutils.fs.cp(&lt;SPAN class="hljs-string"&gt;"uc://catalog.schema.volume/keystores/Client_Cert.truststore.jks"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"file:/local_disk/keystores/Client_Cert.truststore.jks"&lt;/SPAN&gt;)&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;P class="qt3gz91 paragraph"&gt;Then set:&lt;/P&gt;
&lt;DIV class="go8b9g1 _7pq7t6cl" data-ui-element="code-block-container"&gt;
&lt;PRE&gt;&lt;CODE class="qt3gz9e hljs language-bash _1ymogdh2"&gt;fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.ssl.truststore.location"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"/local_disk/keystores/Client_Cert.truststore.jks"&lt;/SPAN&gt;)&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;P class="qt3gz91 paragraph"&gt;This sidesteps any path scheme issues with UC volumes on executors.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;Confirm the &lt;STRONG&gt;exact options keys&lt;/STRONG&gt; used by &lt;CODE class="qt3gz9f"&gt;from_avro&lt;/CODE&gt;’s Confluent client:&lt;/P&gt;
&lt;UL class="qt3gz98 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;Keys you listed look correct for SSL, but APIM via mTLS sometimes requires:
&lt;UL class="qt3gz99 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;&lt;CODE class="qt3gz9f"&gt;confluent.schema.registry.url&lt;/CODE&gt;&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;&lt;CODE class="qt3gz9f"&gt;confluent.schema.registry.basic.auth.credentials.source&lt;/CODE&gt; (if APIM needs headers)&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;&lt;CODE class="qt3gz9f"&gt;confluent.schema.registry.ssl.keystore.type&lt;/CODE&gt; and &lt;CODE class="qt3gz9f"&gt;…truststore.type&lt;/CODE&gt; set explicitly to &lt;CODE class="qt3gz9f"&gt;JKS&lt;/CODE&gt;&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;&lt;CODE class="qt3gz9f"&gt;confluent.schema.registry.ssl.endpoint.identification.algorithm&lt;/CODE&gt; set to &lt;CODE class="qt3gz9f"&gt;HTTPS&lt;/CODE&gt; or empty depending on APIM’s certs/SANs.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;If APIM hostname differs from cert CN/SAN, try setting &lt;CODE class="qt3gz9f"&gt;endpoint.identification.algorithm&lt;/CODE&gt; to empty (&lt;CODE class="qt3gz9f"&gt;""&lt;/CODE&gt;) to bypass hostname verification for testing; then fix certs/SANs properly.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;Ensure &lt;STRONG&gt;executors receive the passwords securely&lt;/STRONG&gt;:&lt;/P&gt;
&lt;UL class="qt3gz98 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;Use Spark conf or &lt;CODE class="qt3gz9f"&gt;fromAvroOptions&lt;/CODE&gt; values set on the driver and broadcast to executors. Avoid relying on only driver-local variables without proper serialization.&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;Confirm the password strings are non-empty and correct on executors (e.g., via a small map function logging masked presence).&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;Check &lt;STRONG&gt;library alignment&lt;/STRONG&gt;:&lt;/P&gt;
&lt;UL class="qt3gz98 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;On 14.3 LTS: Spark 3.4.1. On 15.4 LTS: Spark 3.5.x. azure-eventhubs-spark 2.3.22 is built for Spark 3.4+ but ensure no conflicting Avro/Confluent libs pulled transitively.&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;If you also added Avro/Confluent dependencies, remove duplicates or align versions so that &lt;CODE class="qt3gz9f"&gt;org.apache.spark:spark-avro&lt;/CODE&gt; and Confluent deserializers are compatible.&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;In clusters, prefer using the built-in &lt;CODE class="qt3gz9f"&gt;spark-avro&lt;/CODE&gt; instead of adding another Avro jar unless necessary.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;Verify &lt;STRONG&gt;schema registry calls via APIM with mTLS&lt;/STRONG&gt; outside Spark:&lt;/P&gt;
&lt;UL class="qt3gz98 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;From a notebook, run a plain Java/Scala HTTPS client using the same keystore/truststore files to GET a known schema ID from APIM to confirm full TLS + hostname verification behavior with those paths.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;Inspect logs for &lt;STRONG&gt;specific errors&lt;/STRONG&gt; in the executors:&lt;/P&gt;
&lt;UL class="qt3gz98 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;Enable debug logging for &lt;CODE class="qt3gz9f"&gt;io.confluent&lt;/CODE&gt; and &lt;CODE class="qt3gz9f"&gt;org.apache.avro&lt;/CODE&gt; to catch exact deserialization failures (e.g., unknown schema ID, incompatible reader/writer schema, or SSL handshake on subsequent calls).&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;Sometimes the first metadata request succeeds, but the per-message decode triggers more schema lookups that fail if the client can’t reuse SSL context.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;If you’re using &lt;STRONG&gt;Event Hubs capture Avro vs Kafka APIs&lt;/STRONG&gt;, ensure the Avro binary is compatible with &lt;CODE class="qt3gz9f"&gt;from_avro&lt;/CODE&gt;:&lt;/P&gt;
&lt;UL class="qt3gz98 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;The &lt;CODE class="qt3gz9f"&gt;from_avro&lt;/CODE&gt; function expects the binary payload and a valid schema resolution via the registry; confirm messages are not JSON Avro or have envelopes that need custom parsing before &lt;CODE class="qt3gz9f"&gt;from_avro&lt;/CODE&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 class="_7uu25p0 qt3gz9c _7pq7t612 heading3 _7uu25p1"&gt;Concrete pattern to try (driver-local copy from UC volume)&lt;/H3&gt;
&lt;P class="qt3gz91 paragraph"&gt;This pattern avoids path scheme surprises and ensures executor access.&lt;/P&gt;
&lt;DIV class="go8b9g1 _7pq7t6cl" data-ui-element="code-block-container"&gt;
&lt;PRE&gt;&lt;CODE class="markdown-code-scala qt3gz9e hljs language-scala _1ymogdh2"&gt;&lt;SPAN class="hljs-comment"&gt;// Example: copy keystore/truststore from UC volume to local disk&lt;/SPAN&gt;
dbutils.fs.mkdirs(&lt;SPAN class="hljs-string"&gt;"file:/local_disk/keystores"&lt;/SPAN&gt;)
dbutils.fs.cp(&lt;SPAN class="hljs-string"&gt;"uc://&amp;lt;catalog&amp;gt;.&amp;lt;schema&amp;gt;.&amp;lt;volume&amp;gt;/keystores/Client_Cert.truststore.jks"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"file:/local_disk/keystores/truststore.jks"&lt;/SPAN&gt;)
dbutils.fs.cp(&lt;SPAN class="hljs-string"&gt;"uc://&amp;lt;catalog&amp;gt;.&amp;lt;schema&amp;gt;.&amp;lt;volume&amp;gt;/keystores/Client_Cert.keystore.jks"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"file:/local_disk/keystores/keystore.jks"&lt;/SPAN&gt;)

&lt;SPAN class="hljs-type"&gt;val&lt;/SPAN&gt; &lt;SPAN class="hljs-variable"&gt;fromAvroOptions&lt;/SPAN&gt; &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="hljs-title class_"&gt;java&lt;/SPAN&gt;.util.HashMap[String, String]()
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"mode"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"PERMISSIVE"&lt;/SPAN&gt;)
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.url"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"&amp;lt;https://your-apim-endpoint&amp;gt;"&lt;/SPAN&gt;)
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.ssl.truststore.location"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"/local_disk/keystores/truststore.jks"&lt;/SPAN&gt;)
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.ssl.truststore.password"&lt;/SPAN&gt;, truststorePass)
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.ssl.truststore.type"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"JKS"&lt;/SPAN&gt;)
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.ssl.keystore.location"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"/local_disk/keystores/keystore.jks"&lt;/SPAN&gt;)
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.ssl.keystore.password"&lt;/SPAN&gt;, keystorePass)
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.ssl.keystore.type"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"JKS"&lt;/SPAN&gt;)
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.ssl.key.password"&lt;/SPAN&gt;, keyPass)
&lt;SPAN class="hljs-comment"&gt;// Optional if APIM certs/SANs are non-standard; remove once certs are fixed&lt;/SPAN&gt;
&lt;SPAN class="hljs-comment"&gt;// fromAvroOptions.put("confluent.schema.registry.ssl.endpoint.identification.algorithm", "")&lt;/SPAN&gt;

&lt;SPAN class="hljs-comment"&gt;// When creating the DF from Event Hubs payload, ensure the value column is raw binary for from_avro&lt;/SPAN&gt;
&lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; org.apache.spark.sql.functions._
&lt;SPAN class="hljs-type"&gt;val&lt;/SPAN&gt; &lt;SPAN class="hljs-variable"&gt;df&lt;/SPAN&gt; &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt; rawDf.select(from_avro(col(&lt;SPAN class="hljs-string"&gt;"value"&lt;/SPAN&gt;), lit(&lt;SPAN class="hljs-string"&gt;"&amp;lt;schema-id-or-subject&amp;gt;"&lt;/SPAN&gt;), fromAvroOptions).as(&lt;SPAN class="hljs-string"&gt;"decoded"&lt;/SPAN&gt;))&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;P class="qt3gz91 paragraph"&gt;If you are using subject name strategy instead of direct schema ID, ensure the option to resolve subjects is correctly set and that APIM forwards necessary paths.&lt;/P&gt;
&lt;H3 class="_7uu25p0 qt3gz9c _7pq7t612 heading3 _7uu25p1"&gt;Cluster mode considerations&lt;/H3&gt;
&lt;UL class="qt3gz97 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;On &lt;STRONG&gt;single user clusters&lt;/STRONG&gt; with UC, ACLs are scoped to your identity; since you granted full privileges on catalog/schema/volume, the driver should read UC volumes. But executors sometimes hit filesystem path differences. The local copy pattern above neutralizes that.&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;On &lt;STRONG&gt;shared clusters&lt;/STRONG&gt; with UC, make sure your user has access and the files are not stored in a directory that requires other workspace-level permissions.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 class="_7uu25p0 qt3gz9c _7pq7t612 heading3 _7uu25p1"&gt;If the problem persists&lt;/H3&gt;
&lt;P class="qt3gz91 paragraph"&gt;Collect and share the following for precise root cause:&lt;/P&gt;
&lt;UL class="qt3gz97 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;The exact &lt;STRONG&gt;log4j error messages&lt;/STRONG&gt; from executors for Avro decoding.&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;The &lt;STRONG&gt;options map&lt;/STRONG&gt; you pass to &lt;CODE class="qt3gz9f"&gt;from_avro&lt;/CODE&gt; (masking secrets), including URL and any additional SSL properties.&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;Confirmation that a &lt;STRONG&gt;standalone HTTPS client&lt;/STRONG&gt; using the same JKS pair can GET a schema from APIM in the same cluster.&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;Whether messages are &lt;STRONG&gt;Kafka-compatible Avro&lt;/STRONG&gt; or &lt;STRONG&gt;Event Hubs payload&lt;/STRONG&gt; with an envelope—sometimes a pre-processing step is needed before &lt;CODE class="qt3gz9f"&gt;from_avro&lt;/CODE&gt;.&lt;/LI&gt;
&lt;/UL&gt;</description>
    <pubDate>Tue, 18 Nov 2025 00:33:21 GMT</pubDate>
    <dc:creator>stbjelcevic</dc:creator>
    <dc:date>2025-11-18T00:33:21Z</dc:date>
    <item>
      <title>Schema Registry certificate auth with Unity Catalog volumes.</title>
      <link>https://community.databricks.com/t5/data-engineering/schema-registry-certificate-auth-with-unity-catalog-volumes/m-p/89634#M37867</link>
      <description>&lt;P&gt;Greetings.&lt;/P&gt;&lt;P&gt;We currently have a Spark structured streaming job (Scala) retrieving avro data from an Azure Eventhub with a confluent schema registry endpoint (using an Azure Api Management gateway with certificate authentication).&lt;/P&gt;&lt;P&gt;Until now the .jks files used by the Databricks consumer were retrieved by mounting the storage account into the Databricks workspace while configuring the from_avro() options as follows:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;val fromAvroOptions = new java.util.HashMap[String, String]()&lt;BR /&gt;fromAvroOptions.put("mode", "PERMISSIVE")&lt;BR /&gt;fromAvroOptions.put("confluent.schema.registry.ssl.truststore.location", "/dbfs/mnt/keystores/Client_Cert.truststore.jks")&lt;BR /&gt;fromAvroOptions.put("confluent.schema.registry.ssl.truststore.password", truststorePass)&lt;BR /&gt;fromAvroOptions.put("confluent.schema.registry.ssl.keystore.location", "/dbfs/mnt/keystores/Client_Cert.keystore.jks")&lt;BR /&gt;fromAvroOptions.put("confluent.schema.registry.ssl.keystore.password", keystorePass)&lt;BR /&gt;fromAvroOptions.put("confluent.schema.registry.ssl.key.password", keyPass)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;We decided to migrate the storage account to Unity Catalog external volumes in order to access the .jks files (&lt;A href="https://docs.databricks.com/en/structured-streaming/avro-dataframe.html#use-truststore-and-keystore-files-in-unity-catalog-volumes" target="_blank"&gt;ref&lt;/A&gt;), which is supposed to work.&lt;/P&gt;&lt;P&gt;The initial handshake and authentication is achieved and a successful request is logged to the APIM logs:&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="success.png" style="width: 400px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/11118i1EA8CE283ABAFA0B/image-size/medium?v=v2&amp;amp;px=400" role="button" title="success.png" alt="success.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="success2.png" style="width: 400px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/11119i363271B4FC2ECCCB/image-size/medium?v=v2&amp;amp;px=400" role="button" title="success2.png" alt="success2.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;However while trying to display the data the following error occurs:&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="error1.png" style="width: 400px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/11120i311A51CF79B0899E/image-size/medium?v=v2&amp;amp;px=400" role="button" title="error1.png" alt="error1.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;The compute configuration we used is the following:&lt;/P&gt;&lt;P&gt;Unity Catalog enabled single user access cluster (single node 14.3 LTS)&lt;/P&gt;&lt;P&gt;+ com.microsoft.azure:azure-eventhubs-spark_2.12:2.3.22.&lt;/P&gt;&lt;P&gt;Full privileges have also be granted on the catalog/schema/volume levels on the user.&lt;/P&gt;&lt;P&gt;When attempting to read the data with a kafka consumer no exception is thrown, but it is logged in the log4j output while not being able to decode any messages:&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="e2.png" style="width: 400px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/11125i87DE0F7A3E46E5AA/image-size/medium?v=v2&amp;amp;px=400" role="button" title="e2.png" alt="e2.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;Using a Shared cluster with 15.4 LTS seems to yield similar errors.&lt;/P&gt;&lt;P&gt;Any help would be appreciated. Thanks in advance.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 12 Sep 2024 12:31:33 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/schema-registry-certificate-auth-with-unity-catalog-volumes/m-p/89634#M37867</guid>
      <dc:creator>EDDatabricks</dc:creator>
      <dc:date>2024-09-12T12:31:33Z</dc:date>
    </item>
    <item>
      <title>Re: Schema Registry certificate auth with Unity Catalog volumes.</title>
      <link>https://community.databricks.com/t5/data-engineering/schema-registry-certificate-auth-with-unity-catalog-volumes/m-p/139455#M51206</link>
      <description>&lt;P class="qt3gz91 paragraph"&gt;Thanks for the detailed context—here’s a concise, actionable troubleshooting plan tailored to Databricks with Unity Catalog volumes and Avro + Confluent Schema Registry over APIM with mTLS.&lt;/P&gt;
&lt;H3 class="_7uu25p0 qt3gz9c _7pq7t612 heading3 _7uu25p1"&gt;What’s likely going wrong&lt;/H3&gt;
&lt;P class="qt3gz91 paragraph"&gt;Based on your description, the &lt;STRONG&gt;initial TLS handshake succeeds&lt;/STRONG&gt; (APIM logs show a successful request), but &lt;STRONG&gt;message decoding fails&lt;/STRONG&gt; in Spark/Kafka consumers, with errors surfacing only in logs on 14.3 LTS single-user and similar behavior on 15.4 LTS shared clusters. That pattern typically points to one of the following:&lt;/P&gt;
&lt;UL class="qt3gz97 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;&lt;STRONG&gt;Avro conversion path not finding/using the keystore/truststore correctly when reading from Unity Catalog volumes&lt;/STRONG&gt;, especially if the path or volume access semantics differ from DBFS mount assumptions. This often shows up after handshake success if the schema registry client can connect but cannot complete certificate chain validation or client auth for subsequent calls due to path resolution or scope issues. The Databricks doc that describes using truststore/keystore from Unity Catalog volumes could not be read via Glean, so I can’t verify exact syntax from that page right now.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;&lt;STRONG&gt;Schema registry auth header or SSL options mismatch for the Confluent client inside from_avro&lt;/STRONG&gt;, particularly when using APIM as a gateway. If APIM requires a client certificate, the Confluent Avro deserializer must be given the correct SSL properties, and they must be discoverable on executors.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;&lt;STRONG&gt;Classpath/library version incompatibility&lt;/STRONG&gt; between:&lt;/P&gt;
&lt;UL class="qt3gz98 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;Spark 3.4/3.5 runtime (14.3 LTS / 15.4 LTS),&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;azure-eventhubs-spark_2.12:2.3.22,&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;Confluent schema-registry and Avro deserializer libraries (which are implicitly used by &lt;CODE class="qt3gz9f"&gt;from_avro&lt;/CODE&gt;). This can lead to silent deserialization failures logged in log4j but not thrown to the application, especially with shaded/relocated dependencies.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;&lt;STRONG&gt;Executor access to the keystore/truststore files&lt;/STRONG&gt; within UC volumes. The driver may access them, but executors might fail if paths aren’t accessible in the same way or if you’re referencing a local filesystem path that isn’t distributed.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 class="_7uu25p0 qt3gz9c _7pq7t612 heading3 _7uu25p1"&gt;Recommended fixes and checks&lt;/H3&gt;
&lt;P class="qt3gz91 paragraph"&gt;Please try these in order; they’re low-risk and address the most common causes.&lt;/P&gt;
&lt;UL class="qt3gz97 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;Validate the &lt;STRONG&gt;path syntax for Unity Catalog volumes&lt;/STRONG&gt; and use a path that executors can read:&lt;/P&gt;
&lt;UL class="qt3gz98 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;Prefer reading keystore/truststore into the &lt;STRONG&gt;driver/executors’ local filesystem&lt;/STRONG&gt; from the UC volume before initializing from_avro, rather than pointing the Confluent client to a UC volume path directly. For example:&lt;/P&gt;
&lt;UL class="qt3gz99 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;Copy files at cluster start (init script) from UC volume to &lt;CODE class="qt3gz9f"&gt;/local_disk/…&lt;/CODE&gt; and reference those paths in &lt;CODE class="qt3gz9f"&gt;fromAvroOptions&lt;/CODE&gt;.&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;Or programmatically copy once per session:
&lt;DIV class="go8b9g1 _7pq7t6cl" data-ui-element="code-block-container"&gt;
&lt;PRE&gt;&lt;CODE class="qt3gz9e hljs language-bash _1ymogdh2"&gt;dbutils.fs.cp(&lt;SPAN class="hljs-string"&gt;"uc://catalog.schema.volume/keystores/Client_Cert.truststore.jks"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"file:/local_disk/keystores/Client_Cert.truststore.jks"&lt;/SPAN&gt;)&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;P class="qt3gz91 paragraph"&gt;Then set:&lt;/P&gt;
&lt;DIV class="go8b9g1 _7pq7t6cl" data-ui-element="code-block-container"&gt;
&lt;PRE&gt;&lt;CODE class="qt3gz9e hljs language-bash _1ymogdh2"&gt;fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.ssl.truststore.location"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"/local_disk/keystores/Client_Cert.truststore.jks"&lt;/SPAN&gt;)&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;P class="qt3gz91 paragraph"&gt;This sidesteps any path scheme issues with UC volumes on executors.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;Confirm the &lt;STRONG&gt;exact options keys&lt;/STRONG&gt; used by &lt;CODE class="qt3gz9f"&gt;from_avro&lt;/CODE&gt;’s Confluent client:&lt;/P&gt;
&lt;UL class="qt3gz98 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;Keys you listed look correct for SSL, but APIM via mTLS sometimes requires:
&lt;UL class="qt3gz99 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;&lt;CODE class="qt3gz9f"&gt;confluent.schema.registry.url&lt;/CODE&gt;&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;&lt;CODE class="qt3gz9f"&gt;confluent.schema.registry.basic.auth.credentials.source&lt;/CODE&gt; (if APIM needs headers)&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;&lt;CODE class="qt3gz9f"&gt;confluent.schema.registry.ssl.keystore.type&lt;/CODE&gt; and &lt;CODE class="qt3gz9f"&gt;…truststore.type&lt;/CODE&gt; set explicitly to &lt;CODE class="qt3gz9f"&gt;JKS&lt;/CODE&gt;&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;&lt;CODE class="qt3gz9f"&gt;confluent.schema.registry.ssl.endpoint.identification.algorithm&lt;/CODE&gt; set to &lt;CODE class="qt3gz9f"&gt;HTTPS&lt;/CODE&gt; or empty depending on APIM’s certs/SANs.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;If APIM hostname differs from cert CN/SAN, try setting &lt;CODE class="qt3gz9f"&gt;endpoint.identification.algorithm&lt;/CODE&gt; to empty (&lt;CODE class="qt3gz9f"&gt;""&lt;/CODE&gt;) to bypass hostname verification for testing; then fix certs/SANs properly.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;Ensure &lt;STRONG&gt;executors receive the passwords securely&lt;/STRONG&gt;:&lt;/P&gt;
&lt;UL class="qt3gz98 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;Use Spark conf or &lt;CODE class="qt3gz9f"&gt;fromAvroOptions&lt;/CODE&gt; values set on the driver and broadcast to executors. Avoid relying on only driver-local variables without proper serialization.&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;Confirm the password strings are non-empty and correct on executors (e.g., via a small map function logging masked presence).&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;Check &lt;STRONG&gt;library alignment&lt;/STRONG&gt;:&lt;/P&gt;
&lt;UL class="qt3gz98 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;On 14.3 LTS: Spark 3.4.1. On 15.4 LTS: Spark 3.5.x. azure-eventhubs-spark 2.3.22 is built for Spark 3.4+ but ensure no conflicting Avro/Confluent libs pulled transitively.&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;If you also added Avro/Confluent dependencies, remove duplicates or align versions so that &lt;CODE class="qt3gz9f"&gt;org.apache.spark:spark-avro&lt;/CODE&gt; and Confluent deserializers are compatible.&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;In clusters, prefer using the built-in &lt;CODE class="qt3gz9f"&gt;spark-avro&lt;/CODE&gt; instead of adding another Avro jar unless necessary.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;Verify &lt;STRONG&gt;schema registry calls via APIM with mTLS&lt;/STRONG&gt; outside Spark:&lt;/P&gt;
&lt;UL class="qt3gz98 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;From a notebook, run a plain Java/Scala HTTPS client using the same keystore/truststore files to GET a known schema ID from APIM to confirm full TLS + hostname verification behavior with those paths.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;Inspect logs for &lt;STRONG&gt;specific errors&lt;/STRONG&gt; in the executors:&lt;/P&gt;
&lt;UL class="qt3gz98 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;Enable debug logging for &lt;CODE class="qt3gz9f"&gt;io.confluent&lt;/CODE&gt; and &lt;CODE class="qt3gz9f"&gt;org.apache.avro&lt;/CODE&gt; to catch exact deserialization failures (e.g., unknown schema ID, incompatible reader/writer schema, or SSL handshake on subsequent calls).&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;Sometimes the first metadata request succeeds, but the per-message decode triggers more schema lookups that fail if the client can’t reuse SSL context.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;
&lt;P class="qt3gz91 paragraph"&gt;If you’re using &lt;STRONG&gt;Event Hubs capture Avro vs Kafka APIs&lt;/STRONG&gt;, ensure the Avro binary is compatible with &lt;CODE class="qt3gz9f"&gt;from_avro&lt;/CODE&gt;:&lt;/P&gt;
&lt;UL class="qt3gz98 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;The &lt;CODE class="qt3gz9f"&gt;from_avro&lt;/CODE&gt; function expects the binary payload and a valid schema resolution via the registry; confirm messages are not JSON Avro or have envelopes that need custom parsing before &lt;CODE class="qt3gz9f"&gt;from_avro&lt;/CODE&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 class="_7uu25p0 qt3gz9c _7pq7t612 heading3 _7uu25p1"&gt;Concrete pattern to try (driver-local copy from UC volume)&lt;/H3&gt;
&lt;P class="qt3gz91 paragraph"&gt;This pattern avoids path scheme surprises and ensures executor access.&lt;/P&gt;
&lt;DIV class="go8b9g1 _7pq7t6cl" data-ui-element="code-block-container"&gt;
&lt;PRE&gt;&lt;CODE class="markdown-code-scala qt3gz9e hljs language-scala _1ymogdh2"&gt;&lt;SPAN class="hljs-comment"&gt;// Example: copy keystore/truststore from UC volume to local disk&lt;/SPAN&gt;
dbutils.fs.mkdirs(&lt;SPAN class="hljs-string"&gt;"file:/local_disk/keystores"&lt;/SPAN&gt;)
dbutils.fs.cp(&lt;SPAN class="hljs-string"&gt;"uc://&amp;lt;catalog&amp;gt;.&amp;lt;schema&amp;gt;.&amp;lt;volume&amp;gt;/keystores/Client_Cert.truststore.jks"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"file:/local_disk/keystores/truststore.jks"&lt;/SPAN&gt;)
dbutils.fs.cp(&lt;SPAN class="hljs-string"&gt;"uc://&amp;lt;catalog&amp;gt;.&amp;lt;schema&amp;gt;.&amp;lt;volume&amp;gt;/keystores/Client_Cert.keystore.jks"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"file:/local_disk/keystores/keystore.jks"&lt;/SPAN&gt;)

&lt;SPAN class="hljs-type"&gt;val&lt;/SPAN&gt; &lt;SPAN class="hljs-variable"&gt;fromAvroOptions&lt;/SPAN&gt; &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="hljs-title class_"&gt;java&lt;/SPAN&gt;.util.HashMap[String, String]()
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"mode"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"PERMISSIVE"&lt;/SPAN&gt;)
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.url"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"&amp;lt;https://your-apim-endpoint&amp;gt;"&lt;/SPAN&gt;)
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.ssl.truststore.location"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"/local_disk/keystores/truststore.jks"&lt;/SPAN&gt;)
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.ssl.truststore.password"&lt;/SPAN&gt;, truststorePass)
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.ssl.truststore.type"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"JKS"&lt;/SPAN&gt;)
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.ssl.keystore.location"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"/local_disk/keystores/keystore.jks"&lt;/SPAN&gt;)
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.ssl.keystore.password"&lt;/SPAN&gt;, keystorePass)
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.ssl.keystore.type"&lt;/SPAN&gt;, &lt;SPAN class="hljs-string"&gt;"JKS"&lt;/SPAN&gt;)
fromAvroOptions.put(&lt;SPAN class="hljs-string"&gt;"confluent.schema.registry.ssl.key.password"&lt;/SPAN&gt;, keyPass)
&lt;SPAN class="hljs-comment"&gt;// Optional if APIM certs/SANs are non-standard; remove once certs are fixed&lt;/SPAN&gt;
&lt;SPAN class="hljs-comment"&gt;// fromAvroOptions.put("confluent.schema.registry.ssl.endpoint.identification.algorithm", "")&lt;/SPAN&gt;

&lt;SPAN class="hljs-comment"&gt;// When creating the DF from Event Hubs payload, ensure the value column is raw binary for from_avro&lt;/SPAN&gt;
&lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; org.apache.spark.sql.functions._
&lt;SPAN class="hljs-type"&gt;val&lt;/SPAN&gt; &lt;SPAN class="hljs-variable"&gt;df&lt;/SPAN&gt; &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt; rawDf.select(from_avro(col(&lt;SPAN class="hljs-string"&gt;"value"&lt;/SPAN&gt;), lit(&lt;SPAN class="hljs-string"&gt;"&amp;lt;schema-id-or-subject&amp;gt;"&lt;/SPAN&gt;), fromAvroOptions).as(&lt;SPAN class="hljs-string"&gt;"decoded"&lt;/SPAN&gt;))&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;P class="qt3gz91 paragraph"&gt;If you are using subject name strategy instead of direct schema ID, ensure the option to resolve subjects is correctly set and that APIM forwards necessary paths.&lt;/P&gt;
&lt;H3 class="_7uu25p0 qt3gz9c _7pq7t612 heading3 _7uu25p1"&gt;Cluster mode considerations&lt;/H3&gt;
&lt;UL class="qt3gz97 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;On &lt;STRONG&gt;single user clusters&lt;/STRONG&gt; with UC, ACLs are scoped to your identity; since you granted full privileges on catalog/schema/volume, the driver should read UC volumes. But executors sometimes hit filesystem path differences. The local copy pattern above neutralizes that.&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;On &lt;STRONG&gt;shared clusters&lt;/STRONG&gt; with UC, make sure your user has access and the files are not stored in a directory that requires other workspace-level permissions.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 class="_7uu25p0 qt3gz9c _7pq7t612 heading3 _7uu25p1"&gt;If the problem persists&lt;/H3&gt;
&lt;P class="qt3gz91 paragraph"&gt;Collect and share the following for precise root cause:&lt;/P&gt;
&lt;UL class="qt3gz97 qt3gz92"&gt;
&lt;LI class="qt3gz9a"&gt;The exact &lt;STRONG&gt;log4j error messages&lt;/STRONG&gt; from executors for Avro decoding.&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;The &lt;STRONG&gt;options map&lt;/STRONG&gt; you pass to &lt;CODE class="qt3gz9f"&gt;from_avro&lt;/CODE&gt; (masking secrets), including URL and any additional SSL properties.&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;Confirmation that a &lt;STRONG&gt;standalone HTTPS client&lt;/STRONG&gt; using the same JKS pair can GET a schema from APIM in the same cluster.&lt;/LI&gt;
&lt;LI class="qt3gz9a"&gt;Whether messages are &lt;STRONG&gt;Kafka-compatible Avro&lt;/STRONG&gt; or &lt;STRONG&gt;Event Hubs payload&lt;/STRONG&gt; with an envelope—sometimes a pre-processing step is needed before &lt;CODE class="qt3gz9f"&gt;from_avro&lt;/CODE&gt;.&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Tue, 18 Nov 2025 00:33:21 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/schema-registry-certificate-auth-with-unity-catalog-volumes/m-p/139455#M51206</guid>
      <dc:creator>stbjelcevic</dc:creator>
      <dc:date>2025-11-18T00:33:21Z</dc:date>
    </item>
  </channel>
</rss>

