authentication - traducir - peer certificate cannot be authenticated with given ca certificates smart tv
AutenticaciĆ³n de certificado NGinx SSL firmada por CA intermedio(cadena) (6)
¿Has intentado aumentar la directiva ssl_verify_depth
? Docs dicen:
(it) sets a verification depth in the client certificates chain.
Pero su profundidad de verificación es 1. Usted dice:
He experimentado estableciendo ssl_verify_depth explícitamente en 1 (como arriba) y luego en 0 (no estoy seguro de qué significa ese número exactamente), pero todavía obtengo el mismo error.
Entonces, prueba 2 o 3 ..
PD: en todas partes donde encuentro este problema mencionado, se le dice que combine certificados CA intermedios con su certificado de servidor. en un archivo (como lo sugirió @ vikas-nalwar y lo hizo) en orden de verificación (pero no estoy seguro de si el pedido importa) y, en términos generales, establezca ssl_verify_depth
en el número de certificados del paquete.
Estoy intentando habilitar la autenticación del certificado del cliente en nginx donde los certificados han sido firmados por una CA intermedia. Puedo hacer que funcione bien cuando uso un certificado firmado por una CA raíz autofirmada; sin embargo, esto no funciona cuando la CA firmante es una CA intermedia.
Mi sección de servidor simple se ve así:
server {
listen 443;
server_name _;
ssl on;
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
ssl_client_certificate ca.pem;
ssl_verify_client on;
ssl_verify_depth 1;
location / {
root html;
index index.html index.htm;
}
}
Para los contenidos de ca.pem, intenté usar solo la CA intermedia y también concatenar el certificado de CA intermedio y el certificado de CA raíz, es decir, algo así como:
cp intermediate.crt ca.pem
cat root.crt >> ca.pem
También he validado que el certificado es válido desde la perspectiva de openssl cuando se utiliza la misma cadena CA:
openssl verify -CAfile /etc/nginx/ca.pem certs/client.crt
certs/client.crt: OK
He experimentado estableciendo ssl_verify_depth explícitamente en 1 (como arriba) y luego en 0 (no estoy seguro de qué significa ese número exactamente), pero todavía obtengo el mismo error.
El error que obtengo en todas las variantes del intermediario CA es "400 Bad Request" y más específicamente "The SSL certificate error" (no estoy seguro de lo que eso significa exactamente).
Tal vez nginx simplemente no es compatible con las cadenas de cert para certs intermedios? Cualquier ayuda muy apreciada!
Creo que desea habilitar la validación del cliente en su servidor. Si esto es así, no veo que tengas tu certificado de cliente en la cadena. Pruebe lo siguiente en el mismo orden. Use el certchain.pem.
cat client.crt > certchain.pem
cat intermediate.crt >> certchain.pem
cat root.crt >> certchain.pem
Otra manera fácil es concatenar certificados (incluido el certificado de dominio) en un solo archivo y usar eso en sus servidores y en el archivo nginx conf.
cat www.example.com.crt bundle.crt> www.example.com.chained.crt
Recuerde siempre usar primero el certificado del servidor y luego solo los certificados del servidor de la CA.
Puede leer más sobre en http://nginx.org/en/docs/http/configuring_https_servers.html#chains
Tengo que decir que funciona bien para mí con nginx/1.13.2
, es decir,
- Tengo una CA raíz que firmó dos CA intermedias
- ambos intermedios cada firmaron un cliente
Concatono los certs como
cat client-intermediate1.crt ca-client.crt > ca.chained1.crt
ycat client-intermediate2.crt ca-client.crt > ca.chained2.crt
ycat ca.chained1.crt ca.chained2.crt > ca.multiple.intermediate.crt
si solo pongo ca.chained1.crt como
ssl_client_certificate
entonces solo client1.crt puede conectarse, igualmente para ca.chained2.crt / client2.crt- cuando uso
ca.multiple.intermediate.crt
, ambos clientes pueden conectarse
para revocar un intermedio, simplemente elimine la cadena de cert de ca.multiple.intermediate.crt
aquí está la configuración relevante. también tiene una alta configuración de seguridad
# minimum settings for ssl client auth
ssl_client_certificate /etc/ssl/ca.multiple.intermediate.crt;
ssl_verify_client on;
ssl_verify_depth 2;
# ssl high security settings (as of writing this post)
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
si quiere analizar los certs CN y pasarlos al backend, entonces agregue esto FUERA del server {..
block
# parse out CN
map $ssl_client_s_dn $ssl_client_s_dn_cn {
default "should_not_happen";
~CN=(?<CN>[^,]+) $CN;
}
y DENTRO del bloque puedes usarlo luego
# add headers for backend containing SSL DN/CN
add_header X-SSL-client-s-dn $ssl_client_s_dn;
add_header X-SSL-client-s-dn_cn $ssl_client_s_dn_cn;
mientras luchaba con nginx y cloudflare,
estas líneas hicieron el truco para mí:
ssl_client_certificate /etc/nginx/ssl/ca-bundle-client.crt;
ssl_verify_client optional_no_ca;
ssl_verify_depth 2;
la segunda línea con optional_no_ca es la parte importante
Editar: También tuve este "problema", la solución y la explicación se encuentran en la parte inferior del texto .
Parecía que nginx no admite certificados intermedios. Mis certificados creados por mí mismo (RootCA es autofirmado, IntrermediateCA1 está firmado por RootCA, etc.)
RootCA -> IntermediateCA1 -> Client1
RootCA -> IntermediateCA2 -> Client2
Quiero usar en nginx "IntermediateCA1", para permitir el acceso al sitio solo al propietario del certificado "Client1".
Cuando pongo el archivo "ssl_client_certificate" con IntermediateCA1 y RootCA , y establezco "ssl_verify_depth 2" (o más), los clientes pueden iniciar sesión en el sitio usando el certificado Client1 y Client2 (solo debería ser Client1). El mismo resultado es cuando lo puse en el archivo "ssl_client_certificate" solo con RootCA : ambos clientes pueden iniciar sesión.
Cuando pongo el archivo "ssl_client_certificate" solo con IntermediateCA1 , y configuro "ssl_verify_depth 1" (o "2" o más, sin importar), es imposible iniciar sesión, obtengo el error 400. Y en el modo de depuración veo registros:
verify:0, error:20, depth:1, subject:"/C=PL/CN=IntermediateCA1/[email protected]",issuer: "/C=PL/CN=RootCA/[email protected]"
verify:0, error:27, depth:1, subject:"/C=PL/CN=IntermediateCA1/[email protected]",issuer: "/C=PL/CN=RootCA/[email protected]"
verify:1, error:27, depth:0, subject:"/C=PL/CN=Client1/[email protected]",issuer: "/C=PL/CN=IntermediateCA1/[email protected]"
(..)
client SSL certificate verify error: (27:certificate not trusted) while reading client request headers, (..)
Creo que esto es un error. Probado en Ubuntu, nginx 1.1.19 y 1.2.7-1 ~ dotdeb.1, openssl 1.0.1. Veo que nginx 1.3 tiene pocas opciones más sobre el uso de certificados de cliente, pero no veo solución a este problema.
Actualmente, la única forma de separar los clientes 1 y 2 es crear dos RootCAs autofirmadas, pero esto es solo una solución.
Edición 1: He informado este problema aquí: http://trac.nginx.org/nginx/ticket/301
Editar 2 " * Ok, no es un error, es una característica;) *
Recibo una respuesta aquí: http://trac.nginx.org/nginx/ticket/301 Está funcionando , solo debes verificar cuál es tu ssl_client_i_dn (. En lugar del emisor, también puedes usar el tema del certificado, o lo que quieras de http://wiki.nginx.org/HttpSslModule#Built-in_variables
Así es como funciona la verificación de certificados: el certificado debe verificarse hasta una raíz de confianza. Si la cadena no se puede construir en una raíz de confianza (no intermedia), la verificación falla. Si confía en la raíz, todos los certificados firmados por ella, directa o indirectamente, serán verificados con éxito.
Se puede usar la limitación de la profundidad de verificación si desea limitar los certificados del cliente solo a los certificados emitidos directamente, pero se trata más de la prevención de DoS, y obviamente no se puede usar para limitar el verificador a intermedio1 solamente (pero no intermedio2).
Lo que quiere aquí es una capa de autorización basada en el resultado de la verificación, es decir, puede verificar que el emisor del certificado del cliente sea intermedio1. La solución más simple sería rechazar las solicitudes si el DN del emisor no coincide con uno permitido, por ejemplo, algo así (completamente no probado):
[Editar por mí, está funcionando correctamente en mi configuración]
server {
listen 443 ssl;
ssl_certificate ...
ssl_certificate_key ...
ssl_client_certificate /path/to/ca.crt;
ssl_verify_client on;
ssl_verify_depth 2;
if ($ssl_client_i_dn != "/C=PL/CN=IntermediateCA1/[email protected]") {
return 403;
}
}