es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Windows Docker IIS App Pool no puede leer certificados del almacén local de certificados.

Tú eres un traductor de español que traduce documentos de TI. Traduce lo siguiente al español. No traduzcas el código ni la salida en Markdown:

He cargado los certificados pfx en Docker como parte de la imagen creada de la siguiente manera:

# Instala el certificado, ubicado en la carpeta de certificados de la máquina host, relativo a la ruta del Dockerfile de solución
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
WORKDIR C:\certs
COPY ./certs .\

RUN Get-ChildItem -File | Foreach { Import-PfxCertificate -Password (ConvertTo-SecureString -String "xyz1234" -AsPlainText -Force)  -CertStoreLocation Cert:\CurrentUser\My -FilePath $_.fullname }

Luego, tengo este simple archivo aspx para leer el certificado por su signature:

public X509Certificate2 FindCertificateByThumbprint(string findValue, bool validateCertificate)
    {
        X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
        try
        {
            store.Open(OpenFlags.ReadOnly);
            X509Certificate2Collection col = store.Certificates.Find(X509FindType.FindByThumbprint,
                findValue, validateCertificate);
            if (col == null || col.Count == 0)
                return null;
            return col[0];
        }
        finally
        {
            store.Close();
        }
    }

Nota:

  1. En mi portátil (fuera de Docker), esto funciona perfectamente para la web.
  2. En el contenedor de Docker, la aplicación de consola puede encontrar el certificado, pero no la aplicación web.

He intentado todo esto, pero sin éxito:

https://newbedev.com/how-to-grant-permission-to-user-on-certificate-private-key-using-powershell

https://stackoverflow.com/questions/40046916/how-to-grant-permission-to-user-on-certificate-private-key-using-powershell

Assigning Read Access to Windows Private Key

Parece que me falta un paso aquí, pero no estoy seguro de cuál. ¿Alguien ha encontrado una solución?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Algunas posibles soluciones para explorar:

    1. Verifique si el contenedor de Docker tiene acceso al almacén de certificados ejecutando el siguiente comando dentro del contenedor: certutil -store -user My. Esto debería mostrar todos los certificados almacenados en el almacén de certificados Cert:\ Currentuser\My. Si esto devuelve una lista vacía, entonces el certificado no se está cargando correctamente en el contenedor.
    2. Asegúrese de que el usuario que ejecuta la aplicación web dentro del contenedor de Docker tenga los permisos necesarios para acceder al almacén de certificados. Puede intentar otorgar permisos explícitos al usuario para la clave privada del certificado utilizando el comando PowerShell Set-Acl.

    3. En lugar de cargar el certificado como parte de la compilación de la imagen, considere montar el certificado como un volumen en tiempo de ejecución utilizando el comando docker run con la opción -v. Esto le permitiría mantener el certificado separado de la imagen del contenedor y también asegurar que cualquier cambio en el certificado se refleje inmediatamente en el contenedor en ejecución.

    4. Verifique que la huella digital que se está utilizando para localizar el certificado en el almacén sea correcta. Es posible que la huella digital del certificado haya cambiado desde que se cargó en el contenedor. Puede usar el comando certutil para mostrar la huella digital del certificado: certutil -store -user My <certificate_subject_name>. El <certificate_subject_name> se puede obtener ejecutando certutil -store -user My y ubicando el certificado en la salida.

    Esperamos que una de estas soluciones ayude a resolver el problema.

Comments are closed.