nginx 400错误请求:SSL证书错误

9w11ddsr  于 2023-10-17  发布在  Nginx
关注(0)|答案(6)|浏览(280)

当我尝试使用此命令获取带有客户端密钥和证书的页面时,我得到了此错误:

curl -v -s --key /home/dmitry/Downloads/client_cert/client.mysite.key --cert /home/dmitry/Downloads/client_cert/client.mysite.crt https://mysite.com/api/login/

以下是我在nginx日志中看到的内容:

2014/12/08 06:30:55 [crit] 13087#0: *404 SSL_do_handshake() failed (SSL: error:14094085:SSL routines:SSL3_READ_BYTES:ccs received early) while SSL handshaking, client: xxx.xxx.xxx.xxx, server: 0.0.0.0:443

下面是我的nginx.conf的一部分:

server {
    listen  443 ssl;

    ssl_certificate     /home/mysite/conf/dev/ssl/com.mysite.crt;
    ssl_certificate_key /home/mysite/conf/dev/ssl/com.mysite.key;
    ssl_client_certificate /home/mysite/conf/dev/ssl/com.mysite.crt;
    ssl_verify_client optional; 
    ssl_protocols       SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    server_name   mysite.com www.mysite.com;
    access_log    /home/mysite/logs/nginx_access.log;
    error_log     /home/mysite/logs/nginx_error.log;

    location /api/{
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        proxy_set_header SSL-client-serial $ssl_client_serial;
        proxy_set_header SSL-client-dn $ssl_client_s_dn;
        proxy_set_header SSL-client-verify $ssl_client_verify;

        if ($ssl_client_verify != SUCCESS) {
            return 403;
            break;
        }
    }
}

以下是我用来创建客户端证书的命令:

openssl req -out client.mysite.csr -new -newkey rsa:2048 -nodes -keyout client.mysite.key
openssl x509 -req -days 3650 -in client.mysite.csr -CA com.mysite.crt -CAkey com.mysite.key -set_serial 01 -out client.mysite.crt

这里能出什么问题?我应该使用其他证书作为我的客户端证书而不是服务器证书的CA吗?
更新:
当我做

openssl verify -CAfile com.mysite.crt client.mysite.crt

我得到:

error 20 at 0 depth lookup:unable to get local issuer certificate
xzv2uavs

xzv2uavs1#

首先,在nginx.conf中启用调试日志:

error_log  logs/error.log debug;

重启nginx然后重复请求并检查日志文件。找到第一行verify:0

2019/12/05 22:34:50 [debug] 5980#9776: *17 verify:0, error:20, depth:0, subject:"/CN=...", issuer:"/CN=..."

在这里,您可以看到error:20。错误代码来自OpenSSL。这里你可以通过代码找到常量名,这里通过常量名找到相应的描述。
或者,您可以使用openssl命令行工具验证证书:

openssl verify -CAfile ca.crt client.crt

为了验证服务器看到的文件,ca.crt必须是nginx.conf中的ssl_client_certificatessl_trusted_certificate指令中列出的文件。
要单独验证证书,ca.crt必须是用于签署client.crt的证书。如果它是自签名的,它将是client.crt本身(client.crt将连续两次)。
如果您专门获取error 20,并且您的客户端证书是自签名的,则可能遇到this bug。要修复它,您应该从证书中完全删除keyUsage,或者将keyCertSign添加到列表中。要验证您是否偶然发现了它,请检查以下命令的输出中的X509v3 extensions:部分是否列出了Key Usage:

openssl x509 -in client.crt -text -noout
xuo3flqw

xuo3flqw2#

我用来签署另一个证书的证书不是CA,所以它根本无法验证,这就是为什么我在openssl verify命令中遇到这个错误:

error 20 at 0 depth lookup:unable to get local issuer certificate

如果你不是CA,那么显然你对此无能为力。

cl25kdpy

cl25kdpy3#

早期收到的CCS
看起来像是CVE-2014-0224修复的后果。由于补丁seems to be available检查您的系统是最新的或报告的错误给您的分销商。
如果您添加有关正在运行的服务器系统的信息,特别是哪个操作系统、哪个版本的OpenSSL和哪个补丁,则可能会提供更多详细信息。

kqhtkvqz

kqhtkvqz4#

在我的情况下,我错误地下载了'cloudflare.crt'文件从数字海洋的网站,其中有旧的证书,这浪费了我相当多的时间.正如他们的教程显示在谷歌搜索。
wrong certificate from digital ocean
link to correct certificate

zphenhs4

zphenhs45#

我有一个很好的工作方式。首先,在创建指向域之前,即

server_name api.example.com;
   location / {
        proxy_pass "http://example.com:9191";
    }

在你的cpanel中创建一个api.domain.com的子域名,然后在这里找到你的crt文件
/var/cpanel/ssl/apache_tls/api.domain.com
你会发现合并后的文件完成现在把合并文件即
ssl_certificate /var/cpanel/ssl/apache_tls/api.domain.com/combined;
然后ssl你会发现它在cpanel ssl/tsl->安装ssl
你可以通过google找到你的ssl文件
你的最终ssl配置将是这样的

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name api.example.com;

    location / {
        proxy_pass "http://example.com:9191";
    }

    location /socket.io/ {

        proxy_pass "http://example.com:9191";
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;

    }
    location /engine.io/ {

        proxy_pass "http://example.com:9191";
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;

    }

    ssl_certificate /var/cpanel/ssl/apache_tls/api.domain.com/combined;
    ssl_certificate_key /var/cpanel/ssl/system/certs/crashgame/private.key;
}

请将您的私钥放在您可以找到的路径中

rggaifut

rggaifut6#

在我的情况下,我没有填写科目,如ST的L。
当你创建csr的时候,不要忘记传递“/C=UK/ST=伦敦/L=LONDON/O=Global Security/IT Department”。
openssl req -new -key $CLIENT.key -out $CLIENT.csr -subj“/C=UK/ST=LONDON/L=LONDON/O=全局

相关问题