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

長生村本郷Engineers'Blog

千葉県長生村本郷育ちのエンジニアが書いているブログ

無料SSL証明書発行しセキュリティでA+を取る! 〜Apache編〜

SSL Apache AWS

概要

ベリトランスモジュールバージョンアップに際して
SHA256で発行したSSL証明書が必須となりました。

テスト環境でベリトランスモジュールバージョンアップ試験を行う際に
SSL証明書導入する必要が生じました。

本番環境と同じ有料SSLを導入するまでとはいかずとも
近しい状況を構築する必要があったので無料SSL証明書を発行し導入しました。

上記の手順をまとめましたので以下に記載します。

環境

AWS Marketplace: CentOS 6 (x86_64) - with Updates HVM を利用しています。

手順

CSR生成

事前準備として、SSLインストール対象サーバで
CSRを生成しておきます。

SHA256 対応のCSR生成方法について以下ご参考ください。

kenzo0107.hatenablog.com

StartComに登録

ヘッダーメニューの Sign-up クリック

StartSSL

f:id:kenzo0107:20160224185554p:plain

必要事項登録し「send verification code」ボタンクリック

登録E-mail宛に verification codeが送付されます。

f:id:kenzo0107:20160224185554p:plain

こんな感じのメールが来ます。

f:id:kenzo0107:20160224190645p:plain

verfication codeを入力し登録完了

f:id:kenzo0107:20160224190947p:plain

SSL発行手続き

無料版選択

f:id:kenzo0107:20160224191318p:plain

SSLのWeb Server 用を選択

f:id:kenzo0107:20160225103836p:plain

f:id:kenzo0107:20160225103958p:plain

SSLインストール対象サーバのドメイン入力

f:id:kenzo0107:20160225104510p:plain

メール送信による認証

f:id:kenzo0107:20160225105201p:plain

startSSL側で指定するメールアドレスで受信可能な状態にする必要があります。

ec2インスタンスのメール受信設定は以下記事が参考になりました。ありがとうございます。

AWS上のpostfixでメールを受信してみる · mechamogera/MyTips Wiki · GitHub

上記記事中の注意点として インスタンス作成直後に yum update 分にはいいですが
時にAWSyum update をするとkernel panicを起こすことがあります。
pythonyumでなくソースから独自に入れ直したり、色々してたせいか...

原因は追い切れていませんが、経年運用したインスタンスについては yum update は控えたいと思います。

うまく受信設定できない場合
  • /var/log/maillog を 常に tailしてログ確認。

  • 受信可能なメールアドレスが既にあれば aliases で向け先変える。 postmaster@(domain) → root@(domain)

  • メールボックスで Permission denied で
    受信メールを保存できない場合は以下強引にメールディレクトリを変更する。

/etc/postfix/main.cf

- home_mailbox = Maildir/
+ home_mailbox = ../home/ec2-user/Maildir/

SSL証明書 注文へ進む

メール受信による認証がクリア後、SSL証明書注文へ進みます。

f:id:kenzo0107:20160225114419p:plain

認証情報作成

f:id:kenzo0107:20160225114811p:plain

情報入力後、 (domain).zip がダウンロードされる。 ※ 今回は WebServer が Apache なので ApacheServer を参照します。

f:id:kenzo0107:20160225115225p:plain

解凍した zipファイルの ApacheServer 内の以下2ファイルを任意のディレクトリにアップしましょう。

  • 1_root_bundle.crt
  • 2_(domain).crt

今回アップ先ディレクトリは server.key 等のあるパス (/etc/httpd/conf/ssl.csr/) にします。

ssl.conf設定

SSL証明書のインストールとは
Apacheの設定ファイルとして指定ディレクティブで読み込ませる
ことです。

主な設定は以下です。

Item Value Explain
SSLCertificateChainFile /etc/httpd/conf/ssl.csr/1_root_bundle.crt 中間証明書
SSLCertificateFile /etc/httpd/conf/ssl.csr/2_(domain).crt SSLサーバ証明書
SSLCertificateKeyFile /etc/httpd/conf/ssl.csr/server.key SSLサーバ証明書とペアになる秘密鍵

以下URLで各WebServerとopensslバージョンにより最適な設定方法を示唆いただけます。
https://mozilla.github.io/server-side-tls/ssl-config-generator/

/etc/httpd/conf.d/ssl.conf

LoadModule ssl_module modules/mod_ssl.so

Listen 443

AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl    .crl

SSLPassPhraseDialog  builtin


SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout  300


#SSLMutex default
Mutex default ssl-cache

SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
#SSLRandomSeed startup file:/dev/random  512
#SSLRandomSeed connect file:/dev/random  512
#SSLRandomSeed connect file:/dev/urandom 512

SSLCryptoDevice builtin

<VirtualHost _default_:443>

  DocumentRoot "/var/www/html"
  ServerName (domain):443

  ErrorLog /var/log/ssl_error_log
  TransferLog /var/log/ssl_access_log
  LogLevel warn

  SSLEngine on
  SSLCertificateFile /etc/httpd/conf/ssl.csr/2_(domain).crt
  SSLCertificateKeyFile /etc/httpd/conf/ssl.csr/server.key
  SSLCertificateChainFile /etc/httpd/conf/ssl.csr/1_root_bundle.crt


  <Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
  </Files>
  <Directory "/var/www/cgi-bin">
    SSLOptions +StdEnvVars
  </Directory>


  SetEnvIf User-Agent ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

  CustomLog logs/ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

  <Directory "/var/www/html">
    AllowOverride All
    Options -Indexes +FollowSymLinks +Includes +ExecCGI
    Order allow,deny
    Allow from all
  </Directory>

</VirtualHost>

SSLProtocol all -SSLv2 -SSLv3

SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS

SSLHonorCipherOrder on

SSLCompression off
SSLSessionTickets off

パフォーマンスチューニングを一切していません。
あくまで SSL証明書インストールを対象としていますのでご注意ください。

設定ファイルの構文確認

// 構文チェック
# httpd -t

// 構文エラーがない場合は以下のように表示されます。
Syntax OK 

構文エラーが発生している場合は対象箇所が表示されますのでチェックし直してください。
但し、構文エラーがないからと言ってApache再読み込み時にエラーが発生しないとは限らないので
万が一の為、即元に戻せるようなコマンドを作っておくと良いでしょう。

例えば
ssl.conf を ssl.conf.bk にリネームして Apacheの設定ファイルとして見ないようにさせるなど。

Apache 設定ファイル再読み込み

# service httpd reload
Reloading httpd:             [  OK  ]

ブラウザからアクセス

Chromeでアクセスしました。

f:id:kenzo0107:20160225122555p:plain

  • 認証の詳細な情報

f:id:kenzo0107:20160225123052p:plain

セキュリティチェック

以下サイトで診断できます。
QUALYS SSL LABS

「A」が取れました!

f:id:kenzo0107:20160225130720p:plain

ちなみに 常に https通信で問題ないサイトであれば以下のように設定すると

<VirtualHost *:443>
  ...
  Header always set Strict-Transport-Security "max-age=15768000"
  ...
</VirtualHost>

「A+」取得できました!

f:id:kenzo0107:20160225131401p:plain

常時httpsはセキュアではありますがサイトの仕様次第なところもあるので状況によりけりです。

以上