当我尝试使用此命令获取包含客户端密钥和证书的页面时出现此错误:
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
答案 0 :(得分:3)
我用来签署另一个证书的证书不是CA因此无法验证,所以这就是我从openssl verify
命令出现此错误的原因:
error 20 at 0 depth lookup:unable to get local issuer certificate
如果你不是CA那么显然你无能为力。
答案 1 :(得分:0)
ccs早早收到
看起来是CVE-2014-0224修复的后果。由于补丁seems to be available会检查您的系统是否是最新的,或者将错误报告给您的分销商。
如果要添加有关正在运行的服务器系统的信息,尤其是哪个操作系统,哪个版本的OpenSSL以及哪些补丁,可能会提供更多详细信息。
答案 2 :(得分:0)
首先,在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。 Here可以通过代码找到常量名称,here可以通过常量名称找到相应的描述。
或者,您也可以使用openssl
命令行工具来验证证书:
openssl verify -CAfile ca.crt client.crt
要在服务器看到它时对其进行验证,ca.crt
必须是ssl_client_certificate
的{{1}}或ssl_trusted_certificate
指令中列出的文件。
要单独验证证书,nginx.conf
必须是用于签署ca.crt
的证书。如果它是自签名的,它本身就是client.crt
(client.crt
将连续两次)。
如果您专门获得client.crt
并且客户证书是自签名的,则可能遇到了this bug。要解决此问题,您应该从证书中完全删除error 20
或将keyUsage
添加到列表中。要验证是否偶然发现,请检查以下命令输出的keyCertSign
部分中是否列出了“密钥用法”:
X509v3 extensions:
答案 3 :(得分:0)
就我而言,我错误地从 Digital Ocean 的网站下载了“cloudflare.crt”文件,该文件具有较旧的证书,这浪费了我相当多的时间。 当他们的教程出现在谷歌搜索中时。