# Soluciones Tecnicas Alfio

# Altice trunk por internet

Configuración de SIP TLS con certificado privado en Issabel/Asterisk para Altice

*<span style="font-size:11pt;line-height:107%;color:#475569;">Tutorial reproducible: Root CA privada, certificado de PBX con IP pública en Common Name y configuración de chan\_sip</span>*

<div id="bkmrk-resultado-esperado%3A-" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#EAF7EF;padding:7pt 8pt 7pt 8pt;">**<span style="color:#1e6b3a;">Resultado esperado: </span>**<span style="color:#1e6b3a;">La PBX presenta un certificado firmado por una Root CA privada. La IP pública del cliente aparece exclusivamente en el Subject Common Name (CN), sin Subject Alternative Name (SAN). Altice importa la Root CA como autoridad confiable.</span>

</td></tr></tbody></table>

</div><div id="bkmrk-compatibilidad%3A-proc" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#FFF3CD;padding:7pt 8pt 7pt 8pt;">**<span style="color:#7a4e00;">Compatibilidad: </span>**<span style="color:#7a4e00;">Procedimiento validado para Issabel con Asterisk 11 y chan\_sip. En PJSIP los nombres de parámetros y archivos de configuración son diferentes.</span>

</td></tr></tbody></table>

</div># 1. Alcance y arquitectura

El procedimiento crea una infraestructura de certificados independiente para cada cliente. No se debe reutilizar la Root CA de otro cliente.

<div id="bkmrk-dato-valor-%2F-descrip" style="text-align:center;"><table class="MsoTableGrid" style="border-collapse:collapse;border:none;"><thead><tr><td style="width:3.5in;border:solid 1pt;background:#1F4E78;padding:0in 5.4pt 0in 5.4pt;">**<span style="color:#FFFFFF;">Dato</span>**

</td><td style="width:3.5in;border:solid 1pt;border-left:none;background:#1F4E78;padding:0in 5.4pt 0in 5.4pt;">**<span style="color:#FFFFFF;">Valor / descripción</span>**

</td></tr></thead><tbody><tr><td style="width:3.5in;border:solid 1pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;">Root CA privada

</td><td style="width:3.5in;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Firma el certificado de la PBX. Altice importa únicamente el certificado público de esta CA.

</td></tr><tr><td style="width:3.5in;border:solid 1pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;">Certificado de la PBX

</td><td style="width:3.5in;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Contiene la IP pública en el Subject CN y se presenta durante el handshake TLS.

</td></tr><tr><td style="width:3.5in;border:solid 1pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;">Clave privada de la PBX

</td><td style="width:3.5in;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Permanece únicamente en la PBX. Nunca se comparte.

</td></tr><tr><td style="width:3.5in;border:solid 1pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;">Archivo PEM

</td><td style="width:3.5in;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Contiene la clave privada y el certificado de la PBX para que chan\_sip pueda cargarlo.

</td></tr></tbody></table>

</div># 2. Datos requeridos

<span style="font-family:Symbol;"><span>·<span style="font:7pt 'Times New Roman';"> </span></span></span>IP pública de la nueva PBX.

<span style="font-family:Symbol;"><span>·<span style="font:7pt 'Times New Roman';"> </span></span></span>IP o FQDN del SBC de Altice.

<span style="font-family:Symbol;"><span>·<span style="font:7pt 'Times New Roman';"> </span></span></span>Puerto TLS asignado por Altice, normalmente 5061.

<span style="font-family:Symbol;"><span>·<span style="font:7pt 'Times New Roman';"> </span></span></span>Codecs y parámetros SIP entregados por Altice.

<div id="bkmrk-ejemplo-del-tutorial" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#EAF2F8;padding:7pt 8pt 7pt 8pt;">**<span style="color:#1f4e78;">Ejemplo del tutorial: </span>**<span style="color:#1f4e78;">Se utilizará 200.10.20.30 como IP ficticia. Sustituirla por la IP pública real del cliente.</span>

</td></tr></tbody></table>

</div># 3. Respaldar la configuración existente

<div id="bkmrk-fecha%3D%24%28date-%2B%25f-%25h%25" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">FECHA=$(date +%F-%H%M%S)</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">mkdir -p /root/backup-tls-$FECHA</span><span style="color:#000000;">  
  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">cp -a /var/lib/asterisk/keys /root/backup-tls-$FECHA/</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">cp -a /etc/asterisk/sip\_general\_custom.conf /root/backup-tls-$FECHA/ 2&gt;/dev/null</span><span style="color:#000000;">  
  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">ls -lah /root/backup-tls-$FECHA</span>

