Apache2“localhost”可以工作,但对于 127.0.0.1,我得到“无法访问此站点,拒绝连接”。 SSL 也返回授权错误

Posted

技术标签:

【中文标题】Apache2“localhost”可以工作,但对于 127.0.0.1,我得到“无法访问此站点,拒绝连接”。 SSL 也返回授权错误【英文标题】:Apache2 "localhost" works but for 127.0.0.1 I get "This site can’t be reached refused to connect". SSL also returns authorization error 【发布时间】:2021-04-17 05:13:06 【问题描述】:

我正在尝试在 docker (WSL2) 下运行具有自签名证书的 apache2 来测试 SSL。 docker 文件脚本是这样的

FROM php:7.1-apache
RUN apt-get update && apt-get install -y zlib1g-dev
COPY ./certs/* /etc/apache2/ssl/
COPY dev.conf /etc/apache2/sites-enabled/dev.conf
RUN docker-php-ext-install mysqli pdo pdo_mysql zip mbstring
RUN a2enmod rewrite
RUN a2enmod ssl
RUN service apache2 restart

dev.conf 包含如下所示的 SSL 虚拟主机。

<VirtualHost *:443>
    DocumentRoot "/var/www/html/"
    
    ErrorLog $APACHE_LOG_DIR/error.log
    CustomLog $APACHE_LOG_DIR/access.log combined
    
    SSLEngine on
    
    SSLCertificateFile "/etc/apache2/ssl/server.crt"
    SSLCertificateKeyFile "/etc/apache2/ssl/server.key" 
                
    ServerName dev-asusrog.com

</VirtualHost>

http://localhost:80 使用 chrome/firefox/opera 在端口 80 上运行它可以工作。相同,但改用http://127.0.0.1:80,我得到“无法访问此站点”拒绝连接。“IP6 only version protocol is disabled.

sysctl net.ipv6.bindv6only
net.ipv6.bindv6only = 0

使用curl -v localhostcurl -v 127.0.0.1 似乎在这两种情况下都有效。

curl -v localhost
*   Trying 127.0.0.1:80...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Tue, 12 Jan 2021 08:39:23 GMT
< Server: Apache/2.4.38 (Debian)
< Last-Modified: Tue, 12 Jan 2021 08:05:26 GMT
< ETag: "20-5b8af7c33cb30"
< Accept-Ranges: bytes
< Content-Length: 32
< Content-Type: text/html
<
<html>
<h1>Welcome</h1>
</html>
* Connection #0 to host localhost left intact


curl -v 127.0.0.1
*   Trying 127.0.0.1:80...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Tue, 12 Jan 2021 08:39:33 GMT
< Server: Apache/2.4.38 (Debian)
< Last-Modified: Tue, 12 Jan 2021 08:05:26 GMT
< ETag: "20-5b8af7c33cb30"
< Accept-Ranges: bytes
< Content-Length: 32
< Content-Type: text/html
<
<html>
<h1>Welcome</h1>
</html>
* Connection #0 to host 127.0.0.1 left intact

运行https://dev-asusrog.com/(我已经在主机文件 dev-asusrog.com 下设置指向 127.0.1.1)我得到“对 dev-asusrog.com 的访问被拒绝。您没有权限查看此页面。HTTP 错误 403"

文件server.crtserver.key 文件是使用openssl 使用下面的命令创建的,使用dev-asusrog.com 上面的假服务器作为服务器FQDN。

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt

我收到以下 Apache2 错误。第一个,关于完全限定域名,通过在/etc/apache2/apache2.conf 下添加ServerName localhost 语句来修复。其他人呢?

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.1.1. Set the 'ServerName' directive globally to suppress this message
[Tue Jan 12 11:53:39.329396 2021] [ssl:warn] [pid 22] AH01906: dev-asusrog.com:443:0 server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)
[Tue Jan 12 11:53:39.329797 2021] [ssl:error] [pid 22] AH02217: ssl_stapling_init_cert: can't retrieve issuer certificate! [subject: CN=dev-asusrog.com,OU=informatics,O=Company,L=mystate,ST=mystate,C=US / issuer: CN=dev-asusrog.com,OU=informatics,O=Company,L=mystate,ST=mystate,C=US / serial: 08C832686429FFF4C45180A8806FE16A278B41A3 / notbefore: Jan 11 10:40:12 2021 GMT / notafter: Jan 11 10:40:12 2022 GMT]
[Tue Jan 12 11:53:39.329830 2021] [ssl:error] [pid 22] AH02604: Unable to configure certificate dev-asusrog.com:443:0 for stapling

这里有什么帮助吗?

【问题讨论】:

你能分享命令的输出吗?网络统计-nltup | grep -e 80 -e 443 @amitdahiya (No info could be read for "-p": geteuid()=1000 but you should be root.) tcp6 0 0 :::443 :::* LISTEN - tcp6 0 0 :::80 :::* LISTEN - 【参考方案1】:

第一步)我必须在\Windows\system32\drivers\etc\hosts 下更改/添加本地测试域 按照 Olaf Kock 的建议,从 127.0.0.1 dev-asusrog.com::1 dev-asusrog.com

第二步)我必须禁用ssl-params.conf 下的SSLUseStapling 参数,即注释掉

#SSLUseStapling on

第三个选项步骤)在 Windows 受信任的根证书颁发机构中安装 server.crt 证书 为了您的方便,我在下面附上了受影响的文件。

我的 Dockerfile 变成了这个

FROM php:7.1-apache

COPY ./certs/* /etc/apache2/ssl/
COPY ssl-params.conf /etc/apache2/conf-available/
COPY ./sites-available/* /etc/apache2/sites-available/
RUN a2enconf ssl-params
RUN a2ensite default-ssl
RUN a2enmod rewrite
RUN a2enmod ssl
RUN a2enmod headers

WORKDIR /var/www/html/

RUN service apache2 restart

我的ssl-params.conf 是这样声明的

SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACH$
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

SSLHonorCipherOrder On

# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains"

Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff

# Requires Apache >= 2.4
SSLCompression off
#SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"

# Requires Apache >= 2.4.11
SSLSessionTickets Off

文件sites-available/default-ssl.conf是这样声明的

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin your_email@example.com
                ServerName dev-asusrog.com

                DocumentRoot /var/www/html

                ErrorLog $APACHE_LOG_DIR/error.log
                CustomLog $APACHE_LOG_DIR/access.log combined

                SSLEngine on

                SSLCertificateFile "/etc/apache2/ssl/server.crt"
                SSLCertificateKeyFile "/etc/apache2/ssl/server.key"             

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

                BrowserMatch "MSIE [2-6]" \
                               nokeepalive ssl-unclean-shutdown \
                               downgrade-1.0 force-response-1.0

        </VirtualHost>
</IfModule>

希望它能帮助你,以防你遇到和我一样的问题。

最好的问候,

【讨论】:

【参考方案2】:

localhost 现在通常是 ::1 的别名(注意:IPV6),而 127.0.0.1 显然是 IPV4。因此,您正在连接到不同的端点,如果您没有明确打开 IPV4 连接,则那里没有任何东西在监听。

【讨论】:

是的,这是真的。如何打开 IPv4?我以为它们是默认打开的。 SSL 错误呢? 您有两层来定位根本原因,但在这种情况下,最重要的一层将是 Docker:如果 Docker 不提供 IPV4 地址,那么 httpd 的作用无关紧要。关于 SSL 错误 - 这很危险地接近于配置而不是编程问题,因此不在 *** help center 上的主题。您可能会在其他网站上找到更好的帮助,例如serverfault.com 嗨,我已经解决了我的问题。请阅读我上面的回答。感谢您的宝贵时间。 我在“无法访问站点”方面遇到了同样的问题。将我的主机配置更改为 ::1 是为我解决的问题。

以上是关于Apache2“localhost”可以工作,但对于 127.0.0.1,我得到“无法访问此站点,拒绝连接”。 SSL 也返回授权错误的主要内容,如果未能解决你的问题,请参考以下文章

`Apache` `localhost/~username/` 不工作

为啥对 `Host: localhost` 的 HTTP 请求不会出现在 Apache2 访问日志中?

尽管是管理员,但对 localhost 的访问被拒绝 - PowerShell

编译安装apache2.4

如何在 openSUSE 上使用 NGINX 或 Apache2 将我的端口 80 重新路由到 localhost:3000 以便我可以运行我的 Node.js 应用程序

Mac自带apache2搭建服务请求localhost报 403 Forbidden