Apache SSL:服务器证书不包含与服务器名称匹配的ID


21

我正在尝试在apache2网络服务器上设置SSL,但似乎根本无法使用。

我遵循了一个使用openssl创建证书文件并/etc/apache2/sites-available/default-ssl.conf正确配置的教程。

每次我尝试使用https打开我的网站时,由于安全问题,我的浏览器都会拒绝连接。它说我的网站配置不正确。

在我的/var/log/apache2/error.log警告中,我的服务器证书不包含与服务器名称匹配的ID。

[Mon Apr 10 11:03:24.041813 2017] [mpm_prefork:notice] [pid 1222] AH00169: caught SIGTERM, shutting down
[Mon Apr 10 11:03:30.566578 2017] [ssl:warn] [pid 661] AH01909: 127.0.0.1:443:0 server certificate does NOT include an ID which matches the server name
[Mon Apr 10 11:03:31.579088 2017] [ssl:warn] [pid 1194] AH01909: 127.0.0.1:443:0 server certificate does NOT include an ID which matches the server name
[Mon Apr 10 11:03:31.592958 2017] [mpm_prefork:notice] [pid 1194] AH00163: Apache/2.4.25 (Raspbian) OpenSSL/1.0.2k configured -- resuming normal operations
[Mon Apr 10 11:03:31.593136 2017] [core:notice] [pid 1194] AH00094: Command line: '/usr/sbin/apache2'

您对如何解决这个问题有任何想法吗?谢谢!


您使用的是Apache 2.2还是2.4?我从2.2升级到2.4,并收到此错误。就我而言,它不是公共服务器,而是内部服务器,因此我猜想自签名证书可以。
svhyd

出现此错误时,我在公共服务器(Debian 8)上使用Apache 2.2。切换到“让我们加密”后,错误消失了,所以我猜这是导致错误的自签名证书。
pixelmusic

Answers:


7

好的,我注意到这篇文章最近经常被浏览,因此似乎很多人都面临与我相同的问题。如果是这样,那么这可能对您有帮助。

我遵循了一个简单的分步教程,为我的Web服务器创建SSL证书。像那里的许多教程一样,我遵循的教程的结果是使用OpenSSL的自签名证书。是的自签名的,这就是问题所在。浏览器无法信任该服务器,因为它是由其自己签名的证书。好吧,我也不会...

证书必须由外部可信任证书颁发机构(CA)签名。因此,我偶然发现了Let's Encrypt,它可以为您完成所有工作,并且设置起来更容易,而且最好的是:它是完全免费的。

安装

1)删除使用OpenSSL创建的旧ssl证书文件

2)打开backport以在Debian上获得certbot客户端。您应该知道,这将为未完成的软件打开一个漏洞!当您知道自己在做什么时,仅安装软件包。

echo 'deb http://ftp.debian.org/debian jessie-backports main' | sudo tee /etc/apt/sources.list.d/backports.list

3)更新您的linux系统

sudo apt-get update

4)安装certbot

sudo apt-get install python-certbot-apache -t jessie-backports

5)设置Apache ServerName和ServerAlias

sudo nano /etc/apache2/sites-available/000-default.conf

6)编辑apache配置文件

<VirtualHost *:80>
    . . .
    ServerName example.com
    ServerAlias www.example.com
    . . .
</VirtualHost>

7)检查语法是否正确

sudo apache2ctl configtest

8)如果配置文件看起来不错,请重新启动apache服务器

sudo systemctl restart apache2

9)使用certbot设置证书,然后按照屏幕上的说明进行操作。

sudo certbot --apache

续约

Let's Encrypt的所有证书有效期为3个月。要续订,您可以手动运行

sudo certbot renew

或者将这项服务作为Cron作业自动化

sudo crontab -e

并输入以下行以在每个星期一的凌晨2:30调用续订。

. . .
30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log

您可以在此处关注更详细的教程:https ://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-debian-8


这不能用于本地主机(本地网络上的虚拟机),我的意思是您需要购买域才能使用让我们加密吗?
lewis4u

1
是的,您的Web服务器必须可以通过注册的域进行访问,以便我们进行加密才能正常工作。
pixelmusic

2

如果没有其他SSL错误,并且尝试在httpd.conf文件中设置“ LogLevel debug”,则此错误消息也可能表明httpd.conf文件中缺少“ Listen 443”。


我完全忘了让Apache听443,它只听了80谢谢
Robert Robert

1

这些不是错误-它们是警告。只要您定义了默认的ssl主机,并且证书上的公用名与客户端用于连接的主机名匹配,就有可能使用与定义的服务器名称不匹配的证书运行mod_ssl。

在您的情况下,后者似乎并不正确。如Jacob所说,创建CSR时需要指定正确的主机名作为公用名(或别名)。

要查看证书上当前使用的名称:

openssl s_client -showcerts -connect ${HOSTNAME}:443

如果计算机上安装了多个证书并在同一IP地址上提供了这些证书,则:

openssl s_client -showcerts -connect ${HOSTIP}:443 -servername ${HOSTNAME}

(如果$ {...}值为占位符,则应使用相关值替换)。


(1)您应该将服务器名称放在CSR的CommonName中,但是是否实际需要(C​​A是否检查和/或复制它)取决于CA(2)openssl s_client显示叶子证书的主题和颁发者,这是唯一的您需要在这里没有-showcerts,但对于大约2010年以来的真正CA证书(以及有能力的人进行DIY证书),您需要查看的不是主题而是SubjectAltName(SAN)扩展,而您需openssl s_client -connect h:p [-servername h] | openssl x509 -noout -text
要这样做

请注意,从2018年中期开始,如果您希望在现代浏览器中正确验证证书,则还需要在主题备用名称中指定DNS名称。
symcbean

我不知道2018年会有什么变化; 自2017年初以来,Chrome已要求使用SAN(用于DNS IP,尽管很少使用),而Firefox和IE(我仍然认为是现代的)今天不再需要SAN-尽管正如我之前所说的,公共CA提供了它更长。
dave_thompson_085

0

最近,我的自签名证书过期时遇到了这个问题。我用谷歌搜索并复制了从一个网站创建新证书的命令。

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/apache2/ssl/apache.crt

在我的apache配置文件中:/etc/apache2/sites-available/default-ssl.conf。证书文件和密钥文件是指以下文件名。

    SSLCertificateFile  /etc/apache2/ssl/apache.crt
    SSLCertificateKeyFile /etc/apache2/ssl/apache.key

因此,在我看来,这里出现的错误更容易修复,只需在创建ssl证书时提供证书密钥文件的正确位置即可。

因此,这是我应该正确使用和键入的命令。

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt

0

就我而言,我已经通过在每个相关域的apache ssl配置文件中替换了它来解决了这个问题:

ServerName mydomain.com
ServerAlias www.mydomain.com

创建人:

ServerName www.mydomain.com
ServerAlias mydomain.com

因为我的证书适用于“ www.mydomain.com”,而不适用于“ mydomain.com”

完整的apache文件:

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerAdmin noreply@mydomain.com
        ServerName www.mydomain.com
        ServerAlias mydomain.com
    DocumentRoot /home/mydomain.com/public_html
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|ico|png)$ \ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ \no-gzip dont-vary
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

    <Directory />
        Options +FollowSymLinks
        AllowOverride All
    </Directory>
    <Directory /home/mydomain.com/public_html>
        Options -Indexes +FollowSymLinks +MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride All
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>


ErrorLog ${APACHE_LOG_DIR}/error.log

LogLevel warn
SSLCertificateFile /etc/letsencrypt/live/www.mydomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.mydomain.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.