Chrome58になると自己署名の証明書がエラーになるので、OpenSSLに詳しくなった話

技研の「むらたん」です。

自己署名のSSL証明書(通称、オレオレ証明書)を設定したRedmineを利用している部署より、問い合わせを受けるようになりました。
「証明書がエラーになり、ページ遷移するたびに、警告画面が表示されるんだけど・・・」と。
原因はこちらにある、コモンネームの非推奨化によるもので、SANsの設定をしないとエラーとなるようです。

自分で証明書を作る際は「OpenSSL」を使うことが多いかと思いますが、部署ごとに多様な使い方をしており、色々と調べることになりました。

取り急ぎ、Chrome58でお困りの皆様へ

SANつき証明書の再発行手順

(1)openssl.cnf ファイルを編集します。書式は以下の通りです。

  • [ ]で囲まれているのが設定のカテゴリ
  • 設定はKEY = VALUEで定義
  • # 以降はコメント

修正箇所は以下のとおりです。

  • [ req ] カテゴリ内のreq_extensions のコメントを解除する
  • [ usr_cert ] カテゴリ内のauthorityKeyIdentifier の設定をkeyid,issuer:always とする
  • [ usr_cert ] カテゴリ内のsubjectAltName のコメントを解除し、設定を@alt_names とする
  • [ v3_req ] カテゴリ内にsubjectAltName を追加し、設定を@alt_names とする
  • [ v3_ca ] カテゴリの前に [ alt_names ]カテゴリを追加する
  • [ alt_names ]カテゴリ内に DNS.1 を追加し、ドメイン名を書く、あるいは IP.1 を追加し、IPアドレスを書く

(2)設定で証明書を再発行してください。
これまで、社内に公知していた手順はCA局の開設とサーバ証明書の発行手順でしたが、
やりかたを調べると、opensslコマンドの手順もあれば、CAコマンドの手順もある。
opensslコマンドであれば、引数で色々な設定もできるが、対話型手順で発行する例もある。

そもそも、先程の設定ファイルは一体何を設定しているのかもよく分かっていない。
ということで、調べた結果をまとめます。

そもそも、SSLって何?

Secure Socket Layerの略で最近はTLS(Transport Layer Security)になっており、導入するメリットは2つ。

  • 第三者が保証した通信相手の妥当性が分かる
  • 通信内容が暗号化できる

第三者と言われているのが認証局 (CA:Certification Authority)ってやつです。
「あなたの通信先は、間違いなくXXX社のWebサイトです。YYY社が保証します!」のYYY社が認証局。
有名どころであれば、「シマンテック・ウェブサイトセキュリティ(旧日本ベリサイン)社」「GMOグローバルサイン‎社」でしょうか。
Webサイトを運営している方は、第三者に保証してもらわないとサイト訪問者のブラウザに警告が表示され、「不正なサイトの可能性あり」と表示されてしまいます。権威のある認証局に署名してもらったSSL証明書をWebサーバに設定し、安全な通信先であること、暗号通信が用いられていることをサイト訪問者に知らせています。

OpenSSLを使う

有名どころの認証局から「お墨付き」の証明書を発行してもらうには費用が掛かるため、社内システムでのSSLの利用(第三者の保証は要らないが、通信の暗号化はしたい)といった際に導入する敷居が高いです。
このようなとき、Let’s Encryptのような無償サービスの利用やOpenSSLを利用し、自らが認証局を立てて証明書に署名をすることもできます。
このOpenSSLが引数に応じて色々と出来てしまうことや、煩雑な引数を簡素化するスクリプトを提供しているので、それぞれのコマンドやシェルの意味を理解しないと良く分からないことになります。

※ここで語らないこと
– SSL通信は公開鍵暗号方式を用いて、暗号化を実現しています。このあたりの教科書的な話は調べれば沢山出てくるので今回は割愛します。
– opensslの導入手順についても調べれば沢山出てくるので今回は割愛します。
– Let’s Encryptについては、以前のエントリーで紹介しています。

作業の流れ

まずは、証明書発行の流れを理解しましょう。

  • 認証局にて
    • 認証局の開設 … 認証局としての情報を登録し、認証局自身の秘密鍵と公開鍵のペアを生成する
  • Webサーバにて
    • サーバ証明書の発行 … サーバ証明書となる秘密鍵と公開鍵のペアを生成する
    • 証明書署名要求の発行 … 認証局に対して、発行したサーバ証明書を「お墨付き」にしてもらえるように要求する
    • Webサーバへの登録 … お墨付きのサーバ証明書をWebサーバに設定し、SSL通信を可能にする
  • 必要に応じて、Webサーバにて
    • クライアント証明書の発行 … クライアントのアクセス制限を行う場合、クライアント証明書となる秘密鍵と公開鍵のペアを生成する
    • 証明書署名要求の発行 … 認証局に対して、発行したクライアント証明書を「お墨付き」にしてもらえるように要求する
  • クライントPCにて
    • 認証局の証明書のインストール … ブラウザに開設した認証局の正当性を認識させる
    • 必要に応じて、クライアント証明書のインストール … クライアントのアクセス制限を行う場合、クライアント証明書となる秘密鍵と公開鍵のペアを生成する

opensslの使い方

  • コマンドの使い方はこちらが詳しいです。
  • スクリプトの使い方はこちらが詳しいです。

ハマりどころ

ここでは証明書の発行時に陥りがちなポイントと対処方法を紹介します。
※ 便宜上、opensslのインストール先を/etc/pki/とします。

  • スクリプトで認証局を再構築できない!
    • 以前に作成した認証局のファイルが存在するとコマンドがスルーされるので、ファイルを削除してください。(/etc/pki/CA/.pem /etc/pki/CA/private/ /etc/pki/CA/newcert/*)
    • 既発証明書にデータを初期化してください。(/etc/pki/CA/index.txt, /etc/pki/CA/index.txt.attr)
  • 正しい証明書を発行し、クライアントPCにインポートが成功しているがブラウザでエラーになる!
    • 古い証明書が残っているとエラーとなることがあります。証明書を削除してください。
  • クライアントPC上の古い証明書を削除できない!(削除ボタンが非活性になっている)
    • Windowsの場合、コマンドプロンプトから certmgr を呼ぶと、削除することができます。

何かの参考になれば、幸いです。

  • このエントリーをはてなブックマークに追加