こんにちは。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利用には下の条件があります。
今回設定するインスタンスはElastic Load Balancingを使っていませんでした。
なのでこれから書く手順が必要だったわけです。
バックアップをとる
運用しているサイトでSSL証明書の設定をする時は必ず事前にサーバーや編集するファイルのバックアップをして、いつでも元に戻せるようにしてから作業してください。
発行手順
証明書の購入とアクティベート
まずはお使いの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 やばいですね)。

上から順に対処していきます*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 でチェックしてみましょう。ランクが上がっているはずです。

以上で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 ディレクトリから削除します。
*9:COMODOのPositiveSSLでは必要でした。他の認証局では必要がないかもしれません。適宜調べてみてください。
*10: 更新時に「ホスト証明書や中間証明書、プライベートキー」の「設置場所・ファイル名」が、前回の設定時と変わらない場合はssl.confを編集する必要はありません
まずはお使いの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 やばいですね)。
上から順に対処していきます*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 でチェックしてみましょう。ランクが上がっているはずです。
以上で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 ディレクトリから削除します。
*9:COMODOのPositiveSSLでは必要でした。他の認証局では必要がないかもしれません。適宜調べてみてください。
*10: 更新時に「ホスト証明書や中間証明書、プライベートキー」の「設置場所・ファイル名」が、前回の設定時と変わらない場合はssl.confを編集する必要はありません