Let’s Encrypt のワイルドカード証明書を取得してみた。その1

こんばんはー

サブドメインの新しいブログを作りたいなと思ったのですが、
まあ、毎回毎回サブドメインが増えるごとに証明書を作るのも手間だなと思っていたのと、
そういえば Let’s Encrypt は少し前にワイルドカード証明書も発行できるようになったようなので、試してみようかなと
思ったので、備忘録ついでにやってみました。

さくら VPS を WEB + DB サーバとして使っていて、 nuts-choco.com のサブドメインが増えるたびに
バーチャルホストの設定と、 Let’s Encrypt で証明書を追加するような作業をしていました。

バーチャルホストの設定だらけになっていて、証明書もやたら増えたので、
ここいらで ワイルドカード証明書 + VirtualDocumentRoot を使って環境を思いっきりシンプルにできたらなということでやってみました。

ということで早速以下のコマンド


# ./letsencrypt-auto  certonly --manual \
--server https://acme-v02.api.letsencrypt.org/directory \
--preferred-challenges dns \
-d *.nuts-choco.com \
-m urabe@nuts-choco.com \
--agree-tos \
--manual-public-ip-logging-ok

簡単だわー
と思いきや


-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.nuts-choco.com with the following value:

CYT6FHyM-ZSk9Mo5eKYrACOSOOp_VB0fd-83879_k58

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue

課題が発生しました。
ドメインの所有権を確認するために、 TXT レコードを設定してくれよと。

ということで value domain の nuts-choco.com の DNS の設定に設定例に習って以下のように記述してみました


txt _acme-challenge CYT6FHyM-ZSk9Mo5eKYrACOSOOp_VB0fd-83879_k58

反映ボタンをポチっと。

そして、なんとなく、 letsencrypt-auto のコマンドの画面からも、Enter キーを押してしまいました。


