Har*_*ikk 2 ssl nginx ssl-certificate tls certificate-authority
在使用中间 CA(自创建)时,我在 nginx 的客户端身份验证方面遇到了一些困难。
尽管相同的证书包(单个 .pem 文件中的中间 + 根证书)适用于 IMAP(dovecot)和 SMTP(后缀)中的客户端身份验证,但我似乎无法让它与 nginx 一起使用。相反,我收到以下错误:
[info] 23383#23383: *14583139 client SSL certificate verify error: (27:certificate not trusted) while reading client request headers, client: 82.39.81.156, server: <hostname>, request: "GET /mailboxes HTTP/1.1", host: "<hostname>"
Run Code Online (Sandbox Code Playgroud)
据我了解,来自 openssl 的错误类型 27 是X509_V_ERR_CERT_UNTRUSTED
,或者证书出于特定目的不受信任的某种问题,但是我无法进一步详细说明。
个人证书和捆绑证书似乎都可以正确验证openssl verify
(我可以根据中间证书或捆绑证书验证客户端证书,并且中间证书针对根证书进行验证,即 - 在我能想到的每个组合中都是有效的)。
我的根和中间 CA 应该使用正确的扩展名设置以验证我的客户端证书,这是我的自定义openssl.conf
文件的相关示例:
[ v3_ca ]
# Extensions for a typical CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
[ v3_intermediate_ca ]
# Extensions for a typical intermediate CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:0
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
Run Code Online (Sandbox Code Playgroud)
同时,我发布的客户端证书配置为同时用于客户端身份验证和电子邮件加密/签名,如下所示:
[ user_cert ]
# Extensions for client certificates (`man x509v3_config`).
basicConstraints = CA:FALSE
nsCertType = client, email
nsComment = "OpenSSL Generated Client Certificate"
subjectAltName = email:move
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = critical, clientAuth, emailProtection
Run Code Online (Sandbox Code Playgroud)
(事实上,如果它们设置不正确,那么 OS X 的 Safari 和 Mail 根本不会让我发送它们,因为它们往往非常严格)。
许多类似的问题建议将ssl_verify_depth
值设置为 2(以验证中间证书和根证书),但这似乎没有帮助。
小智 5
我有相同的设置,并且一直在尝试诊断这个确切的问题。证书在 apache 实例上运行良好,但 nginx 是一个问题。这是我想出的解决方案。
指向您ssl_client_certificate
的根证书。不是你的中级。然后还要确保 nginx 验证到 2 的深度。我尝试将证书链文件作为客户端证书的参数,但它仍然不起作用。我不明白为什么它必须是根,而不是签署证书的中间人。但这有效。
为了完整起见,我的 nginx 配置的相关部分如下所示:
server {
listen 8443 ssl;
server_name www.example.com;
ssl on;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.key;
ssl_client_certificate /path/to/root.ca.cert;
ssl_verify_client on;
ssl_verify_depth 2;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers <snipped-for-length>;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7379 次 |
最近记录: |