我之前从未在 Linux 上设置过 SSL,但大致了解它的工作原理。以下是服务器规格,如果有帮助的话:
服务器:CentOS Linux 6 工作站:Windows 7
因此,我有 4 个域,它们都共享一个 Magento 安装和 IP 地址。假设我的一个域是“mywebsite1.com”,我现在正在尝试仅为这个域启用 SSL,但遇到了错误。我做错了什么?这是我的工作流程:
我从 GoDaddy 购买了 SSL,然后使用他们提供的命令生成了 csr 和密钥:
openssl req -new -newkey rsa:2048 -nodes -keyout mywebsite1.key -out mywebsite1.csr
我将两个文件复制到 /etc/pki/tls/private
我打开 mywebsite1.crs,然后将代码复制并粘贴到 Godaddy。
我生成 crt 文件并从 GoDaddy 下载,上传到我的服务器,然后将它们移动到 /etc/pki/tls/certs
a. 第一次尝试,我打开 /etc/httpd/conf.d/ssl.conf 并更新 默认VirtualHost 块的 SSLCertificate File、KeyFile 和 ChainFile 值指向正确的位置。
b. 第二次尝试,如下 http://dev.antoinesolutions.com/apache-server/mod_ssl我修改了 ssl.conf 并添加了该指令:
NameVirtualHost *:443
然后我把整个默认VirtualHost 块(相当长)。
最后一次尝试,我在修改后的 ssl.conf 中添加了以下内容
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/mywebsite1.com.crt
SSLCertificateKeyFile /etc/pki/tls/private/mywebsite1.key
SSLCertificateChainFile /etc/pki/tls/certs/gd_bundle.crt
DocumentRoot /var/www/html
ServerName mywebsite1.com
</VirtualHost>
6..我重新启动Apache
7..然后我去https://mywebsite1.com却发现一些错误导致我无法在各种浏览器中查看该网站。
浏览器:Firefox
SSL received a record with an unknown content type.
(Error code: ssl_error_rx_unknown_record_type)
浏览器:Chrome
Error 107 (net::ERR_SSL_PROTOCOL_ERROR): SSL protocol error.
浏览器:IE...带我进入 Google...
httpd.conf:
NameVirtualHost 12.34.567.89
<VirtualHost 12.34.567.89>
DocumentRoot /var/www/html
ServerName website1.com
</VirtualHost>
<VirtualHost 12.34.567.89>
DocumentRoot /var/www/html
ServerName website2.com
</VirtualHost>
<VirtualHost 12.34.567.89>
DocumentRoot /var/www/html
ServerName website3.com
</VirtualHost>
<VirtualHost 12.34.567.90:80>
DocumentRoot /var/www/html
ServerName website4.com
</VirtualHost>
笔记:
- 我读到过您必须使用名为“a2enmod ssl”的命令启用 ssl,但我的服务器上不存在该命令。
- /etc/httpd/logs 中没有 ssl 错误日志。
- 根据 Godaddy 的规定,我被要求将密钥命名为“mywebsite1”,但不带扩展名。但他们却给了我一个带扩展名的 crt,这很奇怪。
- 这只是开发阶段,一旦我们启动生产服务器,就需要使用新的 SSL 和不同的域快速重现此更改。
我已尝试所有步骤 3 次(参见 5a-5c),但仍然无法使 SSL 在我的 1 个域中工作。我该如何使 SSL 工作?
更新:apachectl -S
12.34.567.90:80 mywebsite4.com (/etc/httpd/conf/httpd.conf:1021)
12.34.567.89:* is a NameVirtualHost
default server mywebsite3.com (/etc/httpd/conf/httpd.conf:1016)
port * namevhost mywebsite3.com (/etc/httpd/conf/httpd.conf:1016)
port * namevhost mywebsite1.com (/etc/httpd/conf/httpd.conf:1026)
port * namevhost mywebsite2.com (/etc/httpd/conf/httpd.conf:1031)
port * namevhost mywebsite5.com (/etc/httpd/conf/httpd.conf:1036)
wildcard NameVirtualHosts and _default_ servers:
*:443 is a NameVirtualHost
default server mywebsite1.com (/etc/httpd/conf.d/ssl.conf:77)
port 443 namevhost mywebsite1.com (/etc/httpd/conf.d/ssl.conf:77)
Syntax OK
更新:它工作了..但是..
我设法通过将 vhost 更改为指向 mywebsite1 而不是 *:443 来运行 SSL
<VirtualHost mywebsite1.com>
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/mywebsite1.com.crt
SSLCertificateKeyFile /etc/pki/tls/private/mywebsite1.key
#SSLCertificateChainFile /etc/pki/tls/certs/gd_bundle.crt
DocumentRoot /var/www/html
ServerName mywebsite1.com
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
</VirtualHost>
这会拉起 SSL,但是……HTTP 协议会返回“错误请求”
此更改似乎影响了网站的非 SSL 查看。我无法指定端口,因为重新启动 apache 会给我一个错误,即端口和非端口不能混合。
更新
根据 Michael Hampton 的建议进行了修复。谢谢大家。
答案1
你有一堆<VirtualHost>
条目不已定义端口号。因此,如您的apachectl -S
输出所示,该定义将应用于所有监听端口。为每个<VirtualHost>
端口定义一个端口号。
答案2
如果您使用默认的 /etc/httpd/conf.d/ssl.conf,您应该有日志:
错误日志/ssl_error_log TransferLog 日志/ssl_access_log LogLevel 警告
尝试摆脱:
SSL证书链文件 /etc/pki/tls/certs/gd_bundle.crt
并且还要确保您的证书没有因复制粘贴而缺失的行。
如果遇到问题,请先尝试使用自签名证书进行测试: http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html#selfcert
这应该有助于解决其他问题:
http://www.instantssl.com/ssl-certificate-support/server_faq/ssl-server-certificate-apache.html