Content Security Policy Lv3 (CSP3)でhashにより外部スクリプトを許可する

整理している人
©いらすとや.

前回、Content Security Policy Lv3 (CSP3)でhashによりスクリプトを許可するでインラインスクリプトのハッシュを求めて許可するというのをやったが、そこで少しだけ触れた外部スクリプトをそのまま外部スクリプトとしてハッシュで許可するというのをやってみる。元々は今回nonce(ナンス)を予定していたが思っていたより大変そうなので後回しにした。ごめんなさい。

先に結論だけ書いておきます。ハッシュで外部スクリプトを許可というのはまだとても採用できません。
前回すでに書いていたけど、結局これ。Chromeブラウザでしか使えないのでは話になりません。ハッシュで外部スクリプトを許可したい場合は前回の記事のようにインラインスクリプトから外部スクリプトを読み込むようにしてそのインラインスクリプトを許可してください。

外部スクリプトのハッシュの求め方

インラインスクリプトのハッシュの求め方と大きく違いません。とはいえ、外部スクリプトの内容を読み出す必要があるのでその部分が違います。

https://example.com/dir/script-file.js のハッシュ(sha256)を求める
$ curl --silent "https://example.com/dir/script-file.js" | openssl sha256 -binary | openssl base64
38t2ZdzI/Df3oFOk0g2IWs1/0CwV7NAEnyyMlsdxAVk=      ←求められたハッシュ

CSPヘッダにハッシュを含める (前回と同じ)

CSPヘッダに書くときは、求めたハッシュの前に「sha256-」を付けて「'」で囲む。
'sha256-38t2ZdzI/Df3oFOk0g2IWs1/0CwV7NAEnyyMlsdxAVk='

HTMLヘッダにCSPを書く場合
<meta http-equiv="Content-Security-Policy" content="script-src 'sha256-38t2ZdzI/Df3oFOk0g2IWs1/0CwV7NAEnyyMlsdxAVk=' 'strict-dynamic';">
Nginxの設定でHTTPレスポンスヘッダにCSPを書く場合
add_header Content-Security-Policy "script-src 'sha256-38t2ZdzI/Df3oFOk0g2IWs1/0CwV7NAEnyyMlsdxAVk=' 'strict-dynamic';";

スクリプトタグの変更

インラインスクリプトのハッシュを求めて許可する場合はスクリプトタグはそのまま触らなかったが、外部スクリプトのハッシュを求めて許可する場合は「integrity」を付けて、そこにもハッシュを書く。

HTMLページの中

変更前: <script src="https://example.com/dir/script-file.js"></script>

変更後: <script integrity="sha256-38t2ZdzI/Df3oFOk0g2IWs1/0CwV7NAEnyyMlsdxAVk=" src="https://example.com/dir/script-file.js"></script>

前回のインラインスクリプトをハッシュで許可する場合と僅かな違いはあるものの難しくはありません。ただし、外部スクリプトのURLが変わらないままその中身が変更された場合にはその外部スクリプトがブロックされることになります。許可したいスクリプトが自身の管理であれば変更後にハッシュを再作成してCSPヘッダを更新すればよいのですが、自身の管理でない他所のサイトやCDNにあるようなライブラリなどであれば知らない内にスクリプトが変更されてしまうといつの間にかブロックされていたということがあるかもしれません。(まともなライブラリはバージョン毎にURLが変わるようになっているとは思いますが)

試したのがChromeブラウザ(107.0.5304.62beta)とFirefoxブラウザ(108.0)だけですが、Firefoxではこの外部スクリプトを直接許可というのはまだ機能しませんでした。外部スクリプトをハッシュで許可するというのはCSP Level 3の内容で、CSP3はまだドラフトなので対応してなくても文句は言えません。(2022年12月13日現在)

ADS-B受信用の缶テナ作成

整理している人
©いらすとや.

ADS-B受信セットを携帯するため、今回は新たにアンテナを作成することにしました。持ち運びを考慮し、軽量でコンパクトな「缶テナ」を作ることに決めました。
缶テナ(カンテナ)とは、空き缶を利用して作るアンテナのことです。Wi-Fiの電波を遠くに飛ばすために、空き缶の内側を利用する缶テナをYouTubeなどでよく目にしますが、あれは指向性を高めたもので、日本国内で使用することは規制に反します。今回は、そのような指向性のあるタイプではなく、空き缶の外側を使い、ダイポールアンテナやグランドプレーンアンテナ、さらにはスリーブアンテナの特徴を融合させた、自作の缶テナを作ります。これにより、ADS-Bの電波を効率的に受信することを目指します。

実は過去に2つの缶テナを作成しているのですが、持ち運びの際に缶が変形したり、アンテナエレメントが折れてしまったりして、残念ながら捨ててしまいました。今回はその3つ目の試作です。これまでの経験を活かし、製作のコツも覚えているので、改めて作成の手順をお伝えします。

ADS-B受信用 缶テナ 1
今回使用するのは、350mlのコーラの空き缶です。この缶の表面にある塗装は不要なため、剥がしてしまいます。アルミ缶は薄くて柔らかいので、空き缶の塗装を削り取る作業は苦労するのでお勧めしません。写真にあるように、未開封の缶をクルクル回しながら、耐水ペーパーを使って表面を削っていきます。この際、塗料や下地材の粉が出るため、作業場所が汚れやすく、耐水ペーパーの目詰まりも発生します。そこで、水を張った洗面器などの中で作業を行うと、飛び散る粉を抑えながら進められます。

ADS-B受信用 缶テナ 2
缶の底も軽く削っておき、中心部分には穴を開けます。(次)

ADS-B受信用 缶テナ 3
缶の底の中心に、Nコネクタのネジがギリギリ通るサイズの穴を開けました。Nコネクタはアンテナのコアパーツで、右側のNコネクタの芯にはアルミ棒を取り付けてあります。

ADS-B受信用 缶テナ 4
Nコネクタに取り付けるアルミ棒の長さは、計算上69mmにする予定ですが、今回は少し余裕をもたせて70mmでカットし、後で正確に計測して必要に応じてヤスリで調整します。

ADS-B受信用 缶テナ 5
缶側のエレメントも同様に、69mmの高さにする計画ですが、こちらも微調整のため少し長めにカットしています。缶のエレメントの長さは、ハサミで切って調整するのが簡単です。

ADS-B受信用 缶テナ 6
Nコネクタのネジを缶に通し、内側にワッシャーを挟んで外側をナットでしっかり固定します。写真はまだナットを嵌めていません。

ADS-B受信用 缶テナ 7
今回は持ち運び用なので、長期的に屋外に設置するわけではありませんが、雨天での使用を考慮する場合は、缶底に排水用の穴を開けるか、防水加工を施す必要があるかもしれませんが、今回は持ち歩き用で雨天での使用を想定していません。

ADS-B受信用 缶テナ 8
缶の内側はこのようになっています。

ADS-B受信用 缶テナ 9
Nコネクタ付きの50Ω同軸ケーブルを使って缶テナに接続します。このケーブルはRG-58/Uという少し細めのものですが、短いケーブルなので必要十分です。

ADS-B受信用 缶テナ 10
写真のように接続すると、完成した缶テナの全容がわかると思います。

ADS-B受信用 缶テナ 11
アンテナの特性を測定するために、NanoVNA V2 (SAA-2)を使って測定を行います。写真では机の上に寝かせてありますが、実際の測定ではNanoVNA V2を下に、缶テナを上向きに設置し、アルミ棒の先端が一番上になるようにします。運用時も同じ向きです。

ADS-B受信用 缶テナ 12
590MHzから1590MHzまでの広い範囲の測定結果です。左側にはスミスチャートが表示され、右側のグラフにはSWR(赤線)とMAG(青線)が描かれています。今回のADS-Bの中心周波数は1090MHzですが、測定範囲が広いため、マーカーは1100MHz付近に表示されています。

ADS-B受信用 缶テナ 13
範囲を絞り990MHzから1190MHzに設定すると、右のグラフの中央がほぼ1090MHzになります。未調整の状態でも、意外にも良好な特性を示しており、スミスチャートでは1088MHzでほぼ50Ωのインピーダンスが確認できました。SWRとMAGは1085MHzで最も低くなっており、MAGの谷間がもう少し深く、1090MHzに近づけば理想的ですが、これくらいのズレなら無理に調整せず、このまま使用するのも一つの選択です。
最終調整には、実際に使用する同軸ケーブルをつなげて測定を行うのが良いでしょう。実際の受信機と同じ条件で接続して再計測し、必要に応じて微調整を行います。

持ち運びの際には、1.5m程度の塩ビパイプと、2.5〜3mの同軸ケーブルを用意します。もしくは、同軸ケーブルを使わずに缶テナのNコネクタにN-SMA変換アダプタを接続し、RTL-SDRレシーバを直結して長めのUSBケーブルでPCやスマートフォンと接続する方法もあります。どちらにしても、再利用可能な結束バンドを使ってしっかり固定できるようにすると便利です。

最後に、受信機としてはRTL-SDR受信機をノートPCやスマートフォンに接続して使用します。同軸ケーブルを巻いて持ち運ぶ場合、ノートPCが便利ですが、USBケーブルを使えば、3m程度の長さでもコンパクトにまとめられるので、スマートフォンでの運用も可能です。

関連記事:
Up