httpsとSSLサーバ証明書の説明

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サーバ証明書の年次更新作業が、やや高い頻度で発生するので、まずは仕組みをしっかり理解しましょう。

タイトルとURLをコピーしました