Ssl 使用Rest API的Nginx相互身份验证

Ssl 使用Rest API的Nginx相互身份验证,ssl,nginx,https,ca,Ssl,Nginx,Https,Ca,我想保护我正在编写的web API的集合。在订阅到期之前,必须向订阅方授予访问这些API的权限;这些API由远程web服务使用。所以我认为相互SSL是最好的 这样做的方式 我正在尝试设置自己的CA,以便向客户端颁发x509证书 这是我第一次这样做;所以,很自然,没有什么是有效的 这就是我想要得到的最终结果:我使用Nginx作为反向代理来部署我的api;如果客户端向Nginx发送有效证书,反向代理接受连接并转发请求;否则,连接将关闭。每当新客户端签署订阅时,我都会生成一个新证书并将其发送给他/她

我想保护我正在编写的web API的集合。在订阅到期之前,必须向订阅方授予访问这些API的权限;这些API由远程web服务使用。所以我认为相互SSL是最好的 这样做的方式

我正在尝试设置自己的CA,以便向客户端颁发x509证书

这是我第一次这样做;所以,很自然,没有什么是有效的

这就是我想要得到的最终结果:我使用Nginx作为反向代理来部署我的api;如果客户端向Nginx发送有效证书,反向代理接受连接并转发请求;否则,连接将关闭。每当新客户端签署订阅时,我都会生成一个新证书并将其发送给他/她

所以我遵循了指南,在我看来它比我读过的其他指南更完整,我在
/etc/ssl/ca/cert
中放置了一个自签名的
ca.crt
,用于对从客户端收到的
CSR
进行签名,我将nginx设置为

server {
    listen *:443    ssl;
    server_name     api.example.com;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    ssl_certificate /etc/ssl/certs/server.pem; #certificate from an actual CA
    ssl_certificate_key /etc/ssl/private/server.key; #PK of server.pem
    ssl_client_certificate /etc/ssl/ca/certs/ca.crt;
    ssl_crl /etc/ssl/ca/crl/ca.crl;
    ssl_verify_client on;
    ssl_protocols TLSv1.1 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; #ensure your cert is capable
    ssl_stapling_verify on; #ensure your cert is capable
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    #Redirects all traffic
    location / {
        proxy_pass http://mysecuredserver/api$request_uri;
        limit_req       zone=one burst=10;
    }
}
但是当我使用
Test
api(它总是以
200ok
响应)时,使用

我总是遇到以下错误:

< HTTP/1.1 400 Bad Request
* Server nginx is not blacklisted
< Server: nginx
< Date: Fri, 29 Sep 2017 18:00:16 GMT
< Content-Type: text/html
< Content-Length: 224
< Connection: close
< 
<html>
<head><title>400 The SSL certificate error</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<center>The SSL certificate error</center>
<hr><center>nginx</center>
</body>
</html>
* Closing connection 0
* SSLv3, TLS alert, Client hello (1):
nginx
*正在关闭连接0
*SSLv3,TLS警报,客户端你好(1):
谁能给我解释一下怎么了


第二个问题:在
ssl\u certificate
中,我放置了从有效CA购买的证书:是这样吗,还是应该放置使用
CA.crt
生成的证书?

如前所述,当Nginx中没有太多日志时,您应该添加

debug_connection <IP>;
如果未为
ssl\u客户端\u证书链中的每个证书提供CRL,则会发生此错误

下面是显示相同问题的类似线程

您需要指定指令
ssl\u crl
,并为其提供crl文件

  ssl_crl /etc/ssl/certs/crl/ca.crl;
此外,您应该验证
ssl\u证书
是否引用CA为您的服务器创建的证书:

ssl_certificate /etc/ssl/ca/certs/server.pem;       #signed by your CA

ssl_certificate_key /etc/ssl/ca/private/server.key; #PK used to generate 
                                                    #server.pem

ssl_client_certificate /etc/ssl/ca/certs/ca.crt;

ssl_crl /etc/ssl/ca/crl/ca.crl;                     #CRL of the
                                                    #ssl_client_certificate and
                                                    #its chain

慢慢来。你想一步一步走下去<代码>步骤1。您的SSL证书有效
。因此,删除
ssl\u验证\u客户端;ssl_client_certificate/etc/ssl/ca/certs/ca.crt。使用
curl-v查看连接是否良好https://api.example.com/Test
。步骤2-添加客户端证书并使验证成为可选。添加
ssl\u验证\u客户端可选;ssl_client_certificate/etc/ssl/ca/certs/ca.crt。在
location/
中添加'return 200“客户端证书状态-$ssl\u Client\u verify”。这将告诉您服务器是否能够验证证书。步骤1:工作正常。第2步,使用
ssl\u-verify\u-client-optional
:400错误请求,相同消息更改
ssl\u-verify\u-client-off
,然后尝试,nginx日志会说什么?它连接:我附加curl输出 ssl_crl /etc/ssl/certs/crl/ca.crl;
ssl_certificate /etc/ssl/ca/certs/server.pem;       #signed by your CA

ssl_certificate_key /etc/ssl/ca/private/server.key; #PK used to generate 
                                                    #server.pem

ssl_client_certificate /etc/ssl/ca/certs/ca.crt;

ssl_crl /etc/ssl/ca/crl/ca.crl;                     #CRL of the
                                                    #ssl_client_certificate and
                                                    #its chain