Web開発の基本知識の一つ、httpsプロトコルについて説明します。Web開発では、Webブラウザ・httpsを使用してシステムを構築するのが一般的です。httpsに関する知識が不十分だと、SSLサーバ証明書なしのエラーがでたり、本番環境・テスト環境で異なるSSLサーバ証明書を使っているときに、想定外の画面動作となり戸惑うことになります。典型的なトラブル時の対処方法についてもまとめましたので、一読下さい。
httpとhttpsの違い
http(Hyper Text Transfer Protocol)とは、サーバ上の情報をクライアントPCとやり取りする際の通信規約です。https(Hyper Text Transfer Protocol Secure)は、そのhttpをSSL技術と組み合わせ、セキュリティを強化したものです。
昨今、セキュリティ面の強化策を行うのは当然の状況となっており、httpを使うケースはほとんどありません。https利用を前提として、Web開発を行うものと覚えておきましょう。
httpsの仕組み
httpsは、SSLサーバ証明書という暗号化ファイルを使って、アクセス先サーバが信頼できるか(悪意のあるサーバでないか)を確認します。あらかじめ、サーバとクライアントPCのそれぞれに対となるSSLサーバ証明書をインストールしておきます。そして、クライアントPCはサーバと通信する際、サーバからSSLサーバ証明書をもらって、自分のPCに保存されているSSLサーバ証明書と突き合わせすることで、そのサーバが正しいサーバであることを確認します。
SSLサーバ証明書の説明
まず、SSLサーバ証明書は、サーバーに配置する証明書、クライアントPCに配布する証明書をセットで用意します。windows系の場合、前者のサーバーに配置する証明書は拡張子pfxのファイル、後者のクライアントPCに配布する証明書は拡張子cerまたはcrtのファイルになります。一般的には、クライアントPCに配布する証明書は拡張子cerですが、cerとcrtのファイルは、動作上はまったく同じように動きますので、同じものと捉えてもらって問題ないです。
SSLサーバ証明書の入手方法
専門の会社から、SSLサーバ証明書を購入するケースが多いです。有料で1年ごとに更新するケースが一般的です。信頼のある専門の会社が発行したSSLサーバ証明書を利用することで、自社のWebサイト/サーバーが安全であることを利用者に示せます。
一方で、無料のSSLサーバー証明書として、Lets’Encrypt、自己署名証明書があります。
Lets’Encryptは、全てのWebサイトの暗号化を目指す米国の非営利団体であるISRG(Internet Security Research Group)により運営されています。詳しくはLets’Encryptのホームページをご確認下さい。
自己署名証明書とは、自前で証明書を作成するということです。通称、オレオレ証明書とも呼びますが、実は、SSLサーバー証明書自体は、比較的簡単に作ることができます。ただし、第3者による保証がないため、顧客向けのWebシステムでは使いません。安全な社内イントラネットで利用者が社内ユーザー限定のWebシステムや、テスト環境サーバーに対して使います。
自己署名証明書の作り方
Windows上での自己署名証明書の作成方法について説明します。作成用のコマンドは何パターンかありますが、ここでは主流であるOPENSSLとpowershellの2つについて説明します。どちらも最終的にサーバーに配置するpfxファイル、クライアントPCにインストールするcerまたはcrtファイルを生成する点は同じです。
作成後、pfxファイルはサーバーのhttpsプロトコルの受け側、標準だとポート番号443に配置して下さい。cerまたはcrtファイルは、WindowsであればActive Directoryのグループポリシー機能などで、全てのクライアントPCにインストールしてください。
OPENSSLコマンドでの作成方法
手順1
まず、事前準備として、opensslの設定ファイル(openssl.cnf)を修正し、「サブジェクト代替名(SAN:Subject Alternative Names)」の定義を追加します。
openssl.cnfの最終行に以下を追記。
[SAN]subjectAltName = @alt_names [alt_name]
DNS.1 = test1
DNS.2 = test2
手順2
コマンドプロンプトを管理者権限で起動します。管理者権限で動かすには、コマンドプロンプト起動時に右クリックして「管理者として実行する」を選びます。
次に以下のコマンドで、拡張子.keyファイル(秘密鍵)と、拡張子.crtファイル(SSLサーバ証明書)を作成します。引数はサンプル用ですので、適宜、修正して下さい。また、-keyout、-outの値は、フルパス表示にして下さい。(例:C:\Users\userA\Desktop\test.key、C:\Users\userA\Desktop\test.crt)
openssl req -newkey rsa:2048 -keyout “(ファイルパス/ファイル名).key” -x509 -nodes -out “(ファイルパス/ファイル名).crt” -subj “CN=test,OU=UserAccounts,O=company,C=JP” -reqexts SAN -extensions SAN -config “(opensslへのパス)\openssl.cnf” -days 1800 -sha256
手順3
次に拡張子.keyファイルと、拡張子.crtファイルを使い、pfxファイルを作成します。このコマンド実行時、パスワード入力を求められるので設定します。
openssl pkcs12 -export -inkey “(ファイルパス/ファイル名).key” -in ”(ファイルパス/ファイル名).crt” -out “(ファイルパス/ファイル名).pfx”
powershellでの作成方法
手順1
まず、powershellを管理者権限で起動します。管理者権限で動かすには、powershell起動時に右クリックして「管理者として実行する」を選びます。
それから、以下のコマンドで、cerファイルを作成して、PCにインストールします。引数はサンプル用ですので、適宜、修正して下さい。
$cert = New-SelfSignedCertificate -Type SSLServerAuthentication -Subject “CN=test,OU=UserAccounts,O=company,C=JP” -DnsName “test1″,”test2” -CertStoreLocation “cert:\LocalMachine\My” -KeyDescription “Self-signed certificate” -KeyExportPolicy Exportable -NotAfter (Get-Date).AddYears(5)
手順2
cerファイルが正しくインストールされたか確認します。Windows左下の入力欄かコマンドプロンプトで、cerlm.mscを実行。証明書(ローカルコンピューター)→個人→証明書の下に作成したcerファイルの証明書があることを確認します。
手順3
作成したcerファイルを出力します。-FilePathの値は、フルパス表示にして下さい。(例:C:\Users\userA\Desktop\test.cer)
Export-Certificate -Type CERT -Cert $cert -FilePath “(ファイルパス/ファイル名).cer”
手順4
cerファイルと対になるpfxファイルを作成します。まず、パスワードを暗号化した後、その暗号化パスワードを用いてpfxファイルを作ります。
$password = ConvertTo-SecureString -String “(パスワード)” -AsPlainText -Force
Export-PfxCertificate -Cert $cert -Password $password -FilePath “(ファイルパス/ファイル名).pfx”
Chrome58以降のSSLサーバ証明書作成時の注意点
生成されたcerファイルを開き、詳細で確認すると、「サブジェクト」「サブジェクト代替名」という項目があることが確認できます。Chromeではバージョン58以前は「サブジェクト」を見てサーバー名を確認していましたが、バージョン58以降は「サブジェクト代替名(SAN:Subject Alternative Names)」を見てサーバー名を確認する仕様に変更されています。従って、Chrome用にSSLサーバ証明書を作成する場合、「サブジェクト代替名」をセットしないと、信頼あるサーバとは見做されませんので注意が必要です。
開発・保守時のSSLサーバ証明書関連トラブルの対処法
典型的なSSLサーバー証明書関連のトラブルと対処法について何点か書きます。
本番・テスト環境の違いを意識できていない
SSLサーバ証明書は通常、サーバ毎に別々の証明書を用意します。従って、本番環境とテスト環境は普通、サーバが異なりますので、別々のSSLサーバ証明書を用意することになります。SSLサーバ証明書は、サーバ・クライアントPCそれぞれに配置しますが、クライアントPCに配置するSSLサーバ証明書は、上述の通り、本番環境・テスト環境が異なりますので、環境差異が生まれる点に注意する必要があります。この環境差異を意識しないと、ユーザー受入テストや本番リリース時、間違ったSSLサーバ証明書をユーザーのクライアントPCに配布してしまい、その結果、サーバが信頼できない旨のワーニング・エラーが出ます。
無理やりSSLサーバ証明書をインストールする方法
次に、テストの際、テストサーバーのSSLサーバー証明書がテスト用のクライアントPCに配布されていないケースを考えます。もちろん、SSLサーバー証明書をもらってクライアントPCにインストールしてもよいのですが、SSLサーバー証明書が信頼されないワーニング・エラーが確認できた時点で、以下の手順で、無理やりそのSSLサーバー証明書をクライアントPCにインストールする方法もあります。
手順1
Webブラウザとして、EdgeやChromeでは、アドレスバーの左側に鍵マークがあるのが確認できると思います。ワーニング・エラーの際も、ここにそれを示す文言が表示されますが、まずはこちらをクリックします。
手順2
「証明書(無効)」をクリックし、証明書画面を開きます。上部に「全般」・「証明」・「詳細のパス」の3つのタブが出ますので、証明を選び、右下の「ファイルにコピー」を選択します。
手順3
「次へ」を選択後、「DER」または「BASE64」を選択し、デスクトップなどにファイルを保存。このファイルが、ワーニング・エラーの元となった、サーバからダウンロードされて、クライアントPCに未配布のSSLサーバ証明書です。次に、このSSLサーバ証明書をクライアントPCにインストールします。
手順4
手順3で保存したファイルを開き、証明書のインストールを選択、「現在のユーザーを選択」後、「証明書をすべて次のストアに配置する」を選び、参照ボタンを押下。適当なフォルダを選択してOKを押し、完了します。「このサーバ証明書を本当に信頼しますか?」といったワーニングがでますが、自社サーバで信頼できるのは明らかですので、はいを選択して、インストール完了です。Webブラウザを一度閉じて、再度、サーバにアクセスしたら、証明書エラーは出ないはずです。
上位の認証局が信頼されなくなるケース
ルート認証局を運営している会社が、仕事を他社に譲渡するなどで、そのルート認証局に紐づく下位のSSLサーバー証明書が信頼をなくすといったケースがあります。この場合は、事前に運営会社から連絡があるはずですので、SSLサーバー証明書が継続して信頼されるよう技術的な対応を行います。
まとめ
SSLサーバ証明書の作成コマンドは複雑ですが、不慣れな内は、あまり深く考えず、ご紹介したコマンドを真似して作ってみるのがよいと思います。実際のシステム開発では、証明書エラー時の対処や、SSLサーバ証明書の年次更新作業が、やや高い頻度で発生するので、まずは仕組みをしっかり理解しましょう。