【Ubuntu】艾柏察的SSL化(TLS1.3)真是费了好大劲【阿帕奇2.4】

最初概括

apache2.4のSSL対応に数日かかった
phpでサイトを作っている場合、一工夫必要でした
ってことを書いてます。証明書取得して設置して終了!で済まなかった…

免费提供SSL支持

为了简单地进行SSL化,可以使用openssl生成证书,并在apache2.conf或000-default.conf文件中指定证书的位置,然后重启即可。但是,即使将自己创建的证书安装上去,由于操作系统不信任该证书,浏览器仍会显示错误页面。为了解决这个问题,有一个名为”Let’s Encrypt”的免费证书可供使用。

学习SSL时经历了困难。

如果在Google上搜索”SSL机制”或者”SSL证书”,大部分会显示关于加密(公钥和私钥之类的)的解释性网站。然而,我想要了解的不只是这些…经过各种调查,我对SSL的机制有了大致的理解,如下所述。

    1. 王様会给予他信任的部下一张证书。王様需要制作自己和部下的证书。

 

    1. 普通人可以向部下申请面试,并申请制作证书。

 

    1. 如果部下与普通人进行面试并通过,则会制作普通人的证书。

 

    每个操作系统都有证书库,王様需要在现实世界中获得操作系统开发者的信任,并将自己的证书实施到库中。

当在浏览器等连接网站时查看证书的详细信息时,可以确认其呈现出上述三层结构。卡巴斯基证书则是不带有中间认证机构的两层结构。国王、部下和普通人的信息分别加密并写入证书中。这个证书证明了“谁”和“什么”,具体内容因国王而异。

王様被称为“根认证机构”,部下则称为“中间认证机构”。Let’s Encrypt是一个中间认证机构,它颁发用于证明“受信任的网站运营者拥有相应域名记录的DNS服务器的权限(也就是说,该域名很少可能被非域名所有者的第三方伪造)”的证书。而颁发“信任”本身的根认证机构是“Internet Security Research Group”,我大概有个理解(可能严格上是有所不同)。

只要证明内容具体(例如实际存在办公室和职员任职的公司),证明书的价格就会上涨,而且可能还需要电话确认、面试、登记项目证明等。看起来中间认证机构的运营很困难呢。

听说有一些浏览器和邮件客户端没有使用操作系统的证书库,而是使用自己独有的库。

最近的SSL

据说SSL发现了各种故障和安全漏洞,现在(2023年3月)SSL已经彻底崩溃了,它进化为TLS,但是TLS 1.1也存在危险,1.2也即将达到危险级别,现在使用1.3似乎很普遍。为什么会称为”SSL”而不是”TLS”仍然是个谜。加密算法中的128位也快要达到危险级别,所以被不推荐了等等。在Web服务器中,可以通过cipher设置来指定支持的算法。

明文TLS和隐式TLS

据说在平文通信后,有两种TLS协议可以选择:显式TLS(也被称为STARTTLS),以及一开始就加密通信的隐式TLS。网页服务器(端口443:https)仅支持隐式TLS,并且不需要特别的配置或设置。

申请和安装电子证书

使用免费的Let’s Encrypt。由于有许多好文章步骤,所以委托给其他文章(也被称为完全委托!)。

电子证书的更新

由于期限较短,我想自动化更新。据说以前需要编写一个自动更新脚本来在cron上运行,但安装certbot后,自动更新也会被启用。

可以通过以下命令来测试是否能正确更新。

certbot renew --dry-run

我认为只是安装证书可能经常通不过测试。我通过以下步骤通过了测试。

在Web服务器的文档根目录下创建.well-known/acme-challenge目录。

mkdir /var/www/html/.well-known
mkdir /var/www/html/.well-known/acme-challange

请别忘记设置权限。

chmod 755 /var/www/html/.well-known
chmod 755 mkdir /var/www/html/.well-known/acme-challange

允许来自美国的访问通过80号端口。

确认iptables的设置和htaccess的描述。
为了安全起见,我们在htaccess中限制了对well-known目录的访问。据说存在针对该目录的攻击。

只放置证明文件是不够的。

证书设置后,连接变为SSL连接,但网站显示变得非常慢。以前只需要3秒钟,现在却需要超过100秒。这实在是异常之处太多了。

当Apache的运行模式是prefork时,速度会变慢。

数日来的调查揭示了以下的原因。

    1. 由于mpm_prefork不支持http2,因此速度较慢。

 

    1. 如果使用mpm_event,问题可以解决,但是php依赖于prefork运行。

 

    通过切换php的运行方式到fastCGI,可以解决问题(使用mod_fcgi和php-fpm)。

既然如此,让我们进行切换吧。

# インストール。
 apt install php8.0-fpm

# fast cgiの有効化。
 a2enmod proxy_fcgi setenvif
 
# php-fpmの有効化とprefork依存のphp無効化。
 a2enconf php-8.0-fpm
 a2dismod php8.0

# 設定ファイルの文法チェック。無反応であることを確認。
 apache2ctl configtest  

# prefork無効化、event有効化。
 a2dismod mpm_prefork
 a2enmod mpm_event

# システム再起動。
 systemctl restart php8.0-fpm apache2

仅仅这样还无法使现有页面变得更快!竟然无法访问!

当尝试访问该网站时,会出现一个下载文件对话框,或者显示为“Forbidden”,不同的浏览器表现不同。这是怎么回事???

如果使用php-fpm,无法访问网站。

进一步探索原因和对策,需要几天的时间。

看起来,在php-fpm的默认设置中,无论在.htaccess文件中是否写入了x-application,都似乎无法让php来执行html扩展名的文件。因此需要进行配置更改。

vi /etc/php/8.0/fpm/pool.d/www.conf

# 以下の項目を編集
security.limit_ = .php .html .htmls
vi /etc/apache2/mods-available/php8.0-fpm.conf

<FilesMatch "\.ph(ar|p|tml)$">
↓に変更
<FilesMatch "\.(phar|php|phtml|html)">

终于可以正常显示了。虽然速度稍微快了一点,但与不支持SSL相比还是慢了一些…NginX似乎更擅长显示SSL网站。

据说在Android版Firefox等部分浏览器上,Let’s Encrypt的证书可能会出现类似”该网站存在风险”的警告。由于这是无法解决的问题,我们只能等待浏览器的更新支持。

日志出现错误… shū cuò wù…)

刚重新启动apache之后,当我查看/var/log/apache2/error.log时发现有大量的错误。

 Options FollowSymLinks and SymLinksIfOwnerMatch are both off...(略

使用mod-rewrite时,必须启用FollowSymLinks或SymLinksIfOwnerMatch。

<Directory /var/www/html>
    Options SymLinksIfOwnerMatch
</Directory>

其他

证书需要明确指出是否存在,并进行重定向。如果是高级证书(通配符证书:非常昂贵),两种情况都可以。证书真是麻烦啊…。


 ServerName www.mydomain.com  ←wwwを抜くとブラウザに怒られる
 RewriteCond 

由于想在其他邮件服务器上使用相同的证书,所以进行了以下设置。

 ServerName www.mydomain.com
 ServerAlias mydomain.com

参考网站

 

广告
将在 10 秒后关闭
bannerAds