</td></tr></tbody></table>

</div># 4. Crear el directorio de trabajo y definir la IP

<div id="bkmrk-mkdir--p-%2Froot%2Fissab" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">mkdir -p /root/issabelpbx-certificados</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">cd /root/issabelpbx-certificados</span><span style="color:#000000;">  
  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">IP\_PUBLICA="200.10.20.30"</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">echo "$IP\_PUBLICA"</span>

</td></tr></tbody></table>

</div># 5. Crear la Root CA

## 5.1 Generar la clave privada de la Root CA

<div id="bkmrk-openssl-genrsa--out-" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">openssl genrsa -out issabelpbx-root-ca.key 4096</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">chmod 600 issabelpbx-root-ca.key</span>

</td></tr></tbody></table>

</div><div id="bkmrk-seguridad%3A-issabelpb" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#FDECEC;padding:7pt 8pt 7pt 8pt;">**<span style="color:#8b1e1e;">Seguridad: </span>**<span style="color:#8b1e1e;">issabelpbx-root-ca.key es la clave privada de la CA. No se envía a Altice, no se coloca en correos y debe conservarse en un respaldo seguro.</span>

</td></tr></tbody></table>

</div>## 5.2 Crear la configuración de la Root CA

<div id="bkmrk-cat-%3E-issabelpbx-roo" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">cat &gt; issabelpbx-root-ca.cnf &lt;&lt;'EOF'</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">\[req\]</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">prompt = no</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">default\_md = sha256</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">distinguished\_name = dn</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">x509\_extensions = v3\_ca</span><span style="color:#000000;">  
  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">\[dn\]</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">C = DO</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">O = IssabelPBX</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">OU = Voice Security</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">CN = IssabelPBX Root CA</span><span style="color:#000000;">  
  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">\[v3\_ca\]</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">subjectKeyIdentifier = hash</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">authorityKeyIdentifier = keyid:always,issuer</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">basicConstraints = critical,CA:TRUE</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">keyUsage = critical,keyCertSign,cRLSign</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">EOF</span>

</td></tr></tbody></table>

</div>## 5.3 Generar el certificado Root CA

<div id="bkmrk-openssl-req--x509--n" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">openssl req -x509 -new -key issabelpbx-root-ca.key -sha256 -days 3650 -out issabelpbx-root-ca.crt -config issabelpbx-root-ca.cnf</span>

</td></tr></tbody></table>

</div>## 5.4 Verificar la Root CA

<div id="bkmrk-openssl-x509--in-iss" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">openssl x509 -in issabelpbx-root-ca.crt -noout -subject -issuer -dates</span><span style="color:#000000;">  
  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">openssl x509 -in issabelpbx-root-ca.crt -noout -text | grep -A3 "Basic Constraints"</span>

</td></tr></tbody></table>

</div>Resultado esperado: el Subject y el Issuer son iguales y aparece CA:TRUE.

# 6. Crear el certificado de la PBX

## 6.1 Generar la clave privada de la PBX

<div id="bkmrk-openssl-genrsa--out--1" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">openssl genrsa -out issabelpbx.key 2048</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">chmod 600 issabelpbx.key</span>

</td></tr></tbody></table>

</div><div id="bkmrk-compatibilidad%3A-rsa-" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#EAF2F8;padding:7pt 8pt 7pt 8pt;">**<span style="color:#1f4e78;">Compatibilidad: </span>**<span style="color:#1f4e78;">RSA 2048 ofrece mayor compatibilidad con SBC antiguos. Si Altice confirma soporte y existe un requerimiento formal, puede usarse RSA 4096.</span>

</td></tr></tbody></table>

</div>## 6.2 Crear la configuración con la IP en el Common Name y sin SAN

<div id="bkmrk-cat-%3E-issabelpbx.cnf" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">cat &gt; issabelpbx.cnf &lt;&lt;EOF</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">\[req\]</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">prompt = no</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">default\_md = sha256</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">distinguished\_name = dn</span><span style="color:#000000;">  
  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">\[dn\]</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">C = DO</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">O = IssabelPBX</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">OU = VoIP</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">CN = ${IP\_PUBLICA}</span><span style="color:#000000;">  
  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">\[v3\_cert\]</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">subjectKeyIdentifier = hash</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">authorityKeyIdentifier = keyid,issuer</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">basicConstraints = critical,CA:FALSE</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">keyUsage = critical,digitalSignature,keyEncipherment</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">extendedKeyUsage = serverAuth,clientAuth</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">EOF</span>

