<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linux Sin Humo (Publicaciones sobre DNS)</title><link>https://sergiobelkin.com/</link><description></description><atom:link href="https://sergiobelkin.com/categories/dns.xml" rel="self" type="application/rss+xml"></atom:link><language>es</language><copyright>Contents © 2026 &lt;a href="mailto:sebelk@gmail.com"&gt;sebelk&lt;/a&gt; 
&lt;a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/"&gt;
&lt;img alt="Creative Commons License BY-NC-SA"
style="border-width:0; margin-bottom:12px;"
src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"&gt;&lt;/a&gt;
</copyright><lastBuildDate>Mon, 28 Sep 2026 02:48:10 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>3 Power Tips + Power Link I14</title><link>https://sergiobelkin.com/posts/3-power-tips-power-link-i14/</link><dc:creator>sebelk</dc:creator><description>&lt;figure&gt;&lt;img src="https://sergiobelkin.com/images/PowerTipsPlus.png"&gt;&lt;/figure&gt; &lt;p&gt;En los tres casos de este issue hay una respuesta válida que no le sirve a quien la pidió: el DNS contesta sin el registro pedido, el servidor TLS presenta certificados que Java no logra encadenar hasta una raíz en la que confíe, Microsoft Entra ID emite un token que Azure API Management (APIM) rechaza. Cada herramienta muestra una sola capa, y ninguna dice por sí sola dónde está la configuración que no coincide. Al final, un calendario que va a llevar a cada mes y medio una tarea que, donde todavía es manual, hoy se hace una vez por año.&lt;/p&gt;
&lt;h3 id="power-tip-1-el-nombre-existe-el-registro-no"&gt;Power Tip #1 El nombre existe; el registro, no&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;La aplicación dice que no puede resolver el nombre, pero el nombre existe.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El DNS tiene dos maneras de decir que no: el nombre no existe (&lt;code&gt;NXDOMAIN&lt;/code&gt;), o el nombre existe pero no tiene registros del tipo pedido (NODATA).&lt;/li&gt;
&lt;li&gt;NODATA no tiene código propio: llega como &lt;code&gt;NOERROR&lt;/code&gt;, sin ningún registro del tipo pedido en la respuesta (puede venir un &lt;code&gt;CNAME&lt;/code&gt;, pero no el &lt;code&gt;A&lt;/code&gt;). Por eso en &lt;code&gt;dig&lt;/code&gt; parece un éxito y en la aplicación, una falla.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;getaddrinfo()&lt;/code&gt;, la función de glibc que usan las aplicaciones para resolver nombres, suele reflejar la diferencia: "Name or service not known" cuando el nombre no existe, "No address associated with hostname" cuando existe sin el registro pedido.&lt;/li&gt;
&lt;li&gt;Esa función trabaja por encima del DNS: pasa por NSS, cuya configuración (&lt;code&gt;/etc/nsswitch.conf&lt;/code&gt;) puede involucrar &lt;code&gt;/etc/hosts&lt;/code&gt;, módulos como &lt;code&gt;nss-resolve&lt;/code&gt; o cachés como &lt;code&gt;nscd&lt;/code&gt;. &lt;code&gt;dig&lt;/code&gt; consulta por defecto a los servidores de &lt;code&gt;/etc/resolv.conf&lt;/code&gt; y muestra qué contestó el DNS, que no siempre es lo que recibió la aplicación.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;dig&lt;span class="w"&gt; &lt;/span&gt;NOMBRE&lt;span class="w"&gt; &lt;/span&gt;A&lt;span class="w"&gt; &lt;/span&gt;+noall&lt;span class="w"&gt; &lt;/span&gt;+comments&lt;span class="w"&gt; &lt;/span&gt;+answer
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Un &lt;code&gt;NOERROR&lt;/code&gt; sin el registro pedido dice lo que sabe el servidor consultado, no lo que existe en todos lados: con split-horizon, otra vista puede tener el registro que esta no tiene. La pregunta pasa a ser qué tipos publica ese nombre en el servidor que consulta la aplicación, por ejemplo un nombre que solo tiene &lt;code&gt;AAAA&lt;/code&gt; consultado desde una aplicación que pide &lt;code&gt;A&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="power-tip-2-lo-que-envia-el-servidor-no-es-en-lo-que-confia-java"&gt;Power Tip #2 Lo que envía el servidor no es en lo que confía Java&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;openssl s_client -showcerts&lt;/code&gt; muestra los certificados que envía el servidor, y la aplicación Java falla con &lt;code&gt;PKIX path building failed&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La cadena la valida el cliente, contra su propio almacén de raíces de confianza (&lt;em&gt;truststore&lt;/em&gt;). El servidor normalmente no envía la raíz: el cliente tiene que tenerla.&lt;/li&gt;
&lt;li&gt;Java no usa necesariamente el del sistema. En Fedora y RHEL, el OpenJDK de los paquetes de la distro enlaza su &lt;code&gt;cacerts&lt;/code&gt; al almacén que mantiene &lt;code&gt;update-ca-trust&lt;/code&gt;. Un JDK descomprimido de un tarball, en un servidor o dentro de una imagen de contenedor, usa el archivo que trajo, con las raíces que había cuando se empaquetó. Y cualquiera de los dos puede recibir otro almacén con &lt;code&gt;-Djavax.net.ssl.trustStore&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cuando una CA cambia de raíz, la nueva puede estar en el sistema y faltar en ese archivo.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nv"&gt;JAVA_TOOL_OPTIONS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'-Djavax.net.debug=ssl:trustmanager'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;COMANDO_DE_LA_APP&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'trustStore is'&lt;/span&gt;
readlink&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;RUTA_QUE_IMPRIMIO
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;trust list&lt;/code&gt; describe el almacén del sistema. Si la aplicación lo usa, lo confirma la propia JVM con las opciones con que arrancó, salvo que el código arme su propio contexto TLS; no conviene suponerlo.&lt;/p&gt;
&lt;h3 id="power-tip-3-valido-no-es-lo-mismo-que-aceptado"&gt;Power Tip #3 Válido no es lo mismo que aceptado&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;El token es válido, está vigente, lo firmó el emisor correcto, y la API responde 401.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un token de acceso dice para quién se emitió en el claim &lt;code&gt;aud&lt;/code&gt; (&lt;em&gt;audience&lt;/em&gt;, audiencia). La API lo compara con su lista de audiencias aceptadas; en APIM, eso lo hace la política &lt;code&gt;validate-azure-ad-token&lt;/code&gt; para tokens de Entra ID, o &lt;code&gt;validate-jwt&lt;/code&gt; donde se siga usando.&lt;/li&gt;
&lt;li&gt;En Entra ID, con tokens v1, el &lt;code&gt;aud&lt;/code&gt; depende de cómo se pidió el token: puede ser cualquiera de los Application ID URI registrados para la API, con o sin barra final, o su client ID a secas. Un cliente que pide &lt;code&gt;api://GUID/.default&lt;/code&gt; y otro que pide &lt;code&gt;GUID/.default&lt;/code&gt; (el GUID es el client ID de la API) pueden recibir &lt;code&gt;aud&lt;/code&gt; distintos para el mismo recurso, y si la API acepta uno solo, el otro se rechaza.&lt;/li&gt;
&lt;li&gt;La versión del token no depende del endpoint que usa el cliente: la fija el registro de la API, en &lt;code&gt;requestedAccessTokenVersion&lt;/code&gt; (&lt;code&gt;null&lt;/code&gt; o &lt;code&gt;1&lt;/code&gt; dan v1). En v2, el &lt;code&gt;aud&lt;/code&gt; es siempre el client ID; en v1, la API puede fijarlo igual con la propiedad &lt;code&gt;use_guid&lt;/code&gt; del claim opcional &lt;code&gt;aud&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;jq&lt;span class="w"&gt; &lt;/span&gt;-R&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'split(".")[1] | gsub("-";"+") | gsub("_";"/") | @base64d | fromjson | {aud, ver}'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Para que los valores coincidan hay tres lugares donde tocar, y no alcanzan a lo mismo. El &lt;code&gt;scope&lt;/code&gt; es de un cliente. La lista de audiencias que acepta la política de APIM y el formato del &lt;code&gt;aud&lt;/code&gt; que emite Entra ID son de la API, y cambian lo que reciben o aceptan todos sus clientes.&lt;/p&gt;
&lt;h3 id="power-link"&gt;Power Link&lt;/h3&gt;
&lt;p&gt;En marzo de 2026 empezó a correr un calendario que el CA/Browser Forum votó en abril de 2025: la duración máxima de un certificado TLS público baja por tramos de 398 días a 47, hasta marzo de 2029, y la reutilización de los datos de validación del dominio baja, también por tramos, de 398 a 10 días. Donde la renovación todavía es manual, una tarea de una vez por año pasa a hacerse como mínimo cada mes y medio: &lt;a href="https://cabforum.org/2025/04/11/ballot-sc081v3-introduce-schedule-of-reducing-validity-and-data-reuse-periods/"&gt;Ballot SC081v3: Introduce Schedule of Reducing Validity and Data Reuse Periods&lt;/a&gt;&lt;/p&gt;</description><category>Azure</category><category>DNS</category><category>java</category><category>seguridad</category><category>TLS</category><guid>https://sergiobelkin.com/posts/3-power-tips-power-link-i14/</guid><pubDate>Mon, 28 Sep 2026 00:16:16 GMT</pubDate></item></channel></rss>