読者です 読者をやめる 読者になる 読者になる

アトラシエの開発ブログ

株式会社アトラシエのブログです

google compute engineでSSLを有効化するまで[Rapid SSL]

HTTPSが必要になったので、SSL証明書の購入、その有効化までをやってみました。

SSL証明書の購入

SSL証明書RapidSSLとかGlobalSignのような大手がその発行元になるのですが、購入自体はそれ以外の代理店からもできて、むしろ代理店経由のほうが一般的に安く手に入るようです。 いくつか見た中で私はRapidSSLワイルドカード版がほしいなと思ったので、それが安く手に入る代理店を探しました。 なぜRapidSSLかというと、他にもいろいろな認証局はありますが安い証明書というジャンルで一番知名度があるように思ったからです。微妙な言い回しですが、安さだけならもっとほかにも安いのはあったので、そっちを選択してもいいかもしれません。

購入はこちらから行いました。お名前comとか、管理画面めちゃくちゃうざいですがここのサイトは管理画面がbootstrapで組んであって、フランクで使いやすかったです。

www.ssl-store.jp

秘密鍵CSRを作成する

$ openssl genrsa -des3 -out server.key 2048
enerating RSA private key, 2048 bit long modulus
....................................................................................................................................................................................+++
..................................................................................+++
e is 65537 (0x10001)
Enter pass phrase for server.key:  //パスフレーズの入力
Verifying - Enter pass phrase for server.key: //確認

この秘密鍵をもとにCSRの作成を行います。このCSRは署名要求というもので、この署名要求をもとに認証局が証明書を発行するわけです。

$ openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP //国名を入力
State or Province Name (full name) [Some-State]:Tokyo //都道府県を入力
Locality Name (eg, city) []:Minato  //市区町村を入力
Organization Name (eg, company) [Internet Widgits Pty Ltd]:XXX //会社名を入力
Organizational Unit Name (eg, section) []: //空エンターでOK
Common Name (e.g. server FQDN or YOUR name) []:*.domain.com //**最も重要。ワイルドカードの指定を忘れずに。**
Email Address []:admin@domain.com //連絡先を入力

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: //空エンターでOK
An optional company name []: //からエンターでOK
$ cat server.csr //作成の確認
-----BEGIN CERTIFICATE REQUEST-----
asdfasdf
asdfasdf
-----END CERTIFICATE REQUEST-----

で、表示された文字列を先ほどのSSLstoreの管理画面から入力して、署名要求と(基本的に)同じ情報を入力して申請します。 ただ、ssl storeのフォームに署名要求の入力事項にないものもありました。

f:id:attracie:20151003191240p:plain

で、ドメインに間違いがないか確認して送信します。これで代理店がRapidSSL側のAPIか何かを叩くみたいで、geotrust(RapidSSLの会社)からメールが来ます。

f:id:attracie:20151003191712p:plain

メール中のURLをクリックするとgeotrust側の最終確認画面が出るので、間違いがないかチェックします。

f:id:attracie:20151003192248p:plain

承認すると5分〜10分ぐらいで代理店からメールで証明書が送られてきました。(メールで証明書送っていいのかな笑?)

この本文にはSSLサーバ証明書中間CA証明書の2つが含まれています。とりあえず実務上はこの2つがセットで必要なんだとおぼえておけば十分のようです。さらに先ほどCSRのために作成した秘密鍵もとっておく必要があります。 詳しい仕組みについては解説があるので参照してください。

Webセキュリティー入門: 第2回「さらに知りたいセキュリティー(SSL)の仕組み」

サーバのSSLを有効化する

サーバはapache2を使っている前提です。

$ sudo a2enmod ssl
$ sudo service apache2 restart
$ sudo nmap -p 443 localhsot
Host is up (0.000033s latency).
Other addresses for localhost (not scanned): 127.0.0.1
PORT    STATE SERVICE
443/tcp open  https

portが開放されていなければfirewallをチェックしてください。compute engineだとインスタンスの編集画面からhttpsを有効化するチェックボックスがあります。

パスフレーズを無効化する

先ほどパスフレーズ付きの秘密鍵を作っていますが、このままだとapache起動時に毎回パスフレーズの入力が必要なのでパスフレーズがないバージョンのものを作ってこちらを参照します。

$ cp secret.key secret_original.key
$ openssl rsa -in secret.key -out secret.key  //この生成のときにパスフレーズが求められる

apacheのconfで秘密鍵、中間証明書、証明書を指定する

apacheのバージョンによってここの指定方法は異なりますが、私のcompute engineに標準で入っていたバージョンは2.2.22でした。

$ sudo apachectl -v
Server version: Apache/2.2.22 (Debian)
Server built:   Dec 23 2014 22:48:32

apache2のバージョンによっては以下のconfファイルの指定方法はけっこう異なるようです。

qiita.com

<VirtualHost *:80>
  DocumentRoot /path/to/rails-app/public
  Redirect permanent / https://xxx.yyy.me/
</VirtualHost>

<VirtualHost *:443>
  SSLEngine on
  SSLCertificateFile /path/to/server.crt //証明書
  SSLCertificateKeyFile /path/to/secret.key //パスフレーズなしの秘密鍵
  SSLCertificateChainFile /path/to/chain.crt //中間証明書
  SetEnv SECRET_KEY_BASE secret
  DocumentRoot /path/to/rails-app/public 
</VirtualHost>

あとはapacheをリロードすればhttpsで接続可能になりました。上記のリダイレクトはルートはもちろん、サブディレクトリへのアクセスも適切にリダイレクトしてくれます。 (例) http://xxx.yyy.me/hoge => https://xxx.yyy.me/hoge

f:id:attracie:20151003201755p:plain