我正在尝试使用自签名证书在 Apache 上设置 HTTPS。但是我没有显示页面,而是收到了一堆奇怪的错误。每个浏览器都有不同的错误!
从铬:
错误 2 (net::ERR_FAILED):未知错误。
从火狐:
SSL 收到超过最大允许长度的记录。(错误代码:ssl_error_rx_record_too_long)
我按照http://slacksite.com/apache/certificate.php以及其他大约 4 个指南中详述的步骤进行操作。它们都差不多,但都给出相同的结果。所以我一定做错了什么。
简而言之,这就是我所做的:
生成服务器密钥:
openssl genrsa -des3 -out server.key 1024
生成企业社会责任:
openssl req -new -key server.key -out server.csr
[在生成请求时,我小心地将我的实际主机名输入为“通用名称(例如,您的姓名或服务器的主机名)”]
从密钥中删除密码:
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
自签名证书:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
将 apache 配置为指向这些文件,并使用这些证书。
有任何想法吗?
更新:这是我的虚拟主机配置:
LoadModule ssl_module modules/mod_ssl.so
Listen 443
# Some MIME-types for downloading Certificates and CRLs
#
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 300
SSLMutex default
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
## Virtual host to redirect to HTTPS
<VirtualHost *:80>
ServerName mail.craimer.org
Redirect permanent / https://mail.craimer.org:443
</VirtualHost>
##
## SSL Virtual Host Context
##
<VirtualHost mail.craimer.org:443>
ServerName mail.craimer.org
DocumentRoot "/usr/share/roundcubemail/trunk/roundcubemail/"
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /etc/httpd/conf/ssl/server.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl/server.key
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
# Deal with broken MSIE
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
问题更可能在于您的虚拟主机配置。
通过
ssl_error_rx_record_too_long
针对 HTTP 资源启动 HTTPS 会话可能会产生错误。比如——https://host.name:80
。我过去使用的方法与您详述的方法略有不同。下面的说明最初是我在查看如何设置 ssl 时发现的这篇文章中的详细说明:通过 Active Directory (SSPI) 在 Apache/SSL 上逐步安装 Subversion
总结一下:
在 apache\bin 下创建 openssl.conf 并将其内容设置如下:
打开命令提示符,导航到 apache\bin 并运行以下命令:
openssl req -config openssl.conf -new -out server.csr
出现提示时输入密码短语,然后再次验证。
然后将提示您输入通用名称 [我的服务器名称]。输入机器名称
接下来使用以下命令从私钥中删除密码(注意这可能会给出一个关于无法找到 openssl.conf 的警告 - 这可以忽略):
openssl rsa -in server.key -out server.key
出现提示时输入以前使用的密码
接下来使用以下命令创建自签名证书
`openssl x509 -in server.csr -out server.cert -req -signkey server.key -days 365
从 apache\bin 文件夹中删除 server.csr 文件。
将 server.key 和 server.cert 文件从 apache\bin 文件夹复制到 apache\conf 文件夹。
在文本编辑器中打开 apache\conf\httpd.conf。
将监听端口指令(可能是监听 80 或监听 8080)更改为端口 443:
Listen 443
更改 ServerName 指令以包含端口 443(请注意,这可能会被注释掉,因此如果是,请删除行首的 # 并将 server 替换为您的服务器名称):
ServerName server:443
取消注释或添加 mod_ssl 的加载模块指令(这应该存在并注释,因此删除行开头的 #):
LoadModule ssl_module modules/mod_ssl.so
为 mod_ssl 添加一个 IfModule 部分(这不应该已经存在,但如果它被覆盖它):
重新启动 Apache 服务。通过尝试(并失败)通过 http 连接并尝试(并成功)通过 https 连接来测试配置。
好吧,由于用户 Jure1873 还没有写出答案,我不能给他应得的荣誉。这是他的解决方案:
这就是解决方案。事实证明(在撰写本文时)
httpd
无法支持 HTTPS 的多个虚拟主机,因此到 443 的任何连接都必须定向到单个主机。所以我猜httpd
只是默默地拒绝了尝试为 HTTPS 运行虚拟主机的配置。哦,不要因为这个“缺失的功能”而指责 apache。这不是他们的错!HTTPS 协议不支持虚拟主机。
无聊的解释:
您会看到,当您连接到端口 443 并启动 HTTPS 会话时,所发生的只是安全协商。HTTPS 就是在两点之间建立安全隧道,与 HTTP 无关。只有建立隧道后,数据才会流过。该数据是 HTTP 流。
这意味着
Host:
指令(它是 HTTP 的一部分,而不是 HTTPS)只会在构建安全隧道后发送。它是Host:
告诉 HTTP 服务器正在访问哪个虚拟主机的标头。但是在 HTTPS 中,我们获得这些信息太晚了:它是在我们必须选择加密密钥之后到达的。底线:HTTPS不能根据HTTP主机名选择加密密钥。
从 VirtualHost 配置中删除标记。例如。
<IfModule mod_ssl.c > </IfModule>
- 删除那些行这是发生此错误的另一种情况:
VirtualHost *:80
中定义sites-enabled/000-default.conf
。然后定义VirtualHost *:443
在
httpd.conf
如果您将配置完全移动到其中之一
httpd.conf
或到000-default.conf
它工作。否则,您会在 FireFox 上收到此错误:chrome上的这个错误:
Scraimer,接受的答案是错误的,否则您为什么认为 SSLCertificateFile 指令可以在虚拟主机范围内?证明:http ://httpd.apache.org/docs/current/mod/mod_ssl.html#sslcertificatefile
使用虚拟主机,您仍然可以将不同的证书文件与基于名称的虚拟主机一起使用。
我遇到了同样的麻烦,解决方案是在 VirtualHost 指令中放置真实 IP 而不是 *,如下所示:
PS Hovewer 我不知道它为什么起作用。我只是将此配置作为来自真实服务器的示例,并将其重用于我的设置并且它有效。