无法让 httpd 使用正确的 SSL

无法让 httpd 使用正确的 SSL

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

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

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

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

我的 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!?

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

我的问题是,如何让它使用正确的?我遗漏了什么?

答案1

SSLCACertificate文件 /var/cosign/certs/CA/publickey.pem

除非该 PEM 文件实际上包含客户您希望授予访问权限的证书,这是不正确的;要向 Apache 提供证书链,请改用SSLCertificateChainFile

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

要验证他们给您的证书,请运行:

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

除了证书问题之外,您还缺少SSLRequireSSLvhost 中的指令;没有它,apache 将不会检查安全连接。

您也不应该使用_default_作为虚拟主机,而且您缺少ServerName
使用 *:443 或 IP:443 作为虚拟主机。

每个 vhost 都必须具有有效的 ServerName 设置,此外,SSL vhost 必须具有与证书的 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>

研究一下文档。

答案2

跑步

# 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)

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

相关内容