LAMP環境のさくらVPSに無料SSL「Let’s Encrypt」を導入する
Cent OS 6.9のさくらVPSサーバーに、Let’s Encryptを導入しましたので、その時の作業メモです。
実際は、何度か詰まって試行錯誤したので、少し作業の順番が異なるかも知れません。
何気に、これ、重要です。やっておかないと、後で詰まりますw
Pythonがインストールされていない場合は、2.7以降をインストールします。
sudo scl enable python27 bashで、Linux上で使用されるPythonのバージョンを切り替える事が出来ます。
もし、既にインストールされているPythonのバージョンが2.6とかで、letsencrypt上でエラーが起きるなら、このコマンドを叩くと治る可能性があります。
このコマンドを実行すると、必要なライブラリ等がすべてインストールされます。エラーが出る場合は、Pythonがインストールされているか、yum updateされているか、などを確認してください。
Q: certbot-auto renewすると、「Bootstrapping dependencies for RedHat-based OSes...」みたいなエラーが起こって、証明書の更新ができない。
A: 現状、Python2系を使っているけど、Python3の使用が要求されてるっぽいので、Pythonインストールの環境変数をリセットしてから更新すると上手く行きました。処理の途中で、Python3系が自動的にインストールされます。
Q: なぜか下記のようなDNSエラーが出て更新出来ない(DNSは正しく設定済み)
エラー内容:
Detail: dns :: DNS problem: query timed out looking up A for なんとかドメイン.com
To fix these errors, please make sure that your domain name was entered correctly and the DNS A/AAAA record(s) for that domain contain(s) the right IP address. Additionally, please check that your computer has a publicly routable IP address and that no firewalls are preventing the server from communicating with the client. If you're using the webroot plugin, you should also verify that you are serving files from the webroot path you provided.
A: .htaccessで余計なリダイレクトが入っている可能性があります。
下記のような感じで、.well-known/をリダイレクト対象から外すと解決するかも。
RewriteEngine On
RewriteCond ほげほげ
RewriteCond %{REQUEST_URI} !(^/\.well-known/)
RewriteRule ほげほげ
実際は、何度か詰まって試行錯誤したので、少し作業の順番が異なるかも知れません。
■全パッケージのアップデート
何気に、これ、重要です。やっておかないと、後で詰まりますw
sudo yum update
■Python2.7のインストール
Pythonがインストールされていない場合は、2.7以降をインストールします。
sudo yum install centos-release-scl
sudo yum install python27 python27-python-tools
sudo yum install dialog
sudo scl enable python27 bash
sudo yum install python27 python27-python-tools
sudo yum install dialog
sudo scl enable python27 bash
sudo scl enable python27 bashで、Linux上で使用されるPythonのバージョンを切り替える事が出来ます。
もし、既にインストールされているPythonのバージョンが2.6とかで、letsencrypt上でエラーが起きるなら、このコマンドを叩くと治る可能性があります。
■pipのインストール
pipが無いなら、インストールしておきます。
wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate
python get-pip.py
python get-pip.py
■letsencryptをgit経由でダウンロード
Git経由でダウンロードしておきます。
別にGitじゃなくても良いですけどね。
別にGitじゃなくても良いですけどね。
cd /var/
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
■初期設定
./certbot-auto
このコマンドを実行すると、必要なライブラリ等がすべてインストールされます。エラーが出る場合は、Pythonがインストールされているか、yum updateされているか、などを確認してください。
■証明書の発行
パターン3の方法が、圧倒的におすすめです。
パターン1(普通のやり方) :
./certbot-auto certonly -a standalone -d testdomain.com
これで上手くいけば、下記に証明書ファイルが生成されます。
ls /etc/letsencrypt/live/testdomain.com
備考:上記コマンドの場合、一度httpdを停止させてから処理を行う必要があります。下記のように、webroot認証を使えば、httpdを稼働していても問題なく処理出来ます。
パターン2(httpd停止不要の例) :
./certbot-auto certonly --webroot -w /var/www/html/ -d testdomain.com -m your@emailaddress.com
上記は、testdomain.comのドキュメントルートが/var/www/htmlの場合の例です。
2018/10/25追記: wwwありとなし両方に対応するwebroot証明書の例は下記の通りです。
パターン3(httpd停止不要かつ、wwwありなし対応) :
./certbot-auto certonly --webroot -w /var/www/html/ -d testdomain.com,www.testdomain.com -m your@emailaddress.com
./certbot-auto certonly -a standalone -d testdomain.com
これで上手くいけば、下記に証明書ファイルが生成されます。
ls /etc/letsencrypt/live/testdomain.com
備考:上記コマンドの場合、一度httpdを停止させてから処理を行う必要があります。下記のように、webroot認証を使えば、httpdを稼働していても問題なく処理出来ます。
パターン2(httpd停止不要の例) :
./certbot-auto certonly --webroot -w /var/www/html/ -d testdomain.com -m your@emailaddress.com
上記は、testdomain.comのドキュメントルートが/var/www/htmlの場合の例です。
2018/10/25追記: wwwありとなし両方に対応するwebroot証明書の例は下記の通りです。
パターン3(httpd停止不要かつ、wwwありなし対応) :
./certbot-auto certonly --webroot -w /var/www/html/ -d testdomain.com,www.testdomain.com -m your@emailaddress.com
■Apache上でVirtual Hostの設定
あとは、/etc/httpd/conf.d/ssl.confあたりに、VirtualHostの設定を追加します。
NameVirtualHost *:443
<VirtualHost *:443>
ServerAdmin test@testdomain.com
DocumentRoot /var/www/virtual/testdomain.com
ServerName test domain.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/testdomain.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/testdomain.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/testdomain.com/chain.pem
</VirtualHost>
<VirtualHost *:443>
ServerAdmin test@testdomain.com
DocumentRoot /var/www/virtual/testdomain.com
ServerName test domain.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/testdomain.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/testdomain.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/testdomain.com/chain.pem
</VirtualHost>
■んで、ドキドキのサーバーリロード。
service httpd configtestで、あらかじめ設定が正しいか確認しておき、Syntax OKが出たら、service httpd reloadでApacheをリロードします。ドキドキの瞬間ですね。
これでエラーが出るなら、証明書のデータがおかしかったり、何かが足りないと思いますので、一旦ssl.confの内容を元に戻したり、コメントアウトしたりして、やり直しですw
ここで成功すれば、SSLの導入はひとまず完了です。
これでエラーが出るなら、証明書のデータがおかしかったり、何かが足りないと思いますので、一旦ssl.confの内容を元に戻したり、コメントアウトしたりして、やり直しですw
ここで成功すれば、SSLの導入はひとまず完了です。
■cronで証明書を自動更新
これだけだと、3ヶ月後に証明書が失効してしまうので、cronで自動更新させます。
上記は、毎月1日と15日の10時に自動更新します。
月2回もやる必要はないですけどね。
crontab -e
0 10 1,15 * * /var/letsencrypt/certbot-auto renew --agree-tos && service httpd reload
0 10 1,15 * * /var/letsencrypt/certbot-auto renew --agree-tos && service httpd reload
上記は、毎月1日と15日の10時に自動更新します。
月2回もやる必要はないですけどね。
■完成!!
おつかれさまでした!
めっちゃめんどいですが、普通にLinux環境にSSLを入れる作業と、それほどめんどさは変わらないので、無料SSL、ありだと思います。
めっちゃめんどいですが、普通にLinux環境にSSLを入れる作業と、それほどめんどさは変わらないので、無料SSL、ありだと思います。
トラブルシューティング
Q: certbot-auto renewすると、「Bootstrapping dependencies for RedHat-based OSes...」みたいなエラーが起こって、証明書の更新ができない。
A: 現状、Python2系を使っているけど、Python3の使用が要求されてるっぽいので、Pythonインストールの環境変数をリセットしてから更新すると上手く行きました。処理の途中で、Python3系が自動的にインストールされます。
unset PYTHON_INSTALL_LAYOUT
service httpd stop
/var/letsencrypt/certbot-auto renew --force-renewal --agree-tos
service httpd start
service httpd stop
/var/letsencrypt/certbot-auto renew --force-renewal --agree-tos
service httpd start
Q: なぜか下記のようなDNSエラーが出て更新出来ない(DNSは正しく設定済み)
エラー内容:
Detail: dns :: DNS problem: query timed out looking up A for なんとかドメイン.com
To fix these errors, please make sure that your domain name was entered correctly and the DNS A/AAAA record(s) for that domain contain(s) the right IP address. Additionally, please check that your computer has a publicly routable IP address and that no firewalls are preventing the server from communicating with the client. If you're using the webroot plugin, you should also verify that you are serving files from the webroot path you provided.
A: .htaccessで余計なリダイレクトが入っている可能性があります。
下記のような感じで、.well-known/をリダイレクト対象から外すと解決するかも。
RewriteEngine On
RewriteCond ほげほげ
RewriteCond %{REQUEST_URI} !(^/\.well-known/)
RewriteRule ほげほげ
この記事の最終更新日:2019/04/01
最初に記事を書いた日:2017/11/02
この記事をシェアする
関連記事
- ・hosts.denyを使わずに、サーバーへの全てのアクセスをIPアドレス拒否する方法
- ・「.well-known」以下をwwwにリダイレクトさせない方法
- ・【格安VPN】NordVPNは本当に安全なのか?【閲覧履歴ダダ漏れw】
- ・「root@notty」って何者?
- ・アクセス解析ツール「awstats」をCentOSにyumでインストールする
- ・Kali LinuxをVagrantにインストールする
- ・【Tomcat】Apache+Tomcat連携で、特定のディレクトリのみTomcatにする方法
- ・【PHP】HTTPDの溜まりきったログを一気に削除する方法
- ・Macでトンネル接続してFTP/SFTP接続する簡単な方法
- ・【.htaccess】httpアクセスをhttpsに強制リダイレクトで、特定のファイルやディレクトリを除外する方法