Failed authorization procedure. nuts-choco.com (dns-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: No TXT record found at _acme-challenge.nuts-choco.com

怒られました。

そりゃそうです。瞬時に反映されるわけではありません。

ということで気づいたのですが、コマンドの画面開いたまま、反映されるまで待たないといけないのではないかと。

同じコマンドを再度打ちました


-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.nuts-choco.com with the following value:

AuxeM01Vam-0zZZAQWSh03zbomcotNJF_707yPqQJTc

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue

ほうら、TXT レコードに設定すべき値が変わった。
また 設定しなおしですね。

設定してから、30分ぐらい放置して


$  dig txt _acme-challenge.nuts-choco.com                                              

; <<>> DiG 9.10.6 <<>> txt _acme-challenge.nuts-choco.com                                           
;; global options: +cmd                           
;; Got answer:                                    
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44904                                           
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1                                

;; OPT PSEUDOSECTION:                             
; EDNS: version: 0, flags:; udp: 512              
;; QUESTION SECTION:                              
;_acme-challenge.nuts-choco.com.        IN      TXT                                                 

;; ANSWER SECTION:                                
_acme-challenge.nuts-choco.com. 117 IN  TXT     "AuxeM01Vam-0zZZAQWSh03zbomcotNJF_707yPqQJTc"       

;; Query time: 61 msec                            
;; SERVER: 192.168.1.1#53(192.168.1.1)            
;; WHEN: Mon May 28 22:52:21 JST 2018             
;; MSG SIZE  rcvd: 115  

あー、やっと反映されました。

反映されたのを確認したので、コンソール画面でエンターを押しました。

Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/nuts-choco.com-0003/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/nuts-choco.com-0003/privkey.pem
Your cert will expire on 2018-08-26. To obtain a new or tweaked
version of this certificate in the future, simply run
letsencrypt-auto again. To non-interactively renew *all* of your
certificates, run "letsencrypt-auto renew"
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

無事反映されました。めでたしめでたし。
とはいえ Let’s Encrypt 側からみた DNS が反映されていなければ、相変わらずエラーになるかと思います。

ということで、サブドメインたちの証明書のパスを以下のように設定しました。
※ 人によって config ファイル置き場は違うと思います!


$ sudo vi /etc/apache2/sites-enabled/default-ssl.conf 


SSLCertificateFile /etc/letsencrypt/live/tech.nuts-choco.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/tech.nuts-choco.com/privkey.pem

                      ↓

SSLCertificateFile /etc/letsencrypt/live/nuts-choco.com-0003/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/nuts-choco.com-0003/privkey.pem

Apache 再起動して無事反映完了

VirtualDocumentRoot でシンプルにする方法は次回に持ち越し。

複数バージョンの mysql がそろった vagrant 環境を作ってみる

株式会社オズビジョン卜部です。

前回の記事 では、phpbrew を使った複数環境を構築しました。

前回は、php-fpm を使って、 Apache 経由で複数のバージョンが使い分けられる環境を用意しました。

今回は 複数の MySQL の環境を起動できる vagrant を用意しました。
前回の vagrant の環境構築と同様、今回も chef を使います。

【php7.2 対応】 複数バージョンの php がそろった vagrant 環境を作ってみる ver1 を実施した上で、手順の続きです。


$ cd /path/to/multi-php-ec2
$ git pull origin master
$ git submodule update
$ cd chef-repo
$ chef exec knife zero converge "name:php-multi.local.com"

vagrant ssh でログインすると
mysql 5.7 および mysql 5.6 にログインすることが確認できます。



// 5.7
$ /usr/local/lib64/mysql/5.7.20/bin/mysql -S /usr/local/lib64/mysql/5.7.20/tmp/mysql.sock

// 5.6
$ /usr/local/lib64/mysql/5.6.38/bin/mysql -S /usr/local/lib64/mysql/5.6.38/tmp/mysql.sock

【php7.2 対応】 複数バージョンの php がそろった vagrant 環境を作ってみる ver2

株式会社オズビジョン卜部です。

前回の記事 では、phpbrew を使った複数環境を構築しました。

今回は、それを踏まえて、Apache 経由で 複数の PHP をディレクトリごとに振り分けを行い、確認できる環境を用意しました。
php-fpm の soket 経由で、 VirtualDocumentRoot で分けて、確認できる状況にしています。

また、オレオレ証明書ですが、https でもアクセスできるようにしています。

php module ではないので、 Apache を複数立てたり、再起動したりする必要がなく、開発者にとっては便利な環境になっているのではないでしょうか。
今回用意した、 chef の cookbook は以下です。

以下のような環境になっています


[root@10 sites]# pwd
/var/www/sites
[root@10 sites]# ls
php-5.6.32  php-7.0.26  php-7.1.12  php-7.2.0  php-multi.local.com
[root@10 sites]# 

/var/www/sites 配下に php のバージョンのディレクトリがあり
/var/www/sites/php-7.2.0/ の配下に任意のディレクトリを設置し
/var/www/sites/php-7.2.0/test の配下に public ディレクトリを作成することで DocumentRoot として HTTP 経由でアクセスができます。

chef で新規構築時に 自動で /var/www/sites/php-{複数バージョン}/test/public/index.php が設定されるようにしていますので、
hosts ファイルに以下のように書きます

アクセスするドメイン名の、 test の所は php-x.x.x/ 以下に設置したディレクトリ名、 7.2.0 のところは php のバージョン、それ以下は固定のドメインです。


10.0.100.100 test.7.2.0.php-multi.local.com
10.0.100.100 test.7.1.12.php-multi.local.com
10.0.100.100 test.7.0.26.php-multi.local.com
10.0.100.100 test.5.6.32.php-multi.local.com

ということで、各ドメインにブラウザからアクセスしてみましょう。以下のように表示されればOKです!
https でも(警告はでますが)アクセスができるので、試してみましょう。

追加で違うバージョンの php をインストールしたい場合は以下のファイルの php_versions の配列に追記します。


{
    "name": "vagrant",
    "description": "vagrant environment",
    "chef_type": "environment",
    "json_class": "Chef::Environment",
    "default_attributes": {
        "php_versions": ["7.2.0", "7.1.12", "7.0.26", "5.6.32"],
        "phpbrew_install_arg": "+default",
        "user": "vagrant"
    },
    "override_attributes": {
    },
    "cookbook_versions": {
        "example": "= 1.0.0"
    }
}

【php7.2 対応】 複数バージョンの php がそろった vagrant 環境を作ってみる ver1

ども、株式会社オズビジョン卜部です。

前回は 海外エンジニアと使う頻出英単語・英文 50選 のタイトルで @terra_yucco さんより、とてもおもしろい記事を書いていただいていました。意外と知っている英単語で会話できるんだと気付かされますね。

今回は
【php7.2 対応】 複数バージョンの php がそろった vagrant 環境を作ってみる ver1
というテーマでやっていきたいと思います。

というのは社内では複数のプロジェクトが動いており、そこで扱っている php が複数バージョンあるので、1環境で事足りるようにしたいなという思いと、 (vagrant いっぱい立てるのは重たいですしね)
2017年11月30日に php7.2.0 がめでたくリリースされたので、折角なので、最新版の環境も立てたいなと思ってのテーマです。

今回は ver1 ですので、 ver2 .. とやっていきます。。。
というのは、今回だけでは完結できなかったんですけどね。。

イメージとしてはざっくり以下のようなイメージです

こんな感じのことがしたい

  • 1 つの Vagrant だけで開発できるようにしたい
  • 複数の php のバージョンが扱えるようにしたい
  • Amazon Linux のイメージを使いたい
  • Apache の VirtualDocumentRoot を使ってディレクトリを分けて環境が使えるようにしたい

立ててみる

ということで、実際に環境を構築したので、 Vagrant の設定と、chef の設定を github に公開しました。

※ ライセンスは MIT にしています。 pull request 歓迎です!

https://github.com/oh-my-oss/multi-php-ec2

Readme に書いているように前提条件が揃っている環境で試しましょう。

ということで早速 clone してセットアップしてみましょう。


    $ git clone https://github.com/oh-my-oss/multi-php-ec2.git
    $ cd multi-php-ec2
    $ vagrant up --provision

    $ git submodule init
    $ git submodule update

    $ vagrant ssh-config --host php-multi.local.com >> ~/.ssh/config
    $ cd chef-repo
    $ VG_HOST=php-multi.local.com
    $ chef exec knife zero bootstrap $VG_HOST --node-name $VG_HOST
    $ php add-fqdn.php nodes/php-multi.local.com.json
    $ chef exec knife node run_list add $VG_HOST 'role[php-web]'
    $ chef exec knife node environment set $VG_HOST vagrant
    $ chef exec knife zero converge "name:$VG_HOST"

セットアップしたところ php 5.6.32, 7.1.12, 7.2.0 がインストールできました。

ここから、 fpm の設定や、 apache の設定を行いたいところですが、それは次回 ver2 に更新に乞うご期待!

ということで次の更新は アドベントカレンダー 3日目!
@smirax さんより jenkins について投稿いただけるとのこと。

とにかく `jenkins 困った` というワードがチャットやら、バックログやらで出てきたときには @smirax さんから颯爽と現れ、
手厚いサポートを行い、何もなかったかのように問題が解決し、颯爽といつもの業務に戻っていくという姿を何度見かけたことか!

どんな記事がでてくるかとても楽しみですね。