SSL 客户端证书认证返回“21:无法验证第一个证书”

SSL 客户端证书认证返回“21:无法验证第一个证书”

我正在将一些旧的和损坏的 apache2 网络服务器转移到更新、更具弹性的 nginx 容器。

在我的旧 Web 服务器上,我有一个托管 的 apache2 服务器secretbackdoor.example.com,它使用签名证书对“用户”(仅限我)进行身份验证。 CA 的设置方式如下:

> ROOT CA (self-signed, obviously)
|--> Intermediate CA (Signed by ROOT CA)
  |--> Client Certificate (Signed by Intermediate CA)

这个堆栈溢出问题表明我无法进行直接的中间 CA 验证。另外:从技术上讲,我同意 nginx 是正确的,但实际上,将证书范围限定在特定的中间 CA 是有用的……我离题了。

话虽如此,我还是按照问题中的说明操作,但遇到了麻烦。我已设置为 CA 证书。当我尝试使用具有客户端证书的浏览器进行连接时,我的文件ssl_client_certificate中出现以下错误:error.log

client SSL certificate verify error: (21:unable to verify the first certificate) while reading client request headers, client: 1.1.1.1, server: secretbackdoor.example.com, request: "GET / HTTP/2.0", host: "secretbackdoor.example.com"

除了设置ssl_client_certificate链式证书之外,我还尝试使用中介 CA,但无济于事。

我正在使用 docker 运行 nginx,并使用 letsencrypt 证书保护流量。我不确定这是否是导致问题的原因,但我认为这不应该是一个问题,因为客户端证书可以并且通常由不同的 CA 机构签名。

这是我的网站设置:

server {
    listen       443;
    server_name  secretbackdoor.example.com;

    ssl_certificate /etc/letsencrypt/live/secretbackdoor.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/secretbackdoor.example.com/privkey.pem;
    ssl_client_certificate /etc/nginx/conf.d/certs/root_ca.pem;

    ssl_verify_client on;
    ssl_verify_depth 2;

    # https://github.com/certbot/certbot/blob/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf
    include /etc/letsencrypt/options-ssl-nginx.conf;
    # https://github.com/certbot/certbot/blob/master/certbot/certbot/ssl-dhparams.pem
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

任何帮助都将不胜感激!

答案1

TLDR;在文件中包含整个证书链ssl_client_certificate

我不确定这是否对您有帮助,但我能够验证由三级 CA 颁发的客户端证书。布局如下:

> Root CA (self-signed, obviously)
|--> Intermediate CA (Signed by Root CA)
  |--> Department CA (Signed by Intermediate CA)
    |--> Client Certificate (Signed by Department CA)

我使用的文件ssl_client_certificate中包含所有 3 个 CA 证书。我还将其ssl_verify_depth设置为3。我采取的另一个重要步骤是确保将其error_log设置为info并与我正在测试的特定部分隔离server。当我在配置中只有部分证书链时,这是 nginx 生成的错误消息:

[信息] 20996#20996:*1 客户端 SSL 证书验证错误:(21:无法验证第一个证书)读取客户端请求标头时,客户端:10.0.1.33,服务器:,请求:“GET / HTTP/1.1”,主机:“dept-connector”

相关内容