所以我一直遵循在Apache2 w / mod_ssl中设置客户端证书authentication的说明。 这仅仅是为了testing针对CAA的应用程序,而不是用于任何types的生产用途。
到目前为止,我已经遵循http://www.impetus.us/~rjmooney/projects/misc/clientcertauth.html获取有关生成我的CA,服务器和客户端encryption信息的build议。 我把它们全部放到/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:// localhost时 ,出现以下错误
Chrome: Error 107 (net::ERR_SSL_PROTOCOL_ERROR): SSL protocol error.
Apache: Certificate Verification: Error (18): self signed certificate
如果我不得不猜测,我的一个指令是不是设置正确加载和validationp12 w /我自己创build的CA. 但我不能为了我的生活弄清楚它是什么。 在这里谁能有更多的经验谁能指出我在正确的方向?
首先,我build议避免同时使用SSLCACertificatePath和SSLCACertificateFile 。 SSLCACertificatePath用于指向一个包含多个文件的目录,一个用于您信任的每个CA证书。 SSLCACertificateFile用于指向单个文件,即您信任的所有CA证书的串联。 将SSLCACertificatePath指向一个也包含私钥的目录是没有意义的(尽pipe我不确定这会导致问题)。
重要的是,您所使用的客户端证书是由其中一个CA证书颁发的(指向由您使用的SSLCACertificatePath或SSLCACertificateFile ):客户端证书的颁发者DN必须是一个主题DN您在Apache Httpd中以这种方式configuration的CA证书(另外,它必须真正由该CA颁发,因此您的客户端证书的签名必须可以由CA证书的公钥validation,但是我假设您已经创build你的CA,并正确地签发证书:你可能想检查一下,以防万一)。
您可以使用以下格式检查PEM格式(通常是.pem或.crt )的证书(CA或不是CA)的内容:
openssl x509 -text -noout -in filename.pem
(这应该显示足够的证书信息。)
编辑:
以防万一您的证书可能存在问题,您可以尝试这些testing证书:
(所有的密码都是testtest 。)
您可以将testclient.p12导入您的浏览器。 cacert.pem是PEM格式的CA证书, localhost-cert.pem是localhost-cert.pem的服务器证书(所以它的目的是从机器本身进行testing)。 localhost-key.pem是服务器证书的私钥。 您可以使用以下方式解除保护:
openssl rsa -in localhost-key.pem -out localhost-key-unprotected.pem
您可能需要暂时在浏览器中信任cacert.pem ,但是在testing后将其删除(因为显然, testtest不是很秘密,所以任何人都可以使用这个CA)。
我有同样的问题(在Nginx下)。 解决办法是使我的客户端通用名称不同于服务器的证书通用名称。 本来我以为我的证书CN必须匹配服务器证书的FQDN ..
EX:
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 (eg 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]
我也有这个问题与nginx,类似于@rynop解决scheme结果是获得命名的权利。
在我的情况下,确保客户端CA和客户端证书的组织/通用名称不同,得到了解决。
如果名称相同,nginx / openssl会看到一个自签名证书,而不是由CA签名的证书。
以下指南有助于使用nginx设置客户端证书authentication,并指导您使用CA和cert使用不同的名称:
https://gist.github.com/mtigas/952344#convert-client-key-to-combined-pem