【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的机制有了大致的理解,如下所述。
-
- 王様会给予他信任的部下一张证书。王様需要制作自己和部下的证书。
-
- 普通人可以向部下申请面试,并申请制作证书。
-
- 如果部下与普通人进行面试并通过,则会制作普通人的证书。
- 每个操作系统都有证书库,王様需要在现实世界中获得操作系统开发者的信任,并将自己的证书实施到库中。
当在浏览器等连接网站时查看证书的详细信息时,可以确认其呈现出上述三层结构。卡巴斯基证书则是不带有中间认证机构的两层结构。国王、部下和普通人的信息分别加密并写入证书中。这个证书证明了“谁”和“什么”,具体内容因国王而异。
王様被称为“根认证机构”,部下则称为“中间认证机构”。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时,速度会变慢。
数日来的调查揭示了以下的原因。
-
- 由于mpm_prefork不支持http2,因此速度较慢。
-
- 如果使用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
参考网站