我正在尝试使用自签名证书在 Apache 上设置 HTTPS。但是页面并没有显示,而是出现了一堆奇怪的错误。每个浏览器的错误都不一样!
从 Chrome 中:
错误 2(net::ERR_FAILED):未知错误。
通过 Firefox:
SSL 收到的记录超出了最大允许长度。(错误代码:ssl_error_rx_record_too_long)
我按照http://slacksite.com/apache/certificate.php以及大约 4 个其他指南。它们都差不多,但都给出了相同的结果。所以我一定是做错了什么。
简而言之,这就是我所做的:
生成服务器密钥:
openssl genrsa -des3 -out server.key 1024
生成 CSR:
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>
答案1
该问题更可能出在您的 vhost 配置上。
针对 HTTP 资源启动 HTTPS 会话可能会产生此ssl_error_rx_record_too_long
错误。例如 -https://host.name:80
。
答案2
我过去使用的方法与您详细介绍的方法略有不同。以下说明最初详述于我在寻找如何设置 SSL 时发现的这篇文章中:通过 Active Directory (SSPI) 逐步安装 Apache/SSL 上的 Subversion
总结一下:
在apache\bin下创建openssl.conf并设置其内容如下:
[ v3_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:始终,发行人:始终 基本约束 = CA:true [ 要求 ] 默认比特数 = 1024 default_keyfile = 服务器.key 专有名称 = 请求专有名称 属性 = req_attributes x509_extensions = v3_ca string_mask = nombstr [ 请求可分辨名称 ] commonName = 通用名称 commonName_default = 我的服务器名称 [ 请求属性 ]
打开命令提示符,导航到 apache\bin 并运行以下命令:
openssl req -config openssl.conf -new -out server.csr
出现提示时输入密码,然后再次输入以进行验证。
然后系统将提示您输入通用名称 [我的服务器名称]。输入机器的名称
接下来使用以下命令从私钥中删除密码(注意这可能会给出无法找到 openssl.conf 的警告 - 可以忽略):
openssl rsa -in server.key -out server.key
出现提示时输入之前使用的密码
接下来使用以下命令创建自签名证书
`openssl x509 -in 服务器.csr -out 服务器.cert -req -signkey 服务器.key -days 365
从 apache\bin 文件夹中删除 server.csr 文件。
将 server.key 和 server.cert 文件从 apache\bin 文件夹复制到 apache\conf 文件夹。
在文本编辑器中打开 apache\conf\httpd.conf。
将监听端口指令(可能是 Listen 80 或 Listen 8080)更改为端口 443:
Listen 443
更改 ServerName 指令以包含端口 443(注意,这可能被注释掉,因此请删除行首的 # 并将服务器替换为您的服务器名称):
ServerName server:443
取消注释或添加 mod_ssl 的加载模块指令(该指令应该存在并被注释掉,因此删除行首的 # ):
LoadModule ssl_module modules/mod_ssl.so
为 mod_ssl 添加一个 IfModule 部分(这不应该已经存在,但如果存在则覆盖它):
<IfModule mod_ssl.c> SSLEngine 开启 SSLRandomSeed 启动内置 SSLRandomSeed 连接内置 SSLPassPhraseDialog 内置 SSLSessionCache dbm:logs/ssl_scache SSLSessionCacheTimeout 300 SSLMutex 默认 SSL证书文件conf\server.cert SSLCertificateKey文件 conf\server.key </IfModule>
重新启动 Apache 服务。通过尝试(并失败)通过 http 连接以及尝试(并成功)通过 https 连接来测试配置。
答案3
好吧,由于用户 Jure1873 还没有写出答案,所以我不能给予他应有的荣誉。这是他的解决方案:
如果
<VirtualHost mail.craimer.org:443>
用替换会怎样<virtualhost *:443>
?
这就是解决方案。事实证明(截至本文撰写时)httpd
无法支持 HTTPS 的多个虚拟主机,因此任何到 443 的连接都必须定向到单个主机。所以我猜httpd
只是默默地拒绝了尝试运行 HTTPS 虚拟主机的配置。
哦,不要因为这个“缺失的功能”而抱怨 Apache。这不是他们的错!HTTPS 协议不支持虚拟主机。
无聊的解释:
您会看到,当您连接到端口 443 并启动 HTTPS 会话时,所发生的只是安全协商。HTTPS 只是在两点之间建立安全隧道,与 HTTP 无关。只有隧道建立后,数据才会流过。该数据是 HTTP 流。
这意味着该Host:
指令(属于 HTTP 的一部分,而非 HTTPS)仅在安全隧道构建后才会发送。它是标Host:
头,用于告诉 HTTP 服务器正在访问哪个虚拟主机。但在 HTTPS 中,我们获取此信息太晚了:它到达时我们已不得不选择加密密钥。
底线:HTTPS无法根据以下情况选择加密密钥HTTP主机名。
答案4
以下是发生此错误的其他一种情况:
VirtualHost *:80
在中定义sites-enabled/000-default.conf
。然后定义VirtualHost *:443
在httpd.conf
如果您将配置完全移至 或httpd.conf
,则000-default.conf
它可以正常工作。否则,您会在 FireFox 上收到此错误:
SSL received a record that exceeded the maximum permissible length. (Error code: ssl_error_rx_record_too_long)
在 Chrome 上出现以下错误:
This site can’t provide a secure connection
... sent an invalid response.