</td></tr></tbody></table>

</div><div id="bkmrk-requisito-de-altice%3A" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#FFF3CD;padding:7pt 8pt 7pt 8pt;">**<span style="color:#7a4e00;">Requisito de Altice: </span>**<span style="color:#7a4e00;">No agregar subjectAltName. La IP debe quedar exclusivamente en Subject Common Name (CN).</span>

</td></tr></tbody></table>

</div>## 6.3 Generar el CSR

<div id="bkmrk-openssl-req--new--ke" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">openssl req -new -key issabelpbx.key -out issabelpbx.csr -config issabelpbx.cnf</span><span style="color:#000000;">  
  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">openssl req -in issabelpbx.csr -noout -subject</span>

</td></tr></tbody></table>

</div>Resultado esperado: CN=IP\_PUBLICA.

## 6.4 Firmar el certificado con la Root CA

<div id="bkmrk-openssl-x509--req--i" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">openssl x509 -req -in issabelpbx.csr -CA issabelpbx-root-ca.crt -CAkey issabelpbx-root-ca.key -CAcreateserial -out issabelpbx.crt -days 825 -sha256 -extfile issabelpbx.cnf -extensions v3\_cert</span>

</td></tr></tbody></table>

</div>## 6.5 Crear el PEM que utilizará Asterisk

<div id="bkmrk-cat-issabelpbx.key-i" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">cat issabelpbx.key issabelpbx.crt &gt; issabelpbx.pem</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">chmod 600 issabelpbx.pem</span><span style="color:#000000;">  
  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">grep "BEGIN" issabelpbx.pem</span>

</td></tr></tbody></table>

</div>Debe aparecer una clave privada y un certificado.

# 7. Validar los certificados antes de instalarlos

## 7.1 Verificar Subject, Issuer, vigencia y serie

<div id="bkmrk-openssl-x509--in-iss-1" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">openssl x509 -in issabelpbx.crt -noout -subject -issuer -dates -serial -fingerprint -sha256</span>

</td></tr></tbody></table>

</div>Debe mostrarse el CN con la IP pública y el Issuer como IssabelPBX Root CA.

## 7.2 Confirmar que no existe SAN

<div id="bkmrk-openssl-x509--in-iss-2" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">openssl x509 -in issabelpbx.crt -noout -text | grep -A3 "Subject Alternative Name"</span>

</td></tr></tbody></table>

</div>El comando no debe devolver ninguna línea.

## 7.3 Verificar la cadena de confianza

<div id="bkmrk-openssl-verify--cafi" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">openssl verify -CAfile issabelpbx-root-ca.crt issabelpbx.crt</span>

</td></tr></tbody></table>

</div>Resultado esperado: issabelpbx.crt: OK

## 7.4 Verificar que la clave y el certificado coincidan

<div id="bkmrk-openssl-x509--in-iss-3" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">openssl x509 -in issabelpbx.crt -noout -modulus | openssl md5</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">openssl rsa -in issabelpbx.key -noout -modulus | openssl md5</span>

</td></tr></tbody></table>

</div>Los dos hashes deben ser idénticos.

# 8. Archivos generados y tratamiento

<div id="bkmrk-archivo-funci%C3%B3n-%C2%BFse-" style="text-align:center;"><table class="MsoTableGrid" style="border-collapse:collapse;border:none;"><thead><tr><td style="width:168pt;border:solid 1pt;background:#1F4E78;padding:0in 5.4pt 0in 5.4pt;">**<span style="color:#FFFFFF;">Archivo</span>**

</td><td style="width:168pt;border:solid 1pt;border-left:none;background:#1F4E78;padding:0in 5.4pt 0in 5.4pt;">**<span style="color:#FFFFFF;">Función</span>**

</td><td style="width:168pt;border:solid 1pt;border-left:none;background:#1F4E78;padding:0in 5.4pt 0in 5.4pt;">**<span style="color:#FFFFFF;">¿Se comparte con Altice?</span>**

</td></tr></thead><tbody><tr><td style="width:168pt;border:solid 1pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;">issabelpbx-root-ca.crt

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Certificado público de la Root CA

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Sí

</td></tr><tr><td style="width:168pt;border:solid 1pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;">issabelpbx-root-ca.key

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Clave privada de la Root CA

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Nunca

</td></tr><tr><td style="width:168pt;border:solid 1pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;">issabelpbx.crt

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Certificado público de la PBX

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Solo si Altice lo solicita

</td></tr><tr><td style="width:168pt;border:solid 1pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;">issabelpbx.key

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Clave privada de la PBX

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Nunca

</td></tr><tr><td style="width:168pt;border:solid 1pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;">issabelpbx.pem

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Clave privada + certificado para Asterisk

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Nunca

</td></tr><tr><td style="width:168pt;border:solid 1pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;">issabelpbx.csr

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Solicitud de certificado

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">No es necesario

</td></tr></tbody></table>

</div><div id="bkmrk-entrega-habitual%3A-al" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#EAF7EF;padding:7pt 8pt 7pt 8pt;">**<span style="color:#1e6b3a;">Entrega habitual: </span>**<span style="color:#1e6b3a;">Altice importa issabelpbx-root-ca.crt como Trusted Root CA. La PBX presenta issabelpbx.crt automáticamente durante el handshake TLS.</span>

</td></tr></tbody></table>

</div># 9. Instalar los certificados en Issabel

<div id="bkmrk-cp-%2Froot%2Fissabelpbx-" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">cp /root/issabelpbx-certificados/issabelpbx.pem /var/lib/asterisk/keys/</span><span style="color:#000000;">  
  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">cp /root/issabelpbx-certificados/issabelpbx.crt /var/lib/asterisk/keys/</span><span style="color:#000000;">  
  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">cp /root/issabelpbx-certificados/issabelpbx-root-ca.crt /var/lib/asterisk/keys/</span><span style="color:#000000;">  
  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">chown asterisk:asterisk /var/lib/asterisk/keys/issabelpbx.pem /var/lib/asterisk/keys/issabelpbx.crt /var/lib/asterisk/keys/issabelpbx-root-ca.crt</span><span style="color:#000000;">  
  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">chmod 640 /var/lib/asterisk/keys/issabelpbx.pem</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">chmod 644 /var/lib/asterisk/keys/issabelpbx.crt</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">chmod 644 /var/lib/asterisk/keys/issabelpbx-root-ca.crt</span>

</td></tr></tbody></table>

</div># 10. Configurar TLS en chan\_sip

Editar /etc/asterisk/sip\_general\_custom.conf y agregar o ajustar:

<div id="bkmrk-tlsenable%3Dyestlsbind" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">tlsenable=yes</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">tlsbindaddr=0.0.0.0:5061</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">tlsclientmethod=tlsv1\_2</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">tlsdontverifyserver=yes</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">tlscertfile=/var/lib/asterisk/keys/issabelpbx.pem</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">tlscafile=/var/lib/asterisk/keys/issabelpbx-root-ca.crt</span>

</td></tr></tbody></table>

</div><div id="bkmrk-importante%3A-tlsdontv" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#EAF2F8;padding:7pt 8pt 7pt 8pt;">**<span style="color:#1f4e78;">Importante: </span>**<span style="color:#1f4e78;">tlsdontverifyserver=yes desactiva la validación del certificado remoto por parte de la PBX. No afecta la validación que Altice realiza sobre el certificado de la PBX.</span>

</td></tr></tbody></table>

</div>Buscar configuraciones TLS duplicadas:

<div id="bkmrk-grep--rnie-%27%5E%28tlsena" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">grep -RniE '^(tlsenable|tlsbindaddr|tlsclientmethod|tlsdontverifyserver|tlscertfile|tlscafile)' /etc/asterisk</span>

</td></tr></tbody></table>

</div># 11. Configurar el trunk de Altice

<div id="bkmrk-plantilla%3A-los-par%C3%A1m" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#FFF3CD;padding:7pt 8pt 7pt 8pt;">**<span style="color:#7a4e00;">Plantilla: </span>**<span style="color:#7a4e00;">Los parámetros de autenticación, dominio, DID, codecs y SRTP deben ajustarse a la ficha técnica entregada por Altice.</span>

</td></tr></tbody></table>

</div><div id="bkmrk-type%3Dpeerhost%3Dip_sbc" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">type=peer</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">host=IP\_SBC\_ALTICE</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">port=5061</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">transport=tls</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">context=from-trunk</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">disallow=all</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">allow=ulaw</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">allow=alaw</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">insecure=port,invite</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">qualify=yes</span><span style="color:#000000;">  
  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">; Si Altice exige SRTP:</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">; encryption=yes</span>

</td></tr></tbody></table>

</div># 12. Reiniciar y verificar Asterisk

<div id="bkmrk-systemctl-restart-as" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">systemctl restart asterisk</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">systemctl status asterisk --no-pager</span><span style="color:#000000;">  
  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">asterisk -rx "sip show settings" | grep -i -A5 TLS</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">ss -lntp | grep 5061</span>

</td></tr></tbody></table>

</div>Debe aparecer TLS SIP Bindaddress: 0.0.0.0:5061 y Asterisk escuchando en el puerto TCP 5061.

# 13. Confirmar el certificado realmente presentado por Asterisk

<div id="bkmrk-echo-%7C-openssl-s_cli" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">echo | openssl s\_client -connect 127.0.0.1:5061 -showcerts 2&gt;/dev/null | openssl x509 -noout -subject -issuer -dates -serial -fingerprint -sha256</span>

</td></tr></tbody></table>

</div>La salida debe mostrar Subject CN=IP\_PUBLICA e Issuer CN=IssabelPBX Root CA.

<div id="bkmrk-echo-%7C-openssl-s_cli-1" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">echo | openssl s\_client -connect 127.0.0.1:5061 -showcerts 2&gt;/dev/null | openssl x509 -noout -text | grep -A3 "Subject Alternative Name"</span>

</td></tr></tbody></table>

</div>No debe mostrar resultados.

# 14. Verificación externa y captura con Wireshark

Desde una red externa, probar el puerto y el certificado:

<div id="bkmrk-openssl-s_client--co" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">openssl s\_client -connect IP\_PUBLICA:5061 -tls1\_2 -showcerts</span>

</td></tr></tbody></table>

</div>En Wireshark puede filtrarse el certificado con:

<div id="bkmrk-tls.handshake.type-%3D" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">tls.handshake.type == 11</span>

</td></tr></tbody></table>

</div>En versiones antiguas:

<div id="bkmrk-ssl.handshake.type-%3D" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">ssl.handshake.type == 11</span>

</td></tr></tbody></table>

</div>Ruta de validación: TLS &gt; Handshake Protocol: Certificate &gt; Certificate &gt; signedCertificate &gt; subject &gt; commonName. Debe aparecer la IP pública.

# 15. Errores frecuentes y diagnóstico

<div id="bkmrk-mensaje-interpretaci" style="text-align:center;"><table class="MsoTableGrid" style="border-collapse:collapse;border:none;"><thead><tr><td style="width:168pt;border:solid 1pt;background:#1F4E78;padding:0in 5.4pt 0in 5.4pt;">**<span style="color:#FFFFFF;">Mensaje</span>**

</td><td style="width:168pt;border:solid 1pt;border-left:none;background:#1F4E78;padding:0in 5.4pt 0in 5.4pt;">**<span style="color:#FFFFFF;">Interpretación probable</span>**

</td><td style="width:168pt;border:solid 1pt;border-left:none;background:#1F4E78;padding:0in 5.4pt 0in 5.4pt;">**<span style="color:#FFFFFF;">Acción recomendada</span>**

</td></tr></thead><tbody><tr><td style="width:168pt;border:solid 1pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;">tlsv1 alert unknown ca

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">El SBC no confía en la CA emisora.

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Confirmar que Altice importó issabelpbx-root-ca.crt como Trusted Root CA y lo asoció al trunk.

</td></tr><tr><td style="width:168pt;border:solid 1pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;">tlsv1 alert internal error

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">El SBC superó o cambió la etapa de validación, pero falla otra política.

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Revisar CN, ausencia de SAN, RSA 2048/4096, EKU, TLS 1.2, cifrados y logs detallados del SBC.

</td></tr><tr><td style="width:168pt;border:solid 1pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;">FILE \* open failed!

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Asterisk no pudo completar o manejar el flujo TLS, o no puede leer un archivo.

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Validar rutas, permisos, propietario y el error TLS inmediatamente anterior.

</td></tr><tr><td style="width:168pt;border:solid 1pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;">Asterisk presenta un certificado antiguo

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">La configuración no fue recargada o existe otra definición TLS.

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Revisar grep recursivo, reiniciar Asterisk y repetir openssl s\_client contra 127.0.0.1:5061.

</td></tr><tr><td style="width:168pt;border:solid 1pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;">No aparece CN con la IP

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Se generó el certificado con otro Subject.

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Recrear el CSR y certificado verificando CN=${IP\_PUBLICA}.

</td></tr><tr><td style="width:168pt;border:solid 1pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;">Aparece Subject Alternative Name

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">La plantilla incluyó SAN.

</td><td style="width:168pt;border-top:none;border-left:none;border-bottom:solid 1pt;border-right:solid 1pt;padding:0in 5.4pt 0in 5.4pt;">Regenerar el certificado sin ninguna sección subjectAltName.

</td></tr></tbody></table>

</div># 16. Lista de comprobación final

**☐** Se creó una Root CA exclusiva para el cliente.

**☐** La Root CA muestra CA:TRUE.

**☐** El certificado de la PBX muestra CA:FALSE.

**☐** El Subject CN contiene la IP pública correcta.

**☐** El certificado no contiene Subject Alternative Name.

**☐** Extended Key Usage incluye serverAuth y clientAuth.

**☐** openssl verify devuelve OK.

**☐** La clave privada coincide con el certificado.

**☐** El PEM contiene la clave privada y el certificado.

**☐** Los archivos están instalados en /var/lib/asterisk/keys.

**☐** Los permisos y propietario son correctos.

**☐** Asterisk escucha en TCP 5061.

**☐** El trunk utiliza transport=tls.

**☐** Altice importó la Root CA.

**☐** openssl s\_client confirma el certificado activo.

**☐** Wireshark muestra la IP en subject &gt; commonName.

# 17. Respaldo recomendado

<div id="bkmrk-mkdir--p-%2Froot%2Frespa" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#F2F4F7;padding:6pt 8pt 6pt 8pt;"><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">mkdir -p /root/respaldo-pki-issabelpbx</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">cp -a /root/issabelpbx-certificados/\* /root/respaldo-pki-issabelpbx/</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">chmod 700 /root/respaldo-pki-issabelpbx</span><span style="color:#000000;">  
</span><span style="font-size:8.5pt;line-height:107%;font-family:'Liberation Mono';color:#1e293b;">chmod 600 /root/respaldo-pki-issabelpbx/\*.key</span>

</td></tr></tbody></table>

</div><div id="bkmrk-conservaci%C3%B3n%3A-guarda" style="text-align:center;"><table class="MsoNormalTable" style="border-collapse:collapse;"><tbody><tr><td style="width:7in;background:#FDECEC;padding:7pt 8pt 7pt 8pt;">**<span style="color:#8b1e1e;">Conservación: </span>**<span style="color:#8b1e1e;">Guardar una copia cifrada y fuera del servidor de issabelpbx-root-ca.key. Sin esa clave no será posible emitir nuevos certificados bajo la misma Root CA.</span>

</td></tr></tbody></table>

</div># 18. Resumen operativo

<span><span>1.<span style="font:7pt 'Times New Roman';"> </span></span></span>Crear una Root CA nueva y exclusiva para el cliente.

<span><span>2.<span style="font:7pt 'Times New Roman';"> </span></span></span>Crear la clave y el CSR de la PBX con la IP pública en CN y sin SAN.

<span><span>3.<span style="font:7pt 'Times New Roman';"> </span></span></span>Firmar el certificado de la PBX con la Root CA.

<span><span>4.<span style="font:7pt 'Times New Roman';"> </span></span></span>Validar cadena, CN, ausencia de SAN y coincidencia de clave.

<span><span>5.<span style="font:7pt 'Times New Roman';"> </span></span></span>Enviar a Altice únicamente el certificado público de la Root CA, salvo que soliciten otro archivo.

<span><span>6.<span style="font:7pt 'Times New Roman';"> </span></span></span>Instalar PEM, certificado y Root CA en Issabel.

<span><span>7.<span style="font:7pt 'Times New Roman';"> </span></span></span>Configurar chan\_sip, trunk TLS y reiniciar Asterisk.

<span><span>8.<span style="font:7pt 'Times New Roman';"> </span></span></span>Verificar el certificado activo con openssl s\_client y, si es necesario, con Wireshark.