当我尝试使用此命令获取带有客户端密钥和证书的页面时,我得到了此错误:
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
6条答案
按热度按时间xzv2uavs1#
首先,在
nginx.conf
中启用调试日志:重启nginx然后重复请求并检查日志文件。找到第一行
verify:0
:在这里,您可以看到
error:20
。错误代码来自OpenSSL。这里你可以通过代码找到常量名,这里通过常量名找到相应的描述。或者,您可以使用
openssl
命令行工具验证证书:为了验证服务器看到的文件,
ca.crt
必须是nginx.conf
中的ssl_client_certificate
或ssl_trusted_certificate
指令中列出的文件。要单独验证证书,
ca.crt
必须是用于签署client.crt
的证书。如果它是自签名的,它将是client.crt
本身(client.crt
将连续两次)。如果您专门获取
error 20
,并且您的客户端证书是自签名的,则可能遇到this bug。要修复它,您应该从证书中完全删除keyUsage
,或者将keyCertSign
添加到列表中。要验证您是否偶然发现了它,请检查以下命令的输出中的X509v3 extensions:
部分是否列出了Key Usage:xuo3flqw2#
我用来签署另一个证书的证书不是CA,所以它根本无法验证,这就是为什么我在
openssl verify
命令中遇到这个错误:如果你不是CA,那么显然你对此无能为力。
cl25kdpy3#
早期收到的CCS
看起来像是CVE-2014-0224修复的后果。由于补丁seems to be available检查您的系统是最新的或报告的错误给您的分销商。
如果您添加有关正在运行的服务器系统的信息,特别是哪个操作系统、哪个版本的OpenSSL和哪个补丁,则可能会提供更多详细信息。
kqhtkvqz4#
在我的情况下,我错误地下载了'cloudflare.crt'文件从数字海洋的网站,其中有旧的证书,这浪费了我相当多的时间.正如他们的教程显示在谷歌搜索。
wrong certificate from digital ocean
link to correct certificate
zphenhs45#
我有一个很好的工作方式。首先,在创建指向域之前,即
在你的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配置将是这样的
请将您的私钥放在您可以找到的路径中
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=全局