因此,我一直遵循有关在 Apache2 中使用 mod_ssl 设置客户端证书身份验证的说明。这仅用于针对 CAA 测试应用程序,不用于任何类型的生产用途。
到目前为止,我已经遵循了http://www.impetus.us/~rjmooney/projects/misc/clientcertauth.html
有关生成 CA、服务器和客户端加密信息的建议。我已将这三项都放入了/etc/ssl/ca/private
。我在 default_ssl 站点文件中设置了以下附加指令:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
...
SSLEngine on
SSLCertificateFile /etc/ssl/ca/private/server.crt
SSLCertificateKeyFile /etc/ssl/ca/private/server.key
SSLVerifyClient require
SSLVerifyDepth 2
SSLCACertificatePath /etc/ssl/ca/private
SSLCACertificateFile /etc/ssl/ca/private/ca.crt
<Location />
SSLRequireSSL
SSLVerifyClient require
SSLVerifyDepth 2
</Location>
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
...
</VirtualHost>
</IfModule>
我已经将 p12 文件安装到 Chrome 中,但是当我去访问https://本地主机,我收到以下错误
铬合金:Error 107 (net::ERR_SSL_PROTOCOL_ERROR): SSL protocol error.
阿帕奇:Certificate Verification: Error (18): self signed certificate
如果我不得不猜测的话,我的一个指令没有正确设置,无法使用我自己创建的 CA 加载和验证 p12。但我无论如何也想不出它是什么。这里有没有更有经验的人可以给我指明正确的方向?
答案1
首先,我建议避免同时使用和。SSLCACertificatePath
用于指向包含多个文件的目录,每个文件对应一个您信任的 CA 证书。用于指向单个文件,即您信任的所有 CA 证书的串联。指向还包含私钥的目录实际上没有任何意义(尽管我不确定这是否会引起问题)。SSLCACertificateFile
SSLCACertificatePath
SSLCACertificateFile
SSLCACertificatePath
重要的是,您使用的客户端证书是由其中一个 CA 证书颁发的(由您将使用的SSLCACertificatePath
或SSLCACertificateFile
指向):您的客户端证书的颁发者 DN 必须是您在 Apache Httpd 中以这种方式配置的其中一个 CA 证书的主题 DN(此外,它必须确实由该 CA 颁发,因此您的客户端证书的签名必须可以通过 CA 证书的公钥进行验证,但我假设您已经正确创建了 CA 并颁发了证书:您可能需要检查这一点,以防万一)。
.pem
您可以使用以下方式检查 PEM 格式(通常为或)证书的内容(无论是否为 CA).crt
:
openssl x509 -text -noout -in filename.pem
(这应该显示有关证书的足够信息。)
编辑:
如果您的证书可能存在问题,您可以尝试以下测试证书:
(所有密码均为testtest
。)
您可以将其导入testclient.p12
到浏览器中。cacert.pem
是 PEM 格式的 CA 证书,localhost-cert.pem
是的服务器证书localhost
(因此它旨在用于从机器本身进行测试)。localhost-key.pem
是服务器证书的私钥。您可以使用以下方法取消保护它:
openssl rsa -in localhost-key.pem -out localhost-key-unprotected.pem
您可能需要cacert.pem
暂时信任您的浏览器,但在测试后将其删除(因为显然testtest
这不是什么秘密,所以任何人都可以使用这个 CA)。
答案2
我遇到了同样的问题(在 Nginx 下)。解决方案是将客户端通用名称改为不同于服务器证书通用名称的其他名称。最初我以为我的证书 CN 必须与服务器证书的 FQDN 匹配。
前任:
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:Minnesota
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCo
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Ryan Pendergast
Email Address []:[email protected]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Signature ok
subject=/C=US/ST=Minnesota/O=MyCo/CN=Ryan Pendergast/[email protected]
答案3
我在使用 nginx 时也遇到了这个问题,与@rynop 类似,解决办法是正确命名。
就我而言,确保客户端 CA 和客户端证书的组织/通用名称不同即可解决此问题。
如果名称相同,nginx / openssl 会看到自签名证书,而不是由 CA 签名的证书。
以下指南有助于使用 nginx 设置客户端证书身份验证,并指导用户对 CA 和证书使用不同的名称:
https://gist.github.com/mtigas/952344#convert-client-key-to-combined-pem