我正在尝试使用自签名证书在Apache上设置HTTPS。 但是,而不是显示页面,我得到了一堆奇怪的错误。 从每个浏览器的一个不同的错误!
从Chrome浏览器:
错误2(net :: ERR_FAILED):未知错误。
从Firefox:
SSL收到的logging超出了允许的最大长度。 (错误代码: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
[在生成请求时,我小心地input我的实际主机名作为“通用名称(例如,您的名字或您的服务器的主机名)”]
从密钥中删除密码:
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
configurationApache以指向这些文件,并使用这些证书。
有任何想法吗?
更新:这是我的虚拟主机configuration:
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>
这个问题更可能在于您的虚拟主机configuration。
ssl_error_rx_record_too_long错误可以通过针对HTTP资源启动HTTPS会话来产生。 如 – https://host.name:80 。
我以前用过的方法与你所说的略有不同。 下面的说明最初是在这篇文章中详细介绍,我发现,而如何设置ssl: 一步一步安装Subversion通过Apache / SSL通过Active Directoryvalidation(SSPI)
总结:
在apache \ bin下创buildopenssl.conf并设置其内容如下:
[v3_ca] subjectKeyIdentifier =散列 authorityKeyIdentifier = keyid:always,issuer:always basicConstraints = CA:true [req] default_bits = 1024 default_keyfile = server.key distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca string_mask = nombstr [req_distinguished_name] commonName =通用名称 commonName_default =我的服务器名称 [req_attributes]
打开命令提示符,导航到apache \ bin并运行以下命令:
openssl req -config openssl.conf -new -out server.csr
提示时input密码,然后再次validation。
您将被提示input一个通用名称[我的服务器名称]。 input机器的名称
接下来使用以下命令从私钥中删除密码(注意这可能会导致无法findopenssl.conf的警告 – 这可以忽略):
openssl rsa -in server.key -out server.key
提示时input先前使用的密码
接下来使用以下命令创build自签名证书
`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。
将侦听端口指令(可能是Listen 80或Listen 8080)更改为端口443:
Listen 443
更改ServerName指令以包含端口443(注意这可能会被注释掉,所以如果是这样,请删除该行的开始处的#并用服务器名称replace服务器):
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默认
SSLCertificateFile conf \ server.cert
SSLCertificateKeyFile conf \ server.key
</ IfModule>configuration
重新启动Apache服务。 通过尝试(和失败)通过http连接testingconfiguration,并试图(和成功)通过https连接。
从VirtualHostconfiguration中删除标签。 例如。 <IfModule mod_ssl.c > </IfModule> – 删除这些行
那么,因为用户Jure1873还没有写出答案,我不能给他信用值得。 这是他的解决scheme:
如果用
<virtualhost *:443>replace<VirtualHost mail.craimer.org:443><virtualhost *:443>怎样?
这就是解决scheme。 事实certificate,(截至撰写本文) httpd不能支持HTTPS的多个虚拟主机,因此任何到443的连接都必须指向单个主机。 所以我猜测httpd只是默默地拒绝尝试运行HTTPS虚拟主机的configuration。
哦,不要针对这个“缺less的function”的阿帕奇。 这不是他们的错! HTTPS协议不支持虚拟主机。
你看,当你连接到端口443,并开始一个HTTPS会话,所有这一切都是安全协商。 HTTPS就是要在两点之间build立一个安全的隧道,而与HTTP无关。 只有隧道build立后,数据才会stream通。 该数据是HTTPstream。
这意味着Host:指令(它是HTTP的一部分,而不是HTTPS)只能在安全隧道构build完成后才能发送。 它是Host:头告诉HTTP服务器正在访问哪个虚拟主机。 但是在HTTPS中,我们得到这些信息的时间太晚了:我们必须selectencryption密钥后才能得到这个信息。
底线: HTTPS不能根据HTTP主机名selectencryption密钥。
以下是发生此错误的另一种情况:
在sites-enabled/000-default.conf定义VirtualHost *:80 。 然后定义VirtualHost *:443
在httpd.conf
如果将configuration完全移到httpd.conf或000-default.conf它就可以工作。 否则你在FireFox上得到这个错误:
SSL received a record that exceeded the maximum permissible length. (Error code: ssl_error_rx_record_too_long)
和铬上的这个错误:
This site can't provide a secure connection ... sent an invalid response.
Scraimer,接受的答案是错误的,否则你为什么认为SSLCertificateFile指令可以在虚拟主机范围内? certificate: http : //httpd.apache.org/docs/current/mod/mod_ssl.html#sslcertificatefile
使用虚拟主机,您仍然可以使用不同的基于名称的虚拟主机的证书文件。
我有同样的麻烦,解决的办法是把真正的IP而不是VirtualHost指令*,如下所示:
NameVirtualHost *:80 NameVirtualHost *:443 <VirtualHost 127.0.0.1:443> ServerName affx.meg ... </VirtualHost>
PS Hovewer我不知道为什么它的工作。 我只是把这个configuration作为一个例子从真实的现场服务器,并重用它到我的设置,它的工作。