SSLサーバー証明書をWebサーバ(Apache)に設置/更新する方法と手順を詳しく解説します。
- SSLサーバー証明書をWebサーバに設置(更新)する手順がわかります
SSLサーバー証明書のファイル形式
認証局から発行された証明書を代理店から受領します。
その際にファイル形式に注意しないといけません。
SSLサーバー証明書のファイル形式
認証局や代理店によって多少異なりますが一般的には下記のSSLサーバー証明書のファイル形式があります。実際にはもっと多岐にわたります。
- X.509証明書ファイル
- PKCS証明書ファイル
X.509証明書ファイル
- pem形式
Apacheなどで利用する最も一般的な形式 (拡張子は.pem、.crt、.cer、key) - DER形式
(拡張子は.der、.cer)
PKCS証明書ファイル
- PKCS7/P7B
1つのファイル内にサーバー証明書や秘密鍵、中間証明書を含めることができます。
Microsoft IISやTomcatなどで主に使用されます。
(拡張子は.spc、.p7a、.p7b、.p7c) - PKCS12/PFX
1つのファイル内にサーバー証明書や秘密鍵、中間証明書を含めることができます。
Windowsで秘密鍵と証明書のインポート/エクスポート用として使用されます。
(拡張子は.pfx、.p12 )
PKCS証明書ファイルをX.509のファイル形式に変換することもできますが、かなり面倒なのでWebサーバの環境を事前に確認する必要があります。
PKCSファイルからX.509ファイルに変換して取り出す方法
PKCS証明書ファイルからX.509証明書ファイルに変換して取り出すこともできます。
下記のコマンドは一例です。※全てrootで実行します。
証明書の取りだし
openssl pkcs12 -in 【PKCS12形式証明書】.pfx -out 【任意の証明書ファイル名】.pem -nodes
秘密鍵だけの取り出し
openssl pkcs12 -in 【PKCS12形式証明書】.pfx -out 【任意の秘密鍵ファイル名】.key -nodes
pkcs7の場合
openssl pkcs7 -outform pem -in 【PKCS7形式証明書】.p7b -out 【任意の証明書ファイル名】.pem -print certs
他にもWindowsの証明書エクスポートウィザードを利用して Base 64 encoded X.509(.CER)形式で出力(エクスポート)することも出来ます。
SSLサーバー証明書を設置(更新)する手順
先ずSSLサーバー証明書の有効期限やCN(ドメイン名)に問題が無いことを確認します。
SSLサーバー証明書の有効期限とコモンネームを確認
以降はすべてLinux OSのApache環境での手順になります。
証明書ファイル一式の保存先はApacheの証明書の保存ディレクトリです。
通常はApacheのconfディレクトリになります。
rootでログインして下記のコマンドを実行します。
openssl x509 -text -noout -in 【証明書ファイル名】| egrep -w "Subject:|Issuer:|Not After|Not Before|DNS" > Issuer: C=○○ ST=○○ L=○○ O=○○ CN=○○ > Not Before ○○ ○○ 00:00:00 2022 GMT > Not After ○○ ○○ 23:59:59 2023 GMT > Subject: CN=○○ > DNS=○○
# openssl x509 -text -noout -in 【証明書ファイル名】| egrep -w “Subject:|Issuer:|Not After|Not Before|DNS”
> Issuer: C=○○ ST=○○ L=○○ O=○○ CN=○○
> Not Before ○○ ○○ 00:00:00 2022 GMT
> Not After ○○ ○○ 23:59:59 2023 GMT
> Subject: CN=○○
> DNS=○○
- Not Beforeは有効開始日
- Not Afterは有効期限
- CNはコモンネームの略でドメイン名
SSLサーバー証明書と秘密鍵がペア(合致)になっていることを確認
Modulusを比較して証明書と秘密鍵がペアになっていることを確認するコマンドです。
rootでログインして下記のコマンドを実行します。
diff <(openssl rsa -noout -text -in 【秘密鍵ファイル】-modulus |grep Modulus) <(openssl x509 -noout -text -in 【証明書ファイル】-modulus |grep 'Modulus')
# diff <(openssl rsa -noout -text -in 【秘密鍵ファイル】-modulus |grep Modulus) <(openssl x509 -noout -text -in 【証明書ファイル】-modulus |grep ‘Modulus’)
何も表示されなければOKです。
もし何かしら文字が表示された場合はサーバー証明書と秘密鍵が合致していないので確認する必要があります。
サーバーと証明書と中間証明書のチェーンが正しいことを確認
中間証明書とサーバー証明書のチェーンが正しいことを確認します。
rootでログインして下記のコマンドを実行します。
diff <(openssl x509 -issuer_hash -noout -in 【証明書ファイル】) <(openssl x509 -subject_hash -noout -in 【中間証明書ファイル】)
# diff <(openssl x509 -issuer_hash -noout -in 【証明書ファイル】) <(openssl x509 -subject_hash -noout -in 【中間証明書ファイル】)
何も表示されなければOKです
証明書一式をディレクトリに移動(設置)する
# cd 【証明書ファイル一式を設定するディレクトリ】
※サーバーによってディレクトリは異なりますが通常はconfになります。
証明書と秘密鍵をコピーして設置します。※必要に応じて中間証明書も設置
Apacheの構文チェック
Apacheの構文チェックを実施
#○○ configtest
※利用しているOSとApacheのバージョンによりコマンドは異なります
Apache再起動
Apacheを再起動します。
#○○ reload
※利用しているOSとApacheのバージョンによりコマンドは異なります
Apacheを再起動しないと新しい証明書は有効になりません
※再起動しないと古い証明書のままです
証明書を確認
Webブラウザを開いて証明書を確認します。
外部の証明書確認ツールを使ってより詳細に確認することもできます。
デジサートのSSL証明書チェッカー
https://www.digicert.com/help/
Qualys SSL Labs社のSSL Server Test(SSL脆弱性診断)ツール
https://www.ssllabs.com/ssltest/
もし、URLにアクセスしてもリダイレクトなどでhttps接続にならない場合はURLの後ろに/robot.txtを付けてアクセスするとhttps通信になります。
この方法は他の事態にも応用可能です。
CDN利用などで証明書が確認できないときは直接Webサーバにアクセスする
CDN等を利用していてインターネット経由で確認できない場合は、PC端末のhostsファイルにドメインとWebサーバのIPアドレスを記載することで、直接WebサーバにアクセスするようになるのでWebブラウザで確認することができます。
Windowsのhostsファイルの保存フォルダはC:¥Windows\System32\drivers\etcです。
hostsファイルには下記のようにWebサーバのIPアドレスと、ドメイン名を記載します。
WebサーバのIPアドレス yublog.jp
CDN経由だとWebサーバの証明書を設置(更新)しても情報が反映されないため、Webブラウザで確認しても有効期限や証明書の内容が以前のままで置き換わりません。なぜならCDN側の情報を見ているからです。
この場合はPC端末にWebサーバのIPアドレスを指定して直接Webサーバの情報を参照しないと証明書が更新されたことが確認できません。
以上で証明書の設置作業は完了です。
サーバー証明書の設置も更新もまったく同じ手順になります。
更新時は念のため旧証明書と秘密鍵ファイルのバックアップを取得後に新しいファイルに上書きする手順を追加すればOKです。
まとめ
当記事ではLinux OSのOpensslコマンドを使用した証明書の内容確認と秘密鍵との合致の確認方法などを載せました。
当記事に載せたOpensslコマンドは、Linxu OSの種類やApacheのバージョン、ディレクトリ構成の違いには基本的には影響されませんが、それ以外のApacheの再起動コマンドなどは適宜変更する必要があるので注意してください。
サーバー証明書と秘密鍵の中身はテキストファイルなので設置や更新はファイルを設置する、または置き換えるだけ済むので難しくありません。