devrel.jpをCloudFront SNIを使ってHTTPS化するまでの流れ

devrel.jpをCloudFront SNIを使ってHTTPS化するまでの流れ

devrel.jpはS3上にデプロイしています。Jekyllを使った静的サイトなので、十分と言えるでしょう。しかし最近の流れとしてHTTPS化は大事です。特にGoogleからのリファラー情報もHTTPSになっていないと届かなくなっています。

独自ドメインで運用しているS3サイトをHTTPS化するには、これまではIPアドレスベースのSSLしかなく、料金が高かったのですが(証明書ごとに月600ドル!)、SNIのSSLがサポートされるようになったので、CloudFrontの配信料金を別にすれば格安でSSLを使った独自ドメインサイトが構築できるようになりました。

今回はじめてだったので、その手順を書いていきたいと思います。

SSL証明書

まず何はともあれSSL証明書です。今回はうまくいかないことも考えていたので、StartSSLを使ってみました。StartSSLは無料でSSL証明書を取得できます。

StartSSL™

ユーザ登録をして、ドメイン認証をすれば秘密鍵、公開鍵が取得できます。例えばこの名前をそれぞれserver.key と server.csr とします。

まず秘密鍵のパスワードを除きます。

$ openssl rsa -in server.key -out server.nopw.key
(パスフレーズ入力)

次にStartSSLが配布している中間証明書をダウンロードします。

$ wget https://www.startssl.com/certs/ca.pem
$ wget https://www.startssl.com/certs/sub.class1.server.ca.pem

この二つの証明書はくっつけて一つの中間証明書としておきます。

$ cat sub.class1.server.ca.pem ca.pem > server.pem

AWSツールのインストール

次にAamzon Web Servicesを操作するためのツールをインストールします。2015年現在、awscliというツールになっています。Homebrewでインストールしました。

$ brew install awscli

インストールしたら、AWSのIAM Management Consoleへ行き、ユーザを作成します。そのユーザの Access Credentials で、新しいAccess Keyを作成します。

そしてawsの設定コマンドを実行します。

$ aws configure
AWS Access Key ID : XXXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key : YYYYYYYYYYYYYYYYYYYYYYYYYY
Default region name [None]: ap-northeast-1
Default output format [None]: 

IAM Managementでは、User Policyも追加します。Inline Policiesの作成を選んで、次の文字を入力します。

{
    "Statement": [
        {
            "Action": [
                "iam:DeleteServerCertificate",
                "iam:GetServerCertificate",
                "iam:ListServerCertificates",
                "iam:UpdateServerCertificate",
                "iam:UploadServerCertificate"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

これで証明書のアップロード関係の権限を与えています。

証明書をアップロードする

アップロードするコマンドは次のようになります。

$ aws iam upload-server-certificate \
          --server-certificate-name devrel.jp \
	      --private-key file://server.nopw.key \
		  --certificate-body file://server.crt \
		  --certificate-chain file://server.pem \
		  --path=/cloudfront/devrel.jp/
: server-certificate-name
管理上の一意のネーミングです。適当に分かりやすいものをつけましょう。

private-key 秘密鍵です。コツとしては、file:// をつける必要があります。なのでファイルがあるディレクトリまでいって実行するのが良いようです。

certificate-body 公開鍵です。

certificate-chain 中間証明書です。StartSSLの配布しているものを連結しています。

path パスは/cloudfront/ではじまっている必要があります。そうするとCloudFrontの設定にあがってきます。

このコマンドが通ると、次のようなレスポンスがあります。

{
    "ServerCertificateMetadata": {
        "ServerCertificateId": "AAAAAAAAAAAAAAAAAAA", 
        "ServerCertificateName": "devrel.jp", 
        "Expiration": "2016-04-15T00:21:22Z", 
        "Path": "/cloudfront/devrel.jp/", 
        "Arn": "arn:aws:iam::9999999999:server-certificate/cloudfront/devrel.jp/devrel.jp", 
        "UploadDate": "2015-04-15T13:14:23.046Z"
    }
}

もし間違えた場合には、

$ aws iam list-server-certificates

を実行してServerCertificateNameを確認し、

$ aws iam delete-server-certificate --server-certificate-name devrel.jp

のように実行して設定を削除できます。

CloudFrontの設定

ようやくCloudFrontの設定です。AWS CloudFront Management Consoleにいって、Create Distributionをクリックします。

注意点としては、

  • Origin Domain Nameは元々のS3バケットのStatic Website Hostingのアドレスを指定する(devrel.jp.s3-website-us-east-1.amazonaws.comなど)
  • Origin Pathは/
  • SSL Certificateで先ほど作成したSSL証明書を選択(アップロード時のpathが/cloudfront/ではじまっていればドロップダウンに出るはずです)。
  • Default Root Objectはたぶんindex.html

こんな感じで作成します。反映はしばらく(30分くらい?)かかるので気長に待ちましょう。Static Website Hostingのアドレスを設定するのは、サブディレクトリの表示がうまくいかないからです。

DNSの設定

サブドメインなしでS3上で配信している場合、Route 53を使っているかと思います。その場合、IPv4のエイリアスをCloudFrontのアドレス xxxxxxxxxxxxx.cloudfront.net に設定する必要があります。元々S3用の設定があると思いますので、それを削除して設定します。

注意点

CloudFrontのStatusが完了になれば、HTTPSでアクセスできるようになります。SNIベースの場合、注意点として全てのブラウザがサポートされていないという問題があります。Android 2.xは非対応なようです。また、Windows XP以前ではOSとして対応していないようです。iPhoneでもWebViewでは非対応なようです(via 株式会社チェンジイット » iPhoneの組み込みブラウザはSNI SSL証明書に対応していない)。

Amazonによると次のように書かれています。

SNI 独自 SSL は、Chrome バージョン 6 以降(Windows XP 以降、および OS X 10.5.7 以降で実行)、Safari バージョン 3 以降(Windows Vista 以降および Mac OS X 10.5.6 以降で実行)、Firefox 2.0 以降、Internet Explorer 7 以降(Windows Vista 以降で実行)などの最新のブラウザで機能します。

この辺りが許容できるかどうかが鍵になるかと思います。


CloudFrontの料金は1GBあたり0.140 USD、HTTPSリクエストが10,000件あたり0.0120 USDとなっています。ごくごく小さいサイトやコーポレートサイトをHTTPS環境下で提供したいと考える際にはぴったりではないでしょうか。

UPDATE

アップデートを受け取る

メールにてDevRelに関するニュース、アップデートをお送りします。

Contact is below.