【セキュリティ対策は大丈夫 ?】SSL証明書の新規発行、更新手順をまとめてみた。【POODLE, RC4, etc.】

こんにちは。TECH DRIVEの齋藤です。

先日、管理しているサイトのSSL証明書の期限が切れそうになっているのに気づき慌てて更新しました。

毎回思うのですがSSLの更新って結構面倒ですよね。
私自身も手順を忘れることがあるのでまとめてみました。

今回は更新でしたが新しくCSR*1を発行するので新規発行と手順にほぼ変わりはないです。

環境

  • OS - Amazon Linux
  • SSL認証局・種別 - COMODO・PositiveSSL
  • Web Server - Apache + OpenSSL
  • 証明書の販売サイト - SSLストア

 ※ 下記手順はCentOS、他の認証局でも使えるかと思います。

AWS Certificate Manager

AWS使っているならACM(AWS Certificate Manager) 使えよって思うかもしれません。

私も最初はACMを使おうと思いました。
ただACM利用には下の条件があります。

f:id:shoheis:20170313115403p:plain

今回設定するインスタンスはElastic Load Balancingを使っていませんでした。
なのでこれから書く手順が必要だったわけです。

バックアップをとる

運用しているサイトでSSL証明書の設定をする時は必ず事前にサーバーや編集するファイルのバックアップをして、いつでも元に戻せるようにしてから作業してください。

発行手順

  1. 証明書の購入(新規 or 更新)とアクティベート
  2. アクティベートに必要なCSRの作成
  3. ホスト証明書の設置
  4. 中間証明書の作成
  5. 中間証明書の設置
  6. SSLの設定
  7. セキュリティのテストと強化

証明書の購入とアクティベート

まずはお使いのSSLを管理しているウェブサイトで証明書を購入しましょう。
購入後は証明書のアクティベート(署名の申請)が必要です。

私はSSLストアというサイトを使っているので、証明書の購入とアクティベートは表の流れになりました。

項目 購入の参考サイト アクティベート
新規証明書の購入 こちら*2の手順7まで 左記「購入の参考サイト」の手順8から
更新用証明書の購入 こちら 新規証明書の「購入の参考サイトの手順8」から

またアクティベートの際にはCSRが必要になります。

CSRの作成

まずはCSR作成に必要なプライベートキーを作成します*3

サーバーに接続し、 /etc/pki/tls/private/ に移動しましょう。

$ cd /etc/pki/tls/private/

新しいプライベートキーを作成します*4

$ sudo openssl genrsa -out private.key 2048

プライベートキーにアクセス制限をかけます*5

$ sudo chown root.root private.key
$ sudo chmod 600 private.key

作成したプライベートキーを使いCSRを作成します。

$ sudo openssl req -new -key private.key -out csr.pem

CSR作成のための情報の入力します(下表はCSRの入力例)。

項目 意味
Country Name 国コード JP
State or Province Name 都道府県名 Tokyo
Locality Name 市区町村名 Chuo-Ku
Organization Name 組織名 Example Corp
Organizational Unit Name 部署名 Example Dept
Common Name コモンネーム*6 www.example.com
Email Address 管理者のメールアドレス someone@example.com

参考

アクティベート時に貼り付けるので作成したCSRの中身をコピーしておきましょう。

CSRが作成できたらそれを使ってアクティベート を完了します。
アクティベートが完了するとSSL認証局からメールが届きます。
メールに添付してある証明書(ウェブの管理画面からでもダウンロードできます)を設置していきましょう。

ホスト証明書の設置

ホスト証明書はCOMODOのPositiveSSLではメールでYour PositiveSSL Certificate となっているファイルです。 「www_example_co_jp.crt」のような名前かと思います。
/etc/pki/tls/certs に移動します。*7

$ cd /etc/pki/tls/certs

ホスト証明書をこのディレクトリにあげて*8、アクセス制限をかけます。

$ sudo chown root.root www_example_co_jp.crt
$ sudo chmod 600 www_example_co_jp.crt

ホスト証明書の設置は以上です。

中間証明書の作成

認証局によっては中間証明書(または、つなげて一つのファイルにする作業)が必要になります*9
つなげる際は順番が大事なようです(このままコピーして使えばOKです、中間証明書の名前は任意です)。

$ cat COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt > intermediate.crt

中間証明書の設置

再度サーバーに接続後、 /etc/pki/tls/certs に移動します。
中間証明書をこのディレクトリにあげて
ホスト証明書より緩い形ですが、アクセス制限をかけます。

