Ubuntu Weekly Recipe

第387回 UbuntuでSSLを利用したサービスを構築する

この記事を読むのに必要な時間:およそ 8.5 分

コラム(自己署名証明書の利用について)

前述のように,自己署名証明書を利用しているサイトにアクセスすると,Webブラウザーが警告を発します。自己署名証明書を使うのは望ましくないのでしょうか?

筆者は場合によると考えています。自己署名証明書の問題は,認証局のサインがないため第三者が本当に正しいサイトなのか確認できないことです。たとえばOV(企業認証)証明書であれば,法務局や帝国データバンクの情報,あるいは登記簿謄本の提出などによる企業実在認証をパスしなければ証明書が発行されないため,通信している相手が実際に存在している企業であることは信用してよいでしょう注5⁠。DV(ドメイン認証)証明書であっても,少なくともそのドメインを所有している相手ではあるわけです注6⁠。しかし自己署名証明書ではそういったものが担保されていないため,偽のサイトに誘導されていても気づけないのです。

注5)
金融機関などでは,さらに認証基準の厳しいEV証明書(Webブラウザーのアドレスバーが緑色になるアレ)を利用しています。
注6)
ただし申請者の身元までは確認されないためセキュリティレベルは低く,業界内でも様々な議論があるようですが,とりあえず本稿では置いておきます。

ですが自分自身から見れば(自分が作成した証明書とフィンガープリントが一致することによって)自分自身のサイトであることが確認できるわけですから,この点は問題になりません。自分一人,あるいは家庭,会社内など,閉じられた範囲で利用するのであれば,自己署名証明書でも暗号化という目的は達成できるため,証明書を購入しないで済ますという選択もあるでしょう注7⁠。

注7)
もちろん証明書のフィンガープリントをユーザーに事前に連絡することは忘れないでください。

ただしGmailのような外部サービスと連携する場合は注意が必要です。GmailのMail Fetcher機能を利用し,自分のメールサーバーに届いたすべてのメールをGmailに集める,というのは割とよくある運用です。しかしGmailは自己署名証明書を用いたSSL通信を拒否するため,このような場合は正規のSSL証明書が必要になります。第三者にサービスを公開したり,外部サービスと連携する場合には,SSL証明書を購入するようにしましょう。

(Gmailヘルプより引用)

SSLの要件 Gmailでは「厳格」なSSLセキュリティを使用します。このため、ご利用の他のプロバイダのリモートサーバーに有効なSSL証明書があるかどうかの確認が常に行われます。これにより高度なセキュリティを提供してユーザーの情報を保護します。

正規のSSL証明書を購入する

不特定多数に向けたサービスに,snakeoilをそのまま使うわけにはいきません。もしもサービスをインターネット上で公開するのであれば,正式なSSL証明書を購入しましょう注8⁠。

注8)
ここからの作業はインターネット上に公開されているサーバー(さくらのVPS)を使い,かつDNSサーバーに適切なレコードが設定されており,FQDNでアクセス可能であることを前提としています。

本連載では過去にさくらのVPSでUbuntuサーバーを構築する方法を紹介しました。Ubuntuに対応した安価なVPSサービスということもあり,さくらでUbuntuサーバーを運用している方も多いのではないでしょうか注9⁠。そのさくらがジオトラストブランドのRapidSSLの取り扱いを開始し,9月30日までの限定で1年分無料キャンペーンを行っています。ここでは(せっかくですのでこのキャンペーンを利用して)SSL証明書の購入方法を紹介します注10⁠。

注9)
もちろん筆者も利用中です。
注10)
ここではさくらを例にしていますが,サーバー上で秘密鍵とCSRを作成し,メールやWebで認証を受けて証明書を受け取る,という基本的な流れはどの業者でも同じです。

まずサーバー上でopensslコマンドを使い,秘密鍵を作成します。-des3オプションはトリプルDESで秘密鍵を暗号化するという意味で,引数の2048は,鍵長を2048bitにするということを意味します。セキュリティ上の理由から,1024bitのSSL証明書はすでに発行が禁止されているため,鍵長には気をつけてください。鍵に設定するパスフレーズを尋かれるので,4文字以上のパスフレーズを入力してください。

秘密鍵の作成

$ openssl genrsa -des3 -out server.key.secure 2048
Generating RSA private key, 2048 bit long modulus
...........................+++
...........+++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:

秘密鍵を暗号化したため,利用時にはパスフレーズを入力してロックを解除しなくてはなりません。サーバーの起動時もそれは例外ではないため,用途によっては非常に扱いづらいものになってしまいます。そこで以下のコマンドでパスフレーズのない秘密鍵も作成しておきましょう。server.key.secureがパスフレーズつき,server.keyがパスフレーズなしの鍵ファイルになります注11⁠。

注11)
鍵つきの秘密鍵は不要であれば削除してしまっても構いません(筆者は一応同じフォルダーに置いていますが,サーバーで使った試しはあません⁠⁠。秘密鍵の生成時に-des3オプションをつけず,最初から暗号化しないのもアリでしょう。

パスフレーズなしの秘密鍵の作成

$ openssl rsa -in server.key.secure -out server.key
Enter pass phrase for server.key:
writing RSA key

Certificate Signing Request(CSR)を作成します。後述の図「CSRの作成」に示すコマンドを実行してください。その際,署名アルゴリズムにSHA-2を利用するという意味の,-sha256オプションを忘れずにつけてください。これもセキュリティ上の理由により,SHA-1のSSL証明書はすでに非推奨となっているためです注12

注12)
SHA-1のSSL証明書を利用したサイトにアクセスすると,Webブラウザーによってはアドレスバーに警告が表示されるようになっています。またWindowsは2017年1月1日以降,SHA-1のSSL証明書を利用したサイトへの通信を拒否するようになります。

著者プロフィール

水野源(みずのはじめ)

Ubuntu Japanese Teamメンバー。理想のフリーデスクトップ環境を求めて東へ西へ……のはずが,気がついたら北の大地で就職していたインフラ寄りのエンジニア。最近レンズ沼にハマる。