Apache SSL 配置错误(SSL 连接错误)

48
我正在尝试在我的服务器上配置Apache以使用ssl,但每次访问我的站点时,我都会在浏览器中收到以下消息:
SSL连接错误。无法与服务器建立安全连接。这可能是服务器的问题,或者它可能需要您没有的客户端身份验证证书。错误107(net :: ERR_SSL_PROTOCOL_ERROR):SSL协议错误。
上面的错误消息似乎是Google Chrome本地化的。但是,即使消息不同,该站点的ssl在任何浏览器上都无法正常工作。
只是一些背景情况:我正在使用Ubuntu 10.04桌面版。
我通过安装zend服务器(它自动安装了apache)安装了apache。然后我安装了openssl。网站上的非https页面运行良好。 我尝试从多个证书站点获取试用证书,但什么都不起作用(相同的错误)。 我以前将我的站点托管在另一个可以正常工作的ssl服务器上。我还尝试使用来自该服务器的密钥和证书文件,但我收到了相同的错误。
域名和IP仍然相同。我的SSLCertificateFile和SSLCertificateKeyFile指向正确的目录和文件。
我也没有启用SSLVerifyClient。
如果有人有任何建议,将不胜感激。

5
我刚刚看到了这篇文章。虽然已经过了一段时间,但如果有人通过谷歌偶然发现这篇文章,我想我还是会发布解决方法的。证书安装不正确。通常情况下,我会尝试自己修复问题以便更好地理解,但由于我有期限要赶,所以我不得不请oDesk上的专业人员来解决这个问题。 - user396404
由于您忘记了确切的步骤,我列出了我必须执行的所有操作,包括检查证书和密钥的完整性。点赞的问题! :) - tony gil
15个回答

50

我和@User39604有相同的问题,不得不遵循各种建议。 由于他不记得具体的路径,让我列出我的路径:

  1. 使用<?php echo phpinfo();?>检查是否启用了SSL。

  2. 如果需要:

    A. 在apache上启用ssl sudo a2enmod ssl

    B. 安装openssl sudo apt-get install openssl

    C. 检查端口443是否打开 sudo netstat -lp

    D. 如果需要,请更改/etc/apache2/ports.conf,这是有效的。

    NameVirtualHost *:80
    Listen 80
    
    <IfModule mod_ssl.c>
        # If you add NameVirtualHost *:443 here, you will also have to change
        # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
        # to <VirtualHost *:443>
        # Server Name Indication for SSL named virtual hosts is currently not
        # supported by MSIE on Windows XP.
        NameVirtualHost *:443
        Listen 443
    </IfModule>
    
    <IfModule mod_gnutls.c>
        Listen 443
    </IfModule>
    
  3. 通过以下两种方式之一获取密钥和证书:

    A. 向证书颁发机构(Comodo,GoDaddy,Verisign)支付费用获得一对密钥和证书

    B. 生成您自己的密钥和证书* - 仅限测试目的

  4. 更改配置文件(在ubuntu12中的/etc/apache2/httpd.conf文件中,默认为空文件),以包括一个适当的<VirtualHost> (替换MYSITE.COM,以及密钥和证书路径/名称来指向您自己的证书和密钥)。

  5. <VirtualHost _default_:443> 
    ServerName MYSITE.COM:443
    SSLEngine on
    SSLCertificateKeyFile /etc/apache2/ssl/MYSITE.COM.key
    SSLCertificateFile /etc/apache2/ssl/MYSITE.COM.cert
    ServerAdmin MYWEBGUY@localhost
    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
    
    
    ErrorLog ${APACHE_LOG_DIR}/errorSSL.log
    
    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn
    
    CustomLog ${APACHE_LOG_DIR}/accessSSL.log combined
    
    </VirtualHost>
    

虽然许多其他的VirtualHost配置文件可以在/etc/apache2/sites-enabled//etc/apache2/sites-available/中找到,但是/etc/apache2/httpd.conf对于解决所有问题至关重要。

更多信息请参见:

http://wiki.vpslink.com/Enable_SSL_on_Apache2

http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html#selfcert

*生成您自己的证书(自签名)将导致浏览器无法识别用户授权的证书。 因此,浏览器会发出警告并且用户必须在打开页面之前“了解风险”十几次。 因此,这仅适用于测试目的。 话虽如此,以下是HOW-TO:

  1. 进入apache文件夹(在ubuntu12中为/etc/apache2/
  2. 创建一个像ssl这样的文件夹(或任何适合您的名称,名称不是系统要求)
  3. 进入所选目录/etc/apache2/ssl
  4. 运行sudo openssl req -new -x509 -nodes -out MYSITE.COM.crt -keyout MYSITE.COM.key
  5. <VirtualHost>标记中使用MYSITE.COM.crtMYSITE.COM.key

名称格式不受严格的系统要求限制,必须与文件名相同 :) - 如212-MYSITE.COM.crtjune2014-Godaddy-MYSITE.COM.crt之类的名称都可以。


2
对我来说,缺少 '<Directory/>' 设置是问题所在。 - Karl
1
您不一定需要为证书付费。StartSSL 提供免费证书并且被广泛认可。 - Pete
1
我知道这是一个旧答案,但我今天刚发现它并解决了我的问题。需要注意的是:httpd.conf 文件的结束标签应该是 </VirtualHost> 而不是 </Directory>。我编辑了原始答案,但我不知道它是否会被接受,因为已经有一年没有活动了。 - Andrew Quebe
8
我做了这一切,但没有任何成功...幸运的是,实际上使用sudo a2ensite default-ssl.conf命令来启用该网站是一个正确的解决方案...唉。 - Ross The Boss
1
对我来说,在第三步之前,这个命令是有效的:sudo a2ensite default-ssl.conf - questionasker
显示剩余2条评论

24

我在Chrome中遇到了相同的错误(而在Firefox、IE中则是不同的错误)。 在error.log中,我也看到了[error] [client cli.ent.ip.add] Invalid method in request \x16\x03。 根据这个网站的指示,我将我的配置从以下内容进行了更改:

<VirtualHost subdomain.domain.com:443>

   ServerAdmin admin@domain.com
   ServerName subdomain.domain.com

   SSLEngine On
   SSLCertificateFile conf/ssl/ssl.crt
   SSLCertificateKeyFile conf/ssl/ssl.key
</VirtualHost>

TO:

->

收件人:

<VirtualHost _default_:443>

   ServerAdmin admin@domain.com
   ServerName subdomain.domain.com

   SSLEngine On
   SSLCertificateFile conf/ssl/ssl.crt
   SSLCertificateKeyFile conf/ssl/ssl.key
</VirtualHost>

现在它运行良好 :)


我也遇到了 *:433 的同样问题。将其更改为 __default__:433 可以在 Chrome 中解决该问题,而在此之前则是间歇性的。 - Steve Mayne
2
请明确更改哪些文件导致成功,因为您可以编辑 httpd.conf 以及 sites-enabled/000-defaultsites-available/default-sslsites-available/yoursite.com。还必须检查服务器上是否正在运行 SSL。 - tony gil
以前不知道“_default_”代表什么,经过今天无法推送443内容的所有麻烦之后,现在终于明白了。 - user591272

9

正确启用SSL的步骤。

sudo a2enmod ssl  
sudo apt-get install openssl

在SSL配置文件(default-ssl.conf),该文件可能位于 /etc/apache2/sites-available 目录下,配置SSL证书的路径。我已将证书存储在 /etc/apache2/ssl/ 目录下。

SSLEngine On
SSLCertificateFile /etc/apache2/ssl/certificate.crt
SSLCertificateChainFile /etc/apache2/ssl/ca_bundle.crt
SSLCertificateKeyFile /etc/apache2/ssl/private.key

启用SSL配置文件

sudo a2ensite default-ssl.conf

SSLCertificateChainFile已被弃用。您应该将中间CA证书放在与您的SSL证书相同的文件中。 - undefined

7
这种情况的一个常见原因是:有时客户在运行Skype时,可能没有意识到它正在使用443端口。当他们尝试启动Tomcat或Apache时,它看起来已经启动了,但无法绑定443端口。这就是用户在浏览器中看到的确切消息。解决方法是停止占用443端口的进程,重新启动web服务器以便绑定443端口。
客户可以在启动web服务器后重新启动Skype,Skype将检测到443端口已被占用,并选择使用其他端口。

6
#Make sure that you specify the port for both http and https ie.
NameVirtualHost:80
NameVirtualHost:443
#and 
<VirtualHost *:80>
<VirtualHost *:443>

#mixing * and *:443 does not work it has to be *:80 and *:443

你能提供一些解释吗? - Austin Henley
1
通配符“*”匹配所有域和所有端口 - 因此,如果您想为SSL添加特定的虚拟主机,则不能简单地使用<VirtualHost*>(这是完全有效的,并且将匹配所有请求) - 您必须通过指定端口号来区分两个通配符条目。即。 :80用于HTTP,:443用于HTTPS。 - Jeremy
这是一个需要注意的重要问题。我在我的回答中列出了其他几个问题。 - tony gil

2
我遇到了这个问题,解决方案有点傻。我正在使用Cloudflare作为我的网站代理。为了能够通过SSH登录,我在我的/etc/hosts文件中添加了一个条目,这样我就不需要记住我的服务器IP地址了。
xxx.xx.xx.xxx  example.com

当我在浏览器中访问 https://www.example.com 时,我使用的是Cloudflare代理,而当我访问https://example.com 时,我直接连接到服务器。由于Cloudflare设置不需要您添加中间证书,因此当我访问https://example.com 时,在浏览器中会看到安全异常,但https://www.example.com 可以正常工作。

解决方案:从我的笔记本电脑的/etc/hosts文件中删除条目。

如果这不是您的问题,建议使用在线SSL检查工具之一来诊断您的问题。

我还建议使用ping检查报告的IP地址并将其与预期的IP地址进行比较。

ping https://www.example.com/

另一个非常有用的SSL资源是Mozilla SSL配置生成器。它可以为您生成SSL配置。


1

当我开始更改Apache配置时,我不知道自己在做什么。我拼凑了一些碎片并认为它正在工作,直到我遇到了你遇到的同样问题,特别是Chrome出现了这个错误。

我所做的是注释掉用于配置SSL验证的所有站点特定指令,确认Chrome让我进入,在重新启用一个指令之前逐个审查指令之前的文档,并重新启动Apache。通过仔细地进行这些操作,您应该能够找出哪些指令导致了您的问题。

在我的情况下,我从这里开始:

SSLVerifyClient optional
SSLVerifyDepth 1
SSLOptions +StdEnvVars +StrictRequire
SSLRequireSSL On

转换成这个

<Location /sessions>
  SSLRequireSSL
  SSLVerifyClient require
</Location>

正如您所看到的,我经历了相当多的更改才到达目标。


1
与其他答案类似,当没有配置站点使用SSL时,就会出现此错误。
我在从Debian Wheezy升级到Debian Jessie时遇到了这个错误。新版本的Apache需要一个以.conf结尾的站点配置文件。因为我的配置文件没有,所以它被忽略了,并且没有其他配置来提供SSL连接服务。

1
我遇到了这个问题,因为我在httpd.confhttpd-ssl.conf中都定义了<VirtualHost>
httpd.conf中,它被定义为:
<VirtualHost localhost>

在httpd-ssl.conf中,它被定义为:

<VirtualHost _default_:443>

以下更改解决了此问题,在httpd.conf中添加:80
<VirtualHost localhost:80>

1
这是我在Ubuntu上解决问题的方法。
  1. 启用模块:a2enmod ssl
  2. 将所有证书相关文件移动到文件夹/usr/local/ssl中,并使其对所有用户可读:chmod -R +r /usr/local/ssl
  3. 在我的虚拟主机中,将<VirtualHost *:80>更改为<VirtualHost *:*>
  4. 在我的虚拟主机中,在其他SSL指令之前添加SSLEngine On

如果您在证书上设置了密码,Apache应在重新启动时提示您输入密码。


1
与其将SSLs设置为全局可读,授予Apache访问权限更加安全:usermod -aG ssl-cert www-data - rich remer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接