我有一个由我的大学颁发的签名的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,在你的发行版的默认设置中定义的优先。