$ sudo chown root.root intermediate.crt
$ sudo chmod 644 intermediate.crt

中間証明書の設置は以上になります。

SSLの設定

mod_ssl の設定ファイル/etc/httpd/conf.d/ssl.conf を編集します。
ssl.conf をエディタで開き、下記の設定を追加しましょう*10

SSLCertificateFile /etc/pki/tls/certs/www_example_co_jp.crt
SSLCACertificateFile /etc/pki/tls/certs/intermediate.crt

念のためhttpdの文法チェックをしておきましょう。

$ apachectl configtest

「Syntax OK」と出たらサーバーを再起動します。

$ sudo service httpd restart

SSLの設定は以上になります。


参考として、別のサイトではSSLの設定を下記のようにしていました。
場合によってはこの書き方をしないと設定できないのかもしれません。

SSLCertificateFile /etc/pki/tls/certs/www_example_co_jp.crt
SSLCertificateKeyFile /etc/pki/tls/private/private.key
SSLCertificateChainFile /etc/pki/tls/certs/intermediate.crt

これで「https」でサイトにアクセスできるようになっているはずです。

セキュリティのテストと強化

デフォルトの状態だとセキュリティが弱い場合があります。Qualys SSL Labs などを使用して現在のセキュリティの強さをチェックしましょう。


Amazon Linuxのデフォルトの設定だと下記の脆弱性に対処できていません。

  • POODLE脆弱性
  • RC4 暗号化方式の脆弱性
  • 前方秘匿性の欠落による脆弱性

私も最初にチェックした時はこのような状態でした(Future Grade やばいですね)。

f:id:shoheis:20170313200218p:plain

上から順に対処していきます*11

POODLE脆弱性

/etc/httpd/conf.d/ssl.conf を編集します。SSLProtocol ディレクティブをコメントアウトします。

# SSLProtocol all -SSLv2

その行のしたに下記を追加します。

SSLProtocol -SSLv2 -SSLv3 +TLSv1 +TLSv1.1 +TLSv1.2
RC4 暗号化方式の脆弱性、前方秘匿性の欠落による脆弱性

「前方秘匿性の欠落による脆弱性」の対処が「RC4 暗号化方式の脆弱性」の対処を含む形になるので、変更は1箇所で大丈夫です。
SSLCipherSuite ディレクティブを探し、コメントアウトされていた場合はそのままの状態でその下に下記を追加します。

SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA


また再起動の前にはhttpdの文法チェックをしておきましょう。

$ apachectl configtest

「Syntax OK」と出たらサーバーを再起動します。

$ sudo service httpd restart

この状態で再度Qualys SSL Labs でチェックしてみましょう。ランクが上がっているはずです。

f:id:shoheis:20170313200958p:plain

以上でSSL証明書の設定は完了になります。お疲れ様でした!

主な参考サイト

今回は特にAWSのチュートリアルにお世話になりました。セキュリティの強化(特にRC4と前方秘匿性)は前回の更新時にはわからなかったので助かりました。下記サイト以外にも様々なサイトの助けを得ながら設定しました。

*1:認証局に提出する署名リクエストです。作成にはプライベートキーが必要で、セキュリティ上長年同じプライベートキーを利用するのは好ましくないのでそのキーと合わせて再作成します。参考

*2:RapidSSLですがPositiveSSLと手順に変わりはありません。

*3: Amazon Linux をお使いの方かつ新規作成時は既存のホストキー 「/etc/pki/tls/private/localhost.key」 をプライベートキーとして使ってもOKです

*4: よりセキュリティの強いキーの生成方法もあります。参考

*5: すでに private.key の所有者はrootなはずなので chownはやらなくていいのですが念のため書いています

*6:ユーザーがブラウザに入力するウェブアドレス

*7: 元の自己署名ホスト証明書 localhost.crt がある場合はそれを /etc/pki/tls/certs ディレクトリから削除します。

*8: 自分は scp でアップロードしました。 参考

*9:COMODOのPositiveSSLでは必要でした。他の認証局では必要がないかもしれません。適宜調べてみてください。

*10: 更新時に「ホスト証明書や中間証明書、プライベートキー」の「設置場所・ファイル名」が、前回の設定時と変わらない場合はssl.confを編集する必要はありません

*11:詳細はこのページを参考にしてください

TECH DRIVEについて

TECH DRIVEは「技術者の成長を加速させる」をキーワードに都内で活動をしているコミュニティです。
TwitterやFacebookにて技術ネタやイベント情報の発信を行っていますので、ご興味があれば、いいねやフォローをお願いいたします。