見出し画像

ストリーミングをSSL通信にする

概要

MJPEG-streamerでのストリーミング配信は通信が暗号化されてないっぽい。
暗号化してないとセキュリティ制限にひっかかるなど困ることがある。実際困った。
なので、通信を暗号化する。

通信を暗号化する方法

・nginx(エンジンエックス)でリバースプロキシサーバを作る
・ストリーミングサーバをnginx経由でアクセスするようにする
・リバースプロキシサーバをオレオレ証明書でSSL通信にする
 → これで、ストリーミング配信をSSL通信(https://xxx)にする

前提

・ラズパイにカメラモジュールを接続している
・ストリーミングサイトを構築済み
・ラズパイと同じネットワークにWindowsPCがある

ストリーミングサーバの構築手順は、以前書いてます。

手順

nginx (エンジンエックス)をインストールします

これだけでインストールできる。楽で助かる

sudo apt-get install avahi-daemon
sudo apt-get install nginx

nginx動作確認します

Windowsでブラウザを開き、http://192.168.3.101 をURLに指定します
(IPアドレスは、ラズパイのIPアドレスです)
以下のような画面が表示されれば成功です。

ストリーミングを nginx 経由でみれるように(リバースプロキシ設定)します

nginxインストール後、/etc/nginx/sites-available/と/etc/nginx/sites-enabled/のファイルを確認します。

$ ls /etc/nginx/sites-available/
default
$ ls /etc/nginx/sites-enabled/
default

servers.txtを作成します

proxy_pass の http://{ラズパイのIPアドレス}:ポート番号/ は、ストリーミングのURLを指定します。

server {
    #listen       443  default ssl;
    #ssl on;
    #ssl_certificate     /etc/nginx/conf.d/server.crt;
    #ssl_certificate_key /etc/nginx/conf.d/server.key;
    root /var/www;
    index index.html index.html index.php;
    server_name localhost;
    location / {
          try_files $uri $uri/ /index.html;
    }
    location /webcam1/ {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_pass http://192.168.3.101:8090/;
    }
}

設定を/etc/nginx/sites-available/servers として保存します

sudo cp /home/pi/Data/servers.txt /etc/nginx/sites-available/servers

ディレクトリ `/etc/nginx/sites-enabled/` から `default` を削除して、`/etc/nginx/sites-available/webcam-server` へのシンボリックリンクを追加します

sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/servers /etc/nginx/sites-enabled/

シンボリックリンクはれているか確認します

$ ls -l /etc/nginx/sites-enabled/
合計 0
lrwxrwxrwx 1 root root 34  924 06:38 servers -> /etc/nginx/sites-available/servers

上記の設定では/var/www/ディレクトリを静的なコンテンツの公開用に設定しているため、ディレクトリを作成し、HTMLファイルを配置します

sudo mkdir /var/www
sudo chmod 755 /var/www

HTMLファイルを/var/www/index.htmlとして保存します

(index.html は動作確認用なので、適当に準備します)
設定を反映させるため、nginx 再起動します。

sudo /etc/init.d/nginx restart

アクセスしてみます。
その前に、ストリームが動いていることを確認します。
私の場合は、MJPEG-streamer を使っているので以下コマンドでストリーミングを開始します。

cd mjpg-streamer/mjpg-streamer-experimental/
./mjpg_streamer -o "./output_http.so -p 8090 -w ./www" -i "./input_raspicam.so -x 640 -y 480 -fps 30 -q 10"

動作確認(まだSSL通信じゃない)

リバースプロキシサーバのURLを指定して、ストリーミング映像が見えるか確認します。以下のURL↓を開いてみます。
http://192.168.3.101/webcam1/
以下のように、ラズパイのカメラの映像が映れば成功です。

nginx を SSL通信化する

まずは通信の暗号化に必要な証明書を用意します。今回はオレオレ証明書といわれる、自己証明書を用意します。

オレオレ証明書(server.crt server.csr server.key)を用意する

openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
piuser@raspi002:~/data $ mkdir ssl
piuser@raspi002:~/data $ cd ssl
piuser@raspi002:~/data/ssl $ openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
.........................................+++
...................................+++
e is 65537 (0x010001)
Enter pass phrase for server.key:             ←パスを入力(password)
Verifying - Enter pass phrase for server.key: ←パス(password)を再入力
piuser@raspi002:~/data/ssl $ openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:             ←さっきのパス(passoword)を入れる
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Shibuyaku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
piuser@raspi002:~/data/ssl $ cp server.key server.key.org
piuser@raspi002:~/data/ssl $ openssl rsa -in server.key.org -out server.key
Enter pass phrase for server.key.org:         ←パス(password)入れる
writing RSA key
piuser@raspi002:~/data/ssl $ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=C = JP, ST = Tokyo, L = Shibuyaku, O = Internet Widgits Pty Ltd
Getting Private key
piuser@raspi002:~/data/ssl $ ls
server.crt  server.csr  server.key  server.key.org
piuser@raspi002:~/data/ssl $

作成した証明書を、/etc/nginx/conf.d 配下にコピーします。

sudo cp /home/pi/Data/ssl/server.* /etc/nginx/conf.d/
sudo chown root:root /etc/nginx/conf.d/server.*

/etc/nginx/sites-available/servers を開き、以下のコメントアウト(頭の # )を削除します。

#listen       443  default ssl;
#ssl on;
#ssl_certificate     /etc/nginx/conf.d/server.crt;
#ssl_certificate_key /etc/nginx/conf.d/server.key;

 ↓ コメントアウト削除

listen       443  default ssl;
ssl on;
ssl_certificate     /etc/nginx/conf.d/server.crt;
ssl_certificate_key /etc/nginx/conf.d/server.key;

サービス再起動して、変更した設定を反映させます

sudo /etc/init.d/nginx restart

動作確認(SSL通信の確認)

https://192.168.3.101/webcam1/?action=stream を開いて、カメラ映像が表示されれば成功です。

おわりに

検証/遊び要素で使える環境ができました。私はこの環境で、いろいろ自分で考えてたシステムを試しています。これが誰かの助けになれば幸いです。


こんな弱小ブログでもサポートしてくれる人がいることに感謝です。