Let’s EncryptによるWebRTCサーバのSSL化

こんにちは、ベーコン婆男です。

WebRTCサーバのSSL化の必要性

Googleが、HTTPSを検索順位を決定する際の判断指標に利用すると発表したりと、最近、サイトのSSL化(常時SSL化)が進んでいます。アップルは、期限を延期したとは言え、全iOSアプリを対象にHTTPS通信を必須とする、App Transport Security (ATS)適用の義務化を実施すると発表しています。サイトの情報の信頼性の確保やユーザが安心してサイトにアクセスできるようにするために、今後SSL化はどんどん進んでいくものと思われます。

WebRTCで言えば、ChromeでWebRTCを利用する場合、Chrome 47 以降では カメラやマイクを有効化するために使用する getUserMediaというWebRTCのAPI が HTTPS(もしくは localhost) でないと使えないようになっています。

その他、特にiPhoneでWebRTCアプリを開発しようとした場合、HTTP通信(非暗号)の場合、色々と引っかかるケースが出てきます。

このような事情から、WebRTCアプリを開発する場合、サーバにSSL証明書を実装し、HTTPSやWSSの暗号化通信でアクセスできるようにしておくことをお奨めします。

WebRTCサーバのSSL化の概要

SSL証明書の実装手順

WebRTCサーバにSSL証明書を実装する手順は、大まかに以下になります。

① ドメインの取得
② SSL証明書の取得
③ WebRTCサーバへのSSL証明書の実装

①と②については、WebRTCサーバや今回対象としているKurentoサーバに限らず、同じ手順です。③については、今回Kurentoサーバでの実装方法について説明します。

本記事では、お金をかけずにKurentoサーバにSSLを実装することを前提としており、無償でのドメインと無償のSSL証明書の取得方法について説明していますが、有償のものを利用すればより信頼性も上がりますので、有償で取得される場合は、③WebRTCサーバへのSSL証明書の実装から実施ください。

SSL証明書の取得について

従来、SSL証明書を取得しようとすると、年間数万円の費用が掛かり、なかなか個人の趣味で取得することは難しい状況でした。しかし、2016年4月に無償の認証局であるLet’s Encryptが開始され、誰でも無料でSSL証明書を取得できるようになりました。

Let’s Encryptとは

Let’s Encryptは、ISRG(Internet Security Research Group)という団体によって運営されています。ISRGは、インターネットを介した安全な通信を行う際の、経済面・技術面・教育面での障壁を減らすことを目的に設立された団体で、主要なスポンサーはElectronic Frontier Foundation (EFF)、Mozilla Foundation、アカマイ・テクノロジーズ、シスコシステムズとなっており、安心して利用できるサービスです。

また、Let’s Encryptは運用が自動化されており、面倒な手続きなどなく、即時SSL証明書を発行することができます。

Let’s Encryptを利用する場合の注意点

Let’s EncryptでSSL証明書を発行する場合、以下の点にご注意ください。

  • SSL証明書発行に当たって、ドメイン名が必要です。ドメイン名の取得には通常費用がかかりますが、Freenomというサイトを利用すると、無償でドメインを取得することができます。
  • SSL証明書の発行時、Lets Encryptのサーバから対象のサーバにアクセスし、ドメインの存在確認を行います。そのため、証明書を実装するサーバをインターネットに接続できるようにしておき、事前に名前解決ができるようにDNSの設定をしておく必要があります。 また、Let’s Encryptサーバからアクセスできるように、TCP 443のポートを開けておく必要があります。
  • 取得した証明書の有効期限は発行から90日間です。期限が近づいたら再度延長のための手続きが必要になります。延長手続きは何度でもできます。
  • SSL/TLSサーバ証明書には「ドメイン認証」「企業実在認証」「EV(Extended Validation)」の3種類が存在します。Let’s Encryptで取得できる証明書は、ドメイン認証で、ドメインの使用権のみを認証する証明書になります。そのため、組織の実在確認や、運営確認の証明はできません。趣味で利用する場合には、ドメイン認証だけで問題ないと思いますが、企業で利用する場合は、企業実在認証やEVが可能な有償の証明書を取得したほうがいいと思われます。

WebRTCサーバのSSL化方法

① ドメインの取得 (Freenom)

SSL証明書の取得にドメインが必要なため、まずは、サーバのドメインを取得します。今回は、できるだけお金をかけないように、Freenomというサイトで、無償でドメインを取得します。もちろん、有償でドメインを取得しても大丈夫です。

Freenomのページ(http://www.freenom.com/)を開いて、希望のドメイン名を「新しい無料ドメインを探します」の欄に入力して、「利用可能状況をチェックします」のボタンをクリックします。

ここでは、「baconbabao」と入力してみました。

そうすると、上段に無償で取得できるドメインの一覧が、下段に取得できる有償ドメインの一覧が表示されます。

今回は、baconbabao.tkでドメインを取得したいと思いますので、その行の横の「今すぐ入手」ボタンをクリックします。しばらくすると、「選択」ボタンに代わり、右上に「チェックアウト」ボタンが表示されます。

なお、.tkは、ニュージーランドの領土であるトケラウに割り当てられているドメインで、トケラウは、個人の誰にでも.tkドメインを無償で提供しています。

チェックアウトボタンをクリックすると、選択したドメイン名の設定画面が表示されます。「Use DNS」を選択し、「IP address」欄にドメインのIPアドレスを入力します。
(今回は、FreenomのDNSサーバを利用する前提にしています。)
Periodは最長の12 Months@FREEを選択して、「Continue」ボタンをクリックします。

料金確認の画面が表示されますので、念のため$0.00USDになっていることを確認してください。「Enter Your Email Address」欄にEmailアドレスを入力して、「Verify My Email Address」ボタンをクリックしてください。入力したEmailアドレスに確認のメールが届きますので、メール文中のリンクをクリックします。

ユーザ情報の入力画面が表示されます。各項目に必要事項を記入して、「I have read and agree to Terms & Conditions」にチェックを入れて、「Complete Order」ボタンをクリックします。(すべての項目を入力しないと次の画面に進めませんので、ダミーでもいいので何かしら入力してください。)

無事に手続きが完了すると、Order Confirmationの画面が表示されます。

これで、ドメインの取得が完了です。また、FreenomのDNSに本ドメインが登録されているはずですので、PINGで名前解決ができているか確認してみてください。

② SSL証明書の取得 (Let’s Encrypt)

次にLet’s Encryptを利用したSSL証明書の取得方法について説明します。

Let’s EncryptでのSSL証明書の取得は、「Certbot」と呼ばれるクライアントソフトウェアを使用します。(CerbotはLet’s Encryptから提供されます。)

なお、先にも述べましたが、CerbotでSSL証明書を発行する場合、Cerbotを実行するサーバからLet’s Encryptサーバにアクセスし、ドメインの存在確認を行います。そのため、SSL証明書の取得作業は、実際にSSL化を行うサーバ上(今回の場合はKurentoサーバ上)で実行し、事前にインターネットへの接続とTCP 443ポートの開放、及び、DNSによるドメインの名前解決ができる状態にしておいてください。(DNSによるドメインの名前解決は先述のFreenomの手順で完了しているはずです。)

サーバ証明書の取得手順

Cerbotで、Apache2を利用するため、Apache2がインストールされていない場合は、先にインストールします。

$ sudo apt-get update
$ sudo apt-get install apache2

SSLの証明書を取得する作業用フォルダを作成します。

$ mkdir ssl
$ cd ssl

Cerbotをダウンロードして、実行します。

$ wget https://dl.eff.org/certbot-auto
$ chmod a+x certbot-auto
$ ./certbot-auto

Cerbotが実行されます。

Emailアドレスの入力が求められますので、指示に従って入力してください。

Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):

次に、Termsへの承諾が確認が求められますので、「A」を入力してください。

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel:

次に、EFF団体にメールアドレスを提供してもよいか確認されますので、お好みに応じてY(はい)もしくはN(いいえ)を入力してください。Yを選択するとEFF団体から活動に関するメールが送られるようです。

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o:

次に、ドメイン名の入力が求められますので、Freenomで取得したドメイン名を入力します。

No names were found in your configuration files. Please enter in your domain
name(s) (comma and/or space separated)  (Enter 'c' to cancel):

次に、HTTPS通信を必須とするかオプションにするかの確認がありますので、HTTPとHTTPS通信のどちらも可能にする場合は、1を、すべての通信をHTTPSにリダイレクトする場合は2を選択してください。今回は2を選択しました。

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

無事にSSL証明書が取得できると、以下のCongratulations!メッセージが表示されます。

-------------------------------------------------------------------------------
Congratulations! You have successfully enabled https://baconbabao.tk

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=baconbabao.tk
-------------------------------------------------------------------------------

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/baconbabao.tk/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/baconbabao.tk/privkey.pem
   Your cert will expire on 2017-12-16. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again with the "certonly" option. To non-interactively renew *all*
   of your certificates, run "certbot-auto renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

メッセージ中に記載がありますが、
SSL証明書:/etc/letsencrypt/live/(ドメイン名)/fullchain.pem
秘密鍵:/etc/letsencrypt/live/(ドメイン名)/privkey.pem
が保存されています。また、3か月後に有効期限が切れますので、有効期限内に、「./certbot-auto renew」コマンドで証明書の更新が必要になります。

③ WebRTCサーバへのSSL証明書の実装 (Kurentoサーバ)

前項で取得したSSL証明書をKurentoサーバに実装します。

JKS(Java Key Store)ファイルの作成

まず、作業フォルダ(/etc/kurento/work-folder)を作成し、Let’s Encryptで取得した証明書と鍵ファイルを作業フォルダにコピーします。証明書が保存されているフォルダにアクセスするためにroot権限が必要なため、rootユーザに切り替えます。

$ sudo su -
$ mkdir /etc/kurento/work-folder 

$ cd /etc/letsencrypt/live/(ドメイン名)/
$ cp fullchain.pem /etc/kurento/work-folder/  <--証明書
$ cp privkey.pem /etc/kurento/work-folder/   <--秘密鍵
$ cp cert.pem /etc/kurento/work-folder/     <--公開鍵

$ cd /etc/kurento/work-folder

次に今回、Javaのアプリケーションサーバを利用したKurentoサーバ構成を採用した場合、JavaでSSLを利用するために、JKS(Java Key Store)ファイルを作成する必要があります。

まずJKSを作成するために、Let’s Encryptで取得した秘密鍵と証明書からPKCS12データベースを作成します。PKCS12ファイルの作成には、opensslを使用します。

openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out fullchain_and_key.p12 -name kurento-selfsigned -password pass:XXXXX

パスワード(pass:XXXXX)は、任意のパスワードを指定してください。同じフォルダに、PKCS12ファイルのfullchain_and_key.p12ファイルが作成されていることを確認してください。

次に、作成したPKCS12ファイルからJKSファイルを作成します。

keytool -importkeystore -deststorepass ZZZZZ -destkeypass ZZZZZ -destkeystore keystore.jks -srckeystore fullchain_and_key.p12 -srcstoretype PKCS12 -srcstorepass XXXXX -alias kurento-selfsigned

「-srcstorepass XXXXX」のXXXXXは、PKCS12ファイルを作成した時のpassを指定してください。ZZZZZのところは、任意のパスワードを指定してください。

同フォルダに、「keystore.jks」が作成されていることを確認してください。

KurentoサーバアプリケーションへのJKSファイルの設定

KurentoサーバのアプリケーションにSSL証明書を組み込むため、アプリケーションにJKSファイルを設定します。

ここでは、前回ご紹介したHello WorldのチュートリアルのアプリケーションをSSL化します。他のチュートリアルやサンプルアプリでも手順は同じです。

Hello Worldのルートディレクトリに移動します。

$ cd ~/kurento-tutorial/kurento-tutorial-java/kurento-hello-world

JKSファイル(keystore.jks)は、application.propertiesという設定ファイルで指定され、application.propertiesは、src/main/resources/に保存されています。まず、application.propertiesの内容を確認します。

$ cd src/main/resources/
$ more application.properties
   server.port: 8443
   server.ssl.key-store: classpath:keystore.jks
   server.ssl.key-store-password: XXXXX
   server.ssl.keyStoreType: JKS
   server.ssl.keyAlias: kurento-selfsigned

application.propertiesファイルの中で、keystore.jksファイルが指定されているのが分かります。また、keystore.jksを作成するときに指定した、パスワード(XXXXX)や名称(kurento-selfsigned)は、application.propertiesの指定値と一致している必要がありますのでご注意ください。

次に、作成したkeystore.jksをコピーしてきます。コピー先は、application.propertiesが保存されているフォルダと同じ、src/main/resources/になります。なお、チュートリアルのコードでは、自己証明書のkeystore.jksがデフォルトで存在しているため、先にデフォルトのkeystore.jksを削除するか、上書きでコピーしてください。

 $ cp /etc/kurento/work-folder/keystore.jks .
(カレントディレクトリは、kurento-tutorial/kurento-tutorial-java/kurento-hello-world/src/main/resources/になっています)

これで、SSL化の設定が完了です。
それでは、再度Hello Worldを起動してアクセスしてみましょう。

$ cd ~/kurento-tutorial/kurento-tutorial-java/kurento-hello-world
$ mvn compile exec:java

ブラウザを立ち上げて、取得したドメイン名でアクセス(https://ドメイン名:8443)してみてください。

無事にSSL化されていたでしょうか?証明書の詳細を確認すると、Let’s Encryptの証明書で暗号化されていることが分かりますね。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です