无法使httpd使用正确的SSL

我有一个由我的大学颁发的签名的CA。 我使用公钥文件生成了我的CSR,如下所示:

openssl genrsa -out myservername.key 2048 (new key) openssl req -new -key myservername.key -out myservername.csr 

我给他们发了CSR,他们把我的签名.crt文件发回给我。

我为我的CA密钥和证书创build了一个目录,并将它们放在那里。

我的httpd.conf的相关部分看起来像这样:

 <VirtualHost _default_:443> SSLEngine on SSLCACertificateFile /var/cosign/certs/CA/publickey.pem SSLCertificateFile /var/cosign/certs/myserver.crt SSLCertificateKeyFile /var/cosign/certs/myserver.key DocumentRoot /var/www/html/ <Directory /var/www/html> Options -Indexes AllowOverride All </Directory> 

但是它没有使用SSL证书。 如果我这样做的话:

 openssl s_client -connect localhost:443 -showcerts 

我得到这个:

 CONNECTED(00000003) depth=0 C = --, ST = SomeState, L = SomeCity, O = SomeOrganization, OU = SomeOrganizationalUnit, CN = portcharlotte, emailAddress = root@portcharlotte verify error:num=18:self signed certificate verify return:1 depth=0 C = --, ST = SomeState, L = SomeCity, O = SomeOrganization, OU = SomeOrganizationalUnit, CN = portcharlotte, emailAddress = root@portcharlotte verify return:1 --- Certificate chain 

我的CSR包含适当的细节,而不是这个“SomeState”,“SomeCity”废话,我猜是默认的。

openssl模块被安装并加载。

我在日志中遇到的唯一错误是:

 [Fri Jan 25 13:27:40 2013] [warn] RSA server certificate is a CA certificate (BasicConstraints: CA == TRUE !?) [Fri Jan 25 13:27:40 2013] [warn] RSA server certificate CommonName (CN) `portcharlotte' does NOT match server name!? 

我猜这个不匹配是因为它使用了错误的证书。

我的问题是,我如何使用正确的? 我错过了什么?

SSLCACertificateFile /var/cosign/certs/CA/publickey.pem

除非该PEM文件实际上包含您希望授予访问权限的客户端证书的CA证书,否则这是不正确的; 为apache提供一个证书链,而不是使用SSLCertificateChainFile

Apache必须具有用于签署/生成端点证书的实际证书和任何中间证书,直到并包括浏览器所信任的根证书。

要validation他们给你的证书,运行:

 openssl verify -CApath /path/to/CA/certs -purpose sslserver -verbose /your/certificate 

除了证书问题之外,您在虚拟主机中缺lessSSLRequireSSL指令。 没有它,Apache不会检查一个安全的连接。

你也不应该使用_default_作为虚拟主机,而你缺less一个ServerName
使用*:443或IP:443作为虚拟主机。

每个虚拟主机必须设置一个有效的ServerName,另外,SSL虚拟主机必须具有对应于证书的CN的ServerName。

例如:

 <VirtualHost 1.2.3.4:443> ServerName your.certificates.common.name ServerAlias any.subject.alternate.names DocumentRoot /your/protected/content SSLEngine On SSLCertificateChainFile /path/to/your/issuers/CA/cert/bundle SSLCertificateFile /path/to/your/certificate.crt SSLCertificateKeyfile /path/to/your/private.key -OR- SSLCertificateFile /path/to/your/combined.cert-and-keyfile SSLRequireSSL </VirtualHost> 

研究一下文档。

 # Debian/Ubuntu apache2ctl -S # RHEL/CentOS httpd -S 

它应该产生这样的东西:

 *:443 is a NameVirtualHost default server hostname (/etc/apache2/sites-enabled/000-default:1) port 443 namevhost hostname (/etc/apache2/sites-enabled/000-default:1) 

validation你是否运行了openssl命令,使用正确的主机名来访问你的虚拟主机,我假设你有多个虚拟主机用于端口443,在你的发行版的默认设置中定义的优先。