如何正确生成用于 Nginx 的自签名证书

如何正确生成用于 Nginx 的自签名证书

我使用 openssl 生成了以下证书:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt -subj "/C=IT/ST=Mi/L=Milan/O=MyOrg/OU=RnD/CN=localhost/[email protected]"
openssl rsa -in server.key -out server.insicure.key
cat server.insicure.key > certificate.pem
cat server.crt >> certificate.pem

然后我设置 nginx 来保护网站的客户端安全:

server {
    listen 80 ssl;
    root /var/www/site;

    index index.html;

    ssl_certificate         /root/server.crt;
    ssl_certificate_key     /root/server.key;

    ssl_client_certificate  /root/certificate.pem;

    ssl_verify_client on;
    ssl_verify_depth 2;

     location / {
            try_files $uri $uri/ =404;
    }
}

但是,当我尝试使用 curl 获取网站时,它并没有按预期工作:

curl --cacert certificate.pem https://localhost:80

我从 nginx 收到以下错误页面:

<html>
<head><title>400 No required SSL certificate was sent</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<center>No required SSL certificate was sent</center>
<hr><center>nginx/1.14.0 (Ubuntu)</center>
</body>
</html>

我做错了什么吗?谢谢

答案1

您正在指示 Nginx 使用以下命令请求客户端证书:

ssl_verify_client on;
ssl_verify_depth 2;

但是,您没有告诉curl您使用证书(--cacert仅告诉您curl用于验证服务器证书的 CA 证书位于何处)。因此,Nginx 正确地告诉您,您尚未发送客户端证书。

如果您只希望服务器发送 TLS 证书以使 HTTPS 正常工作,那么只需注释掉或删除上面两行。

如果您确实希望客户端发送证书,则应创建 CA 并使用它来颁发客户端证书。将客户端证书和私钥提供给curl(分别使用--cert--key),并在 Nginx 中配置 CA 证书ssl_client_certificate(不使用私钥!!)。

问题/答案展示如何使用 OpenSSL 创建客户端证书。

相关内容