Estoy ejecutando una API web ASP.NET Core 1.1 en un contenedor Docker 1.13.1 en Ubuntu 14.04.
Cuando el código intenta recuperar algunos datos de un servidor HTTPS, aparece este error de autenticación de certificado:
An error occurred while sending the request. ---> System.Net.Http.CurlException: Peer certificate cannot be authenticated with given CA certificates at System.Net.Http.CurlHandler.ThrowIfCURLEError(CURLcode error) at System.Net.Http.CurlHandler.MultiAgent.FinishRequest(StrongToWeakReference`1 easyWrapper, CURLcode messageResult)El servidor HTTPS es interno con un certificado firmado por nuestra CA corporativa, así que sé que es posible que deba registrar la CA interna.
Todo lo que he encontrado hasta ahora sobre este error y Docker habla de hacer que Docker se ejecute, se conecte a repositorios, etc. Mi Docker funciona bien y la API web se ejecuta en el servidor Ubuntu fuera del contenedor sin ningún problema.
1) ¿Necesito agregar un certificado raíz de CA dentro de una imagen acoplable?
2) Si es así, ¿cómo lo hago?
3) Si no, ¿cómo soluciono esto?
La tarea en sí no es específica de la ventana acoplable, ya que también necesitaría agregar esa CA en un sistema normal. Hay una respuesta en la comunidad de askubuntu sobre cómo hacer esto.
Entonces, en un Dockerfile , haría lo siguiente (no olvide chmod en caso de que esté ejecutando el contenedor con un usuario que no sea root):
ADD your_ca_root.crt /usr/local/share/ca-certificates/foo.crt RUN chmod 644 /usr/local/share/ca-certificates/foo.crt && update-ca-certificatesPara simplificar/estandarizar todas las compilaciones de contenedores, ahora alojamos nuestros certificados en un servidor HTTPS central y los construimos en nuestros contenedores de esta manera:
# Debian stretch based container RUN curl -ks 'https://cert.host.server/ssl_certs/EnterpriseRootCA.crt' -o '/usr/local/share/ca-certificates/EnterpriseRootCA.crt' RUN /usr/sbin/update-ca-certificatesLos contenedores basados en Alpine no tienen las herramientas disponibles de inmediato, por lo que requieren un poco más de trabajo para lograr lo mismo:
# Alpine based containers RUN apk update && apk add curl WORKDIR /usr/local/share/ca-certificates RUN curl -ks 'https://cert.host.server/ssl_certs/EnterpriseRootCA.crt' -o '/usr/local/share/ca-certificates/EnterpriseRootCA.crt' RUN /usr/sbin/update-ca-certificatesSi también desea actualizar su almacén de confianza de Java (igual que en cualquier computadora):
RUN keytool -keystore /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias EnterpriseRootCA -file EnterpriseRootCA.crtTambién vale la pena señalar que esto definitivamente necesita usar la extensión .crt. Inicialmente probé esto con un archivo de certificado .pem (pensé que eran intercambiables, por lo que otros también podrían hacerlo), que no está vinculado por update-ca-certificates .