MikroTik hAP acで作るHotspot 2.0環境 (iOS編)

全体的にざっくりしています。筆者の認識誤りが多分に含まれるかもしれません。

■前説Hotspot 2.0

従来の無線LANにおいてはユーザがSSIDを選び認証情報を入力して接続していたが、Hotspot 2.0では802.11uを用いてユーザーが手動でSSIDを選ぶことなく初見のSSIDでも(ユーザが利用可能な認証情報をプロファイル等でデバイスに設定していれば)自動的に認証してセキュアに利用可能な無線LANに接続できる。

ruckusのホワイトペーパー
How Interworking Works: A Detailed Look at 802.11u and Hotspot 2.0 Mechanisms

802.11u以前では、AP発見時にSSIDと暗号化方式(WEP,WPA2など)しか伝えられなかった。
802.11uにおいては、SSID、暗号化方式、network type、課金の有無、インターネット接続の速度・ステータス、ローミング利用可能な事業者、Network Access Identifier (NAI) realm、IPv4IPv6か、EAP type、などどいった情報を、広報プロトコルでクライアントデバイスに伝えることが可能となっている。
これらの情報を元にクライアントデバイスが接続するSSIDを選んだあとの認証は、802.1Xで行われる。
認証の部分は従来の802.1Xと同じなので、キャリアであればSIMの情報を利用したEAP-SIMやEAP-AKAなども利用できるし、eduroamでよく使われているPEAP(EAP-MSCHAP v2)などでもよい。

具体的な接続シーケンスは下記の通りである。

インターネット白書2013-2014, Wi-Fiの最新技術動向 207頁 資料4-3-7 Hotspot2.0のシーケンス

■必要なもの

Hotspot 2.0に対応したアクセスポイント

今回使うのは、MikroTikのhAP ac (RB962UiGS-5HacT2HnT)。
技適取得済のMikroTik hAP ACは(比較的)安価なHotspot 2.0対応のAPかもしれない - pirosapの備忘録

RouterOSはハードウェアが異なっても基本的にできることは同じなので、技適が通っている他のモデルであっても同じことができるはず。

RADIUSサーバ

認証を処理するためのRADIUSサーバ。hAP ac内部のRADIUSサーバでもよいかもしれないが、当方の目的には合わないので検証していない。
今回は、hAP acと同一のLAN上に設置したLinuxサーバ上にFreeRADIUS 3.0.10で構築したものを用いた。

参考:eduroam JP FreeRADIUS 3の導入
eduroam加入機関向けに書かれたドキュメントであるが、RADIUS proxy以外(今回は考慮していない)の部分はほぼ同じ。
mods-available/eap にある、private_key_password, private_key_file, certificate_file, ca_file については、正規のサーバ証明書に書き換える。検証環境では無償で証明書が利用可能な認証局のLet's Encryptで取得したものを用いている。
ストアカウントを直接ファイルに記載して認証をテストしたのち、hAP acのIPアドレスとシークレット文字列をclients.confに設定しておく。

iOSバイス

Androidはメーカやバージョン毎に実装が異なり、検証が難しい(手元ではAndroid 7.1.1のNexus 5Xで動作確認済)ため、iOS(10.2.1〜)で検証を行った。

iOSバイスにインストールするプロファイル

macOSにて、Apple Configurator 2で生成した。
内容はxmlなので、頑張ればエディタでも作れるのかもしれない。
現状では、あまり多くのことはできないかな、という印象(Release1相当?)
生成したプロファイルはiOSクライアントにインストールしておく。

6/9 誤りに気付いたので修正(プロファイルに含めていたサーバ証明書を削除)。
サーバ証明書秘密鍵を添付するとかよく考えたらおかしかった。

hoge.mobileconfig (一部ぼかしてあります)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>PayloadContent</key>
        <array>
                <dict>
                        <key>AutoJoin</key>
                        <true/>
                        <key>CaptiveBypass</key>
                        <false/>
                        <key>DisplayedOperatorName</key>
                        <string>NGH testbed by pirosap.tech(ここの文字列がSSIDの下に表示される)</string>
                        <key>DomainName</key>
                        <string>ngh.pirosap.tech(ここがhAP ac側の設定と一致すると自動接続対象に選ばれるのだと思う)</string>
                        <key>EAPClientConfiguration</key>
                        <dict>
                                <key>AcceptEAPTypes</key>
                                <array>
                                        <integer>21</integer>
                                </array>
                                <key>PayloadCertificateAnchorUUID</key>
                                <array>
                                        <string>04FD025F〜ほげほげ</string>
                                </array>
                                <key>TLSTrustedServerNames</key>
                                <array>
                                        <string>ngh.pirosap.tech</string>
                                </array>
                                <key>TTLSInnerAuthentication</key>
                                <string>MSCHAPv2</string>
                                <key>UserName</key>
                                <string>1xID(FreeRADIUSに設定したID)</string>
                                <key>UserPassword</key>
                                <string>1xPASSWORD(FreeRADIUSに設定したパスワード)</string>
                        </dict>
                        <key>EncryptionType</key>
                        <string>WPA2</string>
                        <key>HIDDEN_NETWORK</key>
                        <false/>
                        <key>IsHotspot</key>
                        <true/>
                        <key>PayloadDescription</key>
                        <string>Wi-Fi 設定を構成します</string>
                        <key>PayloadDisplayName</key>
                        <string>Wi-Fi</string>
                        <key>PayloadIdentifier</key>
                        <string>com.apple.wifi.managed.D8D2〜ほげほげ</string>
                        <key>PayloadType</key>
                        <string>com.apple.wifi.managed</string>
                        <key>PayloadUUID</key>
                        <string>4418D5〜ほげほげ</string>
                        <key>PayloadVersion</key>
                        <integer>1</integer>
                        <key>ProxyType</key>
                        <string>None</string>
                </dict>
        </array>
        <key>PayloadDisplayName</key>
        <string>ngh.pirosap.tech</string>
        <key>PayloadIdentifier</key>
        <string>pirosap.local.9B6C2〜ほげほげ</string>
        <key>PayloadRemovalDisallowed</key>
        <false/>
        <key>PayloadType</key>
        <string>Configuration</string>
        <key>PayloadUUID</key>
        <string>A2CC〜ほげほげ</string>
        <key>PayloadVersion</key>
        <integer>1</integer>
</dict>
</plist>
hAP acの構成

※2017/4/27現在公開されているバージョン RouterOS 6.37.5(Bugfix only), 6.38.5(Current), 6.39rc80(Release candidate)にはバグがある模様です。設定は可能ですが、1時間弱でCPU利用率が100%となります。開発元では事象を確認しており、当方の環境ではdebug versionで事象が解消されたことを確認しております(近くRC版に修正が取り込まれる見込みです)。
4/29追記 修正が取り込まれた6.40rc2 (Release candidate)が公開されました。("fixed 802.11u wireless request processing")

ether1の上位にDHCPサーバがあり、ether1はDHCPでアドレスを取得する。
firewallは適切に設定してください。

以下、初期設定から異なるところのみ。
(ether2に有線LANで接続したPCより、SSHにて設定。パスワード、NTP Clientなど設定しておく)
検証環境では、5Ghz帯でのみ行ったため、2.4Ghz帯のwlan1を停止させている。

802.1xのAPとして設定

[admin@MikroTik] > /interface wireless set 0 country=japan frequency-mode=regulatory-domain
[admin@MikroTik] > /interface wireless set 0 disabled=yes
[admin@MikroTik] > /interface wireless set 1 country=japan frequency-mode=regulatory-domain
[admin@MikroTik] > /interface wireless security-profiles add name=1X
[admin@MikroTik] > /interface wireless security-profiles set 1 mode=dynamic-keys authentication-types=wpa2-eap eap-methods=passthrough
[admin@MikroTik] > /interface wireless security-profiles print
Flags: * - default
0 * name="default" (略)
1   name="1X" mode=dynamic-keys authentication-types=wpa2-eap unicast-ciphers=aes-ccm group-ciphers=aes-ccm wpa-pre-shared-key=""
    wpa2-pre-shared-key="" supplicant-identity="MikroTik" eap-methods=passthrough tls-mode=no-certificates tls-certificate=none
    mschapv2-username="" mschapv2-password="" static-algo-0=none static-key-0="" static-algo-1=none static-key-1=""
    static-algo-2=none static-key-2="" static-algo-3=none static-key-3="" static-transmit-key=key-0 static-sta-private-algo=none
    static-sta-private-key="" radius-mac-authentication=no radius-mac-accounting=no radius-eap-accounting=no interim-update=0s
    radius-mac-format=XX:XX:XX:XX:XX:XX radius-mac-mode=as-username radius-mac-caching=disabled group-key-update=5m
    management-protection=disabled management-protection-key=""
[admin@MikroTik] > /radius set 0 service=wireless address=172.31.0.7 secret=xxxxxx
[admin@MikroTik] > /radius print
Flags: X - disabled
#   SERVICE              CALLED-ID            DOMAIN            ADDRESS           SECRET
0   wireless                                                    172.31.0.x        xxxxxxxx
[admin@MikroTik] > /interface wireless set 1 security-profile=1X

この時点で、適当なクライアントデバイスSSIDを選択して、PEAPで認証・接続できることを確認しておく。

Hotspot 2.0のAPとして設定を追加

[admin@MikroTik] > /interface wireless interworking-profiles add name=pirosap
[admin@MikroTik] > /interface wireless interworking-profiles set 0 domain-names=ngh.pirosap.tech operator-names="NGH testbed by pirosap.tech"
[admin@MikroTik] > /interface wireless interworking-profiles print
0 name="pirosap" network-type=wildcard internet=yes asra=no esr=no uesa=no venue=unspecified hessid=00:00:00:00:00:00 hotspot20=yes
  hotspot20-dgaf=yes roaming-ois="" venue-names="" authentication-types="" ipv4-availability=not-available
  ipv6-availability=not-available realms="" 3gpp="" domain-names=ngh.pirosap.tech operator-names=NGH testbed by pirosap.tech
  wan-status=reserved wan-symmetric=no wan-at-capacity=no wan-downlink=0 wan-uplink=0 wan-downlink-load=0 wan-uplink-load=0
  wan-measurement-duration=0 connection-capabilities="" operational-classes=""
[admin@MikroTik] > /interface wireless set 1 interworking-profile=pirosap
[admin@MikroTik] > /interface wireless print
Flags: X - disabled, R - running
0 X  (略)
1    name="wlan2" mtu=1500 l2mtu=1600 mac-address=6C:3B:6B:xx:xx:xx arp=enabled interface-type=Atheros AR9888 mode=ap-bridge
     ssid="MikroTik-HS20" frequency=auto band=5ghz-a/n/ac channel-width=20/40/80mhz-Ceee scan-list=default
     wireless-protocol=802.11 vlan-mode=no-tag vlan-id=1 wds-mode=disabled wds-default-bridge=none wds-ignore-ssid=no
     bridge-mode=enabled default-authentication=yes default-forwarding=yes default-ap-tx-limit=0 default-client-tx-limit=0
     hide-ssid=no security-profile=1X compression=no

※Acronyms
asra(Additional Steps Required for Access)
esr(Emergency Services Reachable)
uesr(Unauthenticated Emergency Service Accessible)
dgaf(Downstream Group Addressed Forwarding)

プロファイルをインストールしたクライアントデバイスからの接続を確認

デモ動画

ドコモ光でHGW一体型ONUを小型ONUに変更する

NTTが提供している小型ONUについてはこちら。SFPに直接収容できる。
小型ONU開発・提供 | パートナー | 法人のお客さま | NTT東日本

MikroTikのhAP acにはSFPポートがついている。
こちらに小型ONUを挿して使いたい、と思ったのが発端。
速度面などのメリットは特にない。省スペースなのと電源が1個減るぐらい。

NTT東西と直接契約しているユーザが、ONUを小型ONUに変更するのはそんなに難しくない。
上記リンクにも明記してある。

フレッツ光を既にご利用中のお客様が小型ONUへ変更する場合
NTT東日本の申込受付窓口へご申告が必要となります。変更にあたり、別途工事費が発生する場合がございます。

しかし、ドコモ光のような光コラボレーションの場合、NTT東西に直接オーダーすることができない

今回の回線は、元々はNTT東日本フレッツ光ネクスト回線であり
→「フレッツ光ネクスト ギガマンション・スマートタイプ」(PR-500KI+無線LANカードSC-40NE「2」設置)
NTT東日本の「フレッツ 光ネクスト ギガマンション・スマートタイプ」を導入して色々試してみた - pirosapの備忘録
→「フレッツ 光ネクスト マンション・ギガラインタイプ」※品目変更 (無線LANカード返却)
→「ドコモ光 マンション・単独タイプ」へ転用
フレッツ光ネクストをドコモ光へ転用したので、ドコモ光・各種割引の複雑なプランと、転用における注意点をまとめてみた - pirosapの備忘録
という経緯がある。
ひかり電話、フレッツ・テレビなどの一切のオプションは契約していない。
宅内には光コンセントが設置されている。

まずNTT東に軽く確認したうえで(ドコモ光契約者はドコモ光へ)ドコモ光に相談。

Q. 設置してあるONUを小型ONUに変更したい。小型ONUって何?という理解であれば、言い方を変えるとホームゲートウェイをPR-500系ONU一体型)からRS-500系(小型ONUタイプ)に変更したい。
A. ユーザの希望で設置する機器を変更することはできない。

それでは新規で

上記NTT東日本のサイトには、小型ONUは「光コラボレーション事業者様 光回線」も小型ONU提供の対象回線であることが明記されている。
コラボ事業者回線の手続きは明記されていないが、「ご利用にあたっては、申込受付窓口へご利用希望の旨を申告していただく必要があります。」と記載されている。

そこで、現在ドコモ光は新規(転用ではないことに注意)であれば工事費無料であること、新規加入にあたってドコモポイント10000ポイント還元があること、既設回線は4月・5月は解約に違約金がかからないことから、既設回線に加えてもう1回線ドコモ光を小型ONUで引き、開通後に既設回線を解約することを考えた。

Q. ドコモ光を新規で申し込みたい。なお設置される機器は小型ONUでお願いしたい。具体的にはホームゲートウェイをRS-500系(小型ONUタイプ)で手配してほしい。
A1. 基本的にはユーザ側で機器の指定はできない。念のためNTT東側に確認してみる。
A2. NTT東より回答があり、無線LAN機能を利用する場合(月額300円)であれば、RS-500系で手配できる。

Q. ではそれでお願いする。後日無線LAN機能のみを解約することはできるのか。
A3. 無線LAN機能を外すことはできる。但し2000円かかる。


契約事務手数料 3240円 + 無線LAN機能停止の無派遣工事2160円 - ドコモポイント10000円CB = 4600円残る。
ただ、この後気が付いたが、新規回線はCAFが変更となるため、現在利用しているIIJmio FibreAccess/NFも再契約が必要となる。
初期費用はかからないが若干めんどくさい。
新規回線敷設は派遣工事となるので、平日日中に立ち合いが必要なことを考えたら割に合わない。

改めてNTT東に確認

Q. 光コラボレーション事業者回線を使っていて、小型ONUに変更を希望する場合、どのようにすればよいか。
A. 光コラボレーション事業者側から、NTT東の「光サポートセンター(光コラボ事業者向け窓口)」に依頼してほしい。

再度、ドコモ光に問い合わせ

Q. 設置してあるONUを小型ONUに変更したい。具体的には、ホームゲートウェイをPR-500系ONU一体型)からRS-500系(小型ONUタイプ)に変更したいという希望を、ドコモからNTT東の「光サポートセンター(光コラボ事業者向け窓口)」に伝えてほしい
A. 既設回線は無線LAN機能を利用しない場合の回線として契約されているが、無線LAN機能を利用する場合の回線(月額300円)として契約変更すれば小型ONUへの変更は可能である。変更にあたっては(光コンセント設置済であるため)無派遣工事となり、工事費は2000円。工事日までに小型ONUとHGWを送付するので、工事日にユーザ側で切替をお願いする。既設ONU一体型HGWについては、返送キットを送付するので返却してほしい。
→ 了解した。

というわけで、往復4000円の無派遣工事費用で、ドコモ光でも小型ONUへの変更ができる(うちの場合は)。
親身になって相談に乗っていただいたドコモ光のオペレータさん、ありがとうございます。

PR-500KIのままでも無線LAN使えるようにできるよね?だってもともとそうしてたもん。というのはあえてツッコんでない。

まとめ

2017年4月の時点で、ドコモ光で小型ONUを使うには

・NTT東西と直接契約の光ネクスト等小型ONU対応回線にて小型ONUが設置されている状態にしたまま(敷設時に小型ONU指定 or 既設ONUを小型ONUへ変更)、ドコモ光に転用

・(転用ではなく)新規でドコモ光を契約する際に、無線LAN機能を付けて月額300円かかることを了承のうえ小型ONUを手配頂くよう希望する(言い方を変えれば、HGWはRS-500系でとお願いする)

・既設でONU一体型HGWを利用している無線LAN機能を使わない契約になっている場合、無線LAN機能を付けて月額300円かかるのは了承するので、小型ONU+RS-500系のHGWへ変更していただくよう、ドコモからNTT東の「光サポートセンター(光コラボ事業者向け窓口)」に伝えてもらう(無線LAN機能は後日遠隔で停止(解約)可能。契約変更日から数日経たないとドコモ側でNTTにオーダーを通せないので注意)
という方法がある。

技適取得済のMikroTik hAP ACは(比較的)安価なHotspot 2.0対応のAPかもしれない

探しているもの

ちっちゃいお店にも置けそうな、単独で動作するHotspot 2.0/Passpoint対応のアクセスポイント
(コントローラ型ならMerakiとかArubaとかある)

世界中さまよって見つけたネタ元

プレゼン資料

802.11u/Hotspot 2.0の説明資料としてもわかりやすいと思う
https://mum.mikrotik.com//presentations/ID16/presentation_3271_1476849522.pdf

抜粋

"With regard to the limited of time and devices, In this lab we will only test some feature / function of hotspot 2.0 in MikroTik RouterOS"

MikroTik RouterOSではある程度Hotspot 2.0をサポートしている気配

"There is no clue in any mikrotik documentation (wiki, forum, tiktube, mum presentation, etc)"

ただしドキュメントは整備されていない模様

上記プレゼンを受けてのフォーラムのスレッド

https://forum.mikrotik.com/viewtopic.php?f=7&t=116381&p=582861&hilit=passpoint#p582861

技適を取っていて使えそうなデバイスがあるか

あった

RouterOS搭載の11ac無線LANルーター「hAP AC」が販売中、国内向け - AKIBA PC Hotline!

ラトビアMikroTikの11ac無線LANルーターが登場、「hAP AC(RB962UiGS-5HacT2HnT)」がヴィゴネットラボ 秋葉原店で販売中だ。同店による1年間保証が付属し、また技適マークは取得済みとのこと。店頭価格は税込29,700円。

hAP ACは、同社製ルーティングソフトウェア「RouterOS」を搭載した無線LANルーターIEEE 802.11a/b/g/n/acに準拠しており、同店によれば「MikroTik初の5GHz帯11ac対応製品」という。

ヴィゴネットラボ(株式会社ヴィゴラスネット)さんのブログ

RB962UiGS-5HacT2HnT(RouterBOARD hAP AC)発売 : vigonetlabsの色々ブログ

通販

https://vigonetlabs.net/products/detail.php?product_id=661


というわけでポチった。人柱上等。

Android 6.0〜のデバイスで802.1X認証のWi-Fi接続を行う際にCA証明書に関する設定がメーカ毎に微妙に異なるのでまとめてみた

Android 7.1.1 / O Developer Preview (Nexus 5X)

初期値は「CA証明書:選択してください
→「検証しない」を状況に応じて選択しないと、ID/パスワードを入力してもWi-Fiの「接続」が押せない
(あるいは、「システム証明書を使用」を選択 ※ドメインを指定する必要がある)

Android 7.0 (Galaxy S7 Edge)

初期値は「CA証明書:(設定なし)
他の選択肢は表示されない

Android 7.0 (honor8)

初期値は「CA証明書:(指定なし)
他の選択肢として、「システム証明書を使用」「検証しない」
※キャプチャには他の検証で使用した証明書があるので隠した

Android 6.0.1 (SHV33)

初期値は「CA証明書:(指定なし)
他の選択肢は表示されない
※CA証明書:指定なしで接続するとSHARP端末固有の警告表示 (SHARPのAndroid端末で802.1X認証のWi-Fi接続を行う際の挙動を世代別にまとめてみた - pirosapの備忘録)

Hotspot 2.0 試行錯誤その1 (Androidクライアントからの接続)

OdyssysのHotspot 2.0にAndroid 7.1.1の端末でサインアップしようとすると、passpoint.config が落ちてくるがこのファイルの構造はどうなっているのか

passpoint.config (blog用に一部修正)

Q29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PXtib3VuZGFyeX0KQ29udGVu
dC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CgotLXtib3VuZGFyeX0KQ29udGVudC1UeXBlOiBh
cHBsaWNhdGlvbi94LXBhc3Nwb2ludC1wcm9maWxlCkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6
IGJhc2U2NAoKUEUxbmJYUlVjbVZsSUhodGJHNXpQU0p6ZVc1amJXdzZaRzFrWkdZeExqSWlQZ29n
SUR4V1pYSkVWRVErTVM0eVBDOVdaWEpFVkVRKwpDaUFnUEU1dlpHVStDaUFnSUNBOFRtOWtaVTVo
YldVK1VHVnlVSEp2ZG1sa1pYSlRkV0p6WTNKcGNIUnBiMjQ4TDA1dlpHVk9ZVzFsClBnb2dJQ0Fn
UEZKVVVISnZjR1Z5ZEdsbGN6NEtJQ0FnSUNBZ1BGUjVjR1UrQ2lBZ0lDQWdJQ0FnUEVSRVJrNWhi
V1UrZFhKdU9uZG0KWVRwdGJ6cG9iM1J6Y0c5ME1tUnZkREF0Y0dWeWNISnZkbWxrWlhKemRXSnpZ
M0pwY0hScGIyNDZNUzR3UEM5RVJFWk9ZVzFsUGdvZwpJQ0FnSUNBOEwxUjVjR1UrQ2lBZ0lDQThM
MUpVVUhKdmNHVnlkR2xsY3o0S0lDQWdJRHhPYjJSbFBnb2dJQ0FnSUNBOFRtOWtaVTVoCmJXVStX
REU4TDA1dlpHVk9ZVzFsUGdvZ0lDQWdJQ0E4VG05a1pUNEtJQ0FnSUNBZ0lDQThUbTlrWlU1aGJX
VStRM0psWkdWdWRHbGgKYkR3dlRtOWtaVTVoYldVK0NpQWdJQ0FnSUNBZ1BFNXZaR1UrQ2lBZ0lD
QWdJQ0FnSUNBOFRtOWtaVTVoYldVK1EzSmxZWFJwYjI1RQpZWFJsUEM5T2IyUmxUbUZ0WlQ0S0lD
QWdJQ0FnSUNBZ0lEeFdZV3gxWlQ0eU1ERTNMVEF5TFRFMlZERTBPakl4T2pNMldqd3ZWbUZzCmRX
VStDaUFnSUNBZ0lDQWdQQzlPYjJSbFBnb2dJQ0FnSUNBZ0lEeE9iMlJsUGdvZ0lDQWdJQ0FnSUNB
Z1BFNXZaR1ZPWVcxbFBsVnoKWlhKdVlXMWxVR0Z6YzNkdmNtUThMMDV2WkdWT1lXMWxQZ29nSUNB
Z0lDQWdJQ0FnUEU1dlpHVStDaUFnSUNBZ0lDQWdJQ0FnSUR4TwpiMlJsVG1GdFpUNU5ZV05vYVc1
bFRXRnVZV2RsWkR3dlRtOWtaVTVoYldVK0NpQWdJQ0FnSUNBZ0lDQWdJRHhXWVd4MVpUNTBjblZs
ClBDOVdZV3gxWlQ0S0lDQWdJQ0FnSUNBZ0lEd3ZUbTlrWlQ0S0lDQWdJQ0FnSUNBZ0lEeE9iMlJs
UGdvZ0lDQWdJQ0FnSUNBZ0lDQTgKVG05a1pVNWhiV1UrUlVGUVRXVjBhRzlrUEM5T2IyUmxUbUZ0
WlQ0S0lDQWdJQ0FnSUNBZ0lDQWdQRTV2WkdVK0NpQWdJQ0FnSUNBZwpJQ0FnSUNBZ1BFNXZaR1ZP
WVcxbFBrVkJVRlI1Y0dVOEwwNXZaR1ZPWVcxbFBnb2dJQ0FnSUNBZ0lDQWdJQ0FnSUR4V1lXeDFa
VDR5Ck1Ud3ZWbUZzZFdVK0NpQWdJQ0FnSUNBZ0lDQWdJRHd2VG05a1pUNEtJQ0FnSUNBZ0lDQWdJ
Q0FnUEU1dlpHVStDaUFnSUNBZ0lDQWcKSUNBZ0lDQWdQRTV2WkdWT1lXMWxQa2x1Ym1WeVRXVjBh
RzlrUEM5T2IyUmxUbUZ0WlQ0S0lDQWdJQ0FnSUNBZ0lDQWdJQ0E4Vm1GcwpkV1UrVFZNdFEwaEJV
QzFXTWp3dlZtRnNkV1UrQ2lBZ0lDQWdJQ0FnSUNBZ0lEd3ZUbTlrWlQ0S0lDQWdJQ0FnSUNBZ0lE
d3ZUbTlrClpUNEtJQ0FnSUNBZ0lDQWdJRHhPYjJSbFBnb2dJQ0FnSUNBZ0lDQWdJQ0E4VG05a1pV
NWhiV1UrVlhObGNtNWhiV1U4TDA1dlpHVk8KWVcxbFBnb2dJQ0FnSUNBZ0lDQWdJQ0E4Vm1Gc2RX
VSthRzluWlVCbGVHRnRjR3hsTG01bGREd3ZWbUZzZFdVK0NpQWdJQ0FnSUNBZwpJQ0E4TDA1dlpH
VStDaUFnSUNBZ0lDQWdJQ0E4VG05a1pUNEtJQ0FnSUNBZ0lDQWdJQ0FnUEU1dlpHVk9ZVzFsUGxC
aGMzTjNiM0prClBDOU9iMlJsVG1GdFpUNEtJQ0FnSUNBZ0lDQWdJQ0FnUEZaaGJIVmxQbWh2WjJW
d1lYTnpQQzlXWVd4MVpUNEtJQ0FnSUNBZ0lDQWcKSUR3dlRtOWtaVDRLSUNBZ0lDQWdJQ0E4TDA1
dlpHVStDaUFnSUNBZ0lDQWdQRTV2WkdVK0NpQWdJQ0FnSUNBZ0lDQThUbTlrWlU1aApiV1UrVW1W
aGJHMDhMMDV2WkdWT1lXMWxQZ29nSUNBZ0lDQWdJQ0FnUEZaaGJIVmxQbTlrZVhOemVYTXVibVYw
UEM5V1lXeDFaVDRLCklDQWdJQ0FnSUNBOEwwNXZaR1UrQ2lBZ0lDQWdJRHd2VG05a1pUNEtJQ0Fn
SUNBZ1BFNXZaR1UrQ2lBZ0lDQWdJQ0FnUEU1dlpHVk8KWVcxbFBraHZiV1ZUVUR3dlRtOWtaVTVo
YldVK0NpQWdJQ0FnSUNBZ1BFNXZaR1UrQ2lBZ0lDQWdJQ0FnSUNBOFRtOWtaVTVoYldVKwpSbkpw
Wlc1a2JIbE9ZVzFsUEM5T2IyUmxUbUZ0WlQ0S0lDQWdJQ0FnSUNBZ0lEeFdZV3gxWlQ1WGFVWnBJ
RkJ2ZDJWeVpXUWdZbmtnClQyUjVjM041YytLRW9qd3ZWbUZzZFdVK0NpQWdJQ0FnSUNBZ1BDOU9i
MlJsUGdvZ0lDQWdJQ0FnSUR4T2IyUmxQZ29nSUNBZ0lDQWcKSUNBZ1BFNXZaR1ZPWVcxbFBrWlJS
RTQ4TDA1dlpHVk9ZVzFsUGdvZ0lDQWdJQ0FnSUNBZ1BGWmhiSFZsUG05a2VYTnplWE11Ym1WMApQ
QzlXWVd4MVpUNEtJQ0FnSUNBZ0lDQThMMDV2WkdVK0NpQWdJQ0FnSUR3dlRtOWtaVDRLSUNBZ0lE
d3ZUbTlrWlQ0S0lDQThMMDV2ClpHVStDand2VFdkdGRGUnlaV1UrQ2c9PQotLXtib3VuZGFyeX0K
Q29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydApDb250ZW50LVRyYW5zZmVy
LUVuY29kaW5nOiBiYXNlNjQKCk1JSURkVENDQWwyZ0F3SUJBZ0lMQkFBQUFBQUJGVXRhdzVRd0RR
WUpLb1pJaHZjTkFRRUZCUUF3VnpFTE1Ba0dBMVVFQmhNQ1FrVXgKR1RBWEJnTlZCQW9URUVkc2Iy
SmhiRk5wWjI0Z2JuWXRjMkV4RURBT0JnTlZCQXNUQjFKdmIzUWdRMEV4R3pBWkJnTlZCQU1URWtk
cwpiMkpoYkZOcFoyNGdVbTl2ZENCRFFUQWVGdzA1T0RBNU1ERXhNakF3TURCYUZ3MHlPREF4TWpn
eE1qQXdNREJhTUZjeEN6QUpCZ05WCkJBWVRBa0pGTVJrd0Z3WURWUVFLRXhCSGJHOWlZV3hUYVdk
dUlHNTJMWE5oTVJBd0RnWURWUVFMRXdkU2IyOTBJRU5CTVJzd0dRWUQKVlFRREV4SkhiRzlpWVd4
VGFXZHVJRkp2YjNRZ1EwRXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lC
QVFEYQpEdWFaamM2ajQwK0tmdnZ4aTRNbGErcElIL0Vxc0xtVkVRUzk4R1BSNG1kbXp4emR6eHRJ
Sys2TmlZNmFyeW1BWmF2cHh5MFN5NnNjClRIQUhvVDBLTU0wVmpVLzQzZFNNVUJVYzcxRHV4Qzcz
L09sUzhwRjk0RzNWTlRDT1hrTno4a0hwMVdyanNvazZWams0YndZOGlHbGIKS2szRnAxUzRiSW5N
bS9rOHl1WDlpZlVTUEpKNGx0YmNkRzZUUkdIUmpjZEdzblVPaHVnWml0VnRiTlY0RnBXaTZjZ0tP
T3Z5SkJOUApjMVNURTRVNkc3d2VOTFdMQll5NWQ0dXgyeDhna2FzSlUyNlF6bnMzZExsd1I1RWlV
V01XZWE2eHJrRW1DTWdaSzlGR3FraldaQ3JYCmd6VC9MQ3JCYkJsRFNnZUY1OU44OWlGbzcrcnlV
cDkvazVEUEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlYKSFJNQkFmOEVC
VEFEQVFIL01CMEdBMVVkRGdRV0JCUmdlMllhUlEyWHlvbFFMMzBFelRTby8vejlTekFOQmdrcWhr
aUc5dzBCQVFVRgpBQU9DQVFFQTFuUG5mRTkyMEkyLzdMcWl2alRGS0RLMWZQeHNuQ3dydlFtZVU3
OXJYcW9SU0xibENLT3p5ajFoVGROR0NiTSt3NkRqClkxVWI4cnJ2clRuaFE3azRvK1l2aWlZNzc2
QlFWdm5HQ3YwNHpjUUxjRkdVbDVnRTM4TmZsTlVWeVJSQm5NUmRkV1FWRGY5Vk1PeUcKai84Tjd5
eTVZMGIycXZ6ZnZHbjlMaEpJWkpyZ2xmQ203eW1QQWJFVnRRd2RwZjVwTEdra2VCNnpweHh4WXU3
S3lKZXNGMTJLd3ZoSApobTRxeEZZeGxkQm5pWVVyK1d5bVhVYWRES3FDNUpsUjNYQzMyMVk5WWVS
cTRWelc5djQ5M2tITUI2NWpVcjlUVS9RcjZjZjl0dmVDClg0WFNRUmpiZ2JNRUhNVWZwSUJ2RlNE
SjNneUlDaDNXWmxYaS9FakpLU1pwNEE9PQotLXtib3VuZGFyeX0tLQoK

結論から言えば、これはBASE64エンコードされたファイルである。
デコードしてみる。

$ base64 -d passpoint.config

Content-Type: multipart/mixed; boundary={boundary}
Content-Transfer-Encoding: base64

--{boundary}
Content-Type: application/x-passpoint-profile
Content-Transfer-Encoding: base64

PE1nbXRUcmVlIHhtbG5zPSJzeW5jbWw6ZG1kZGYxLjIiPgogIDxWZXJEVEQ+MS4yPC9WZXJEVEQ+
CiAgPE5vZGU+CiAgICA8Tm9kZU5hbWU+UGVyUHJvdmlkZXJTdWJzY3JpcHRpb248L05vZGVOYW1l
PgogICAgPFJUUHJvcGVydGllcz4KICAgICAgPFR5cGU+CiAgICAgICAgPERERk5hbWU+dXJuOndm
YTptbzpob3RzcG90MmRvdDAtcGVycHJvdmlkZXJzdWJzY3JpcHRpb246MS4wPC9EREZOYW1lPgog
ICAgICA8L1R5cGU+CiAgICA8L1JUUHJvcGVydGllcz4KICAgIDxOb2RlPgogICAgICA8Tm9kZU5h
bWU+WDE8L05vZGVOYW1lPgogICAgICA8Tm9kZT4KICAgICAgICA8Tm9kZU5hbWU+Q3JlZGVudGlh
bDwvTm9kZU5hbWU+CiAgICAgICAgPE5vZGU+CiAgICAgICAgICA8Tm9kZU5hbWU+Q3JlYXRpb25E
YXRlPC9Ob2RlTmFtZT4KICAgICAgICAgIDxWYWx1ZT4yMDE3LTAyLTE2VDE0OjIxOjM2WjwvVmFs
dWU+CiAgICAgICAgPC9Ob2RlPgogICAgICAgIDxOb2RlPgogICAgICAgICAgPE5vZGVOYW1lPlVz
ZXJuYW1lUGFzc3dvcmQ8L05vZGVOYW1lPgogICAgICAgICAgPE5vZGU+CiAgICAgICAgICAgIDxO
b2RlTmFtZT5NYWNoaW5lTWFuYWdlZDwvTm9kZU5hbWU+CiAgICAgICAgICAgIDxWYWx1ZT50cnVl
PC9WYWx1ZT4KICAgICAgICAgIDwvTm9kZT4KICAgICAgICAgIDxOb2RlPgogICAgICAgICAgICA8
Tm9kZU5hbWU+RUFQTWV0aG9kPC9Ob2RlTmFtZT4KICAgICAgICAgICAgPE5vZGU+CiAgICAgICAg
ICAgICAgPE5vZGVOYW1lPkVBUFR5cGU8L05vZGVOYW1lPgogICAgICAgICAgICAgIDxWYWx1ZT4y
MTwvVmFsdWU+CiAgICAgICAgICAgIDwvTm9kZT4KICAgICAgICAgICAgPE5vZGU+CiAgICAgICAg
ICAgICAgPE5vZGVOYW1lPklubmVyTWV0aG9kPC9Ob2RlTmFtZT4KICAgICAgICAgICAgICA8VmFs
dWU+TVMtQ0hBUC1WMjwvVmFsdWU+CiAgICAgICAgICAgIDwvTm9kZT4KICAgICAgICAgIDwvTm9k
ZT4KICAgICAgICAgIDxOb2RlPgogICAgICAgICAgICA8Tm9kZU5hbWU+VXNlcm5hbWU8L05vZGVO
YW1lPgogICAgICAgICAgICA8VmFsdWU+aG9nZUBleGFtcGxlLm5ldDwvVmFsdWU+CiAgICAgICAg
ICA8L05vZGU+CiAgICAgICAgICA8Tm9kZT4KICAgICAgICAgICAgPE5vZGVOYW1lPlBhc3N3b3Jk
PC9Ob2RlTmFtZT4KICAgICAgICAgICAgPFZhbHVlPmhvZ2VwYXNzPC9WYWx1ZT4KICAgICAgICAg
IDwvTm9kZT4KICAgICAgICA8L05vZGU+CiAgICAgICAgPE5vZGU+CiAgICAgICAgICA8Tm9kZU5h
bWU+UmVhbG08L05vZGVOYW1lPgogICAgICAgICAgPFZhbHVlPm9keXNzeXMubmV0PC9WYWx1ZT4K
ICAgICAgICA8L05vZGU+CiAgICAgIDwvTm9kZT4KICAgICAgPE5vZGU+CiAgICAgICAgPE5vZGVO
YW1lPkhvbWVTUDwvTm9kZU5hbWU+CiAgICAgICAgPE5vZGU+CiAgICAgICAgICA8Tm9kZU5hbWU+
RnJpZW5kbHlOYW1lPC9Ob2RlTmFtZT4KICAgICAgICAgIDxWYWx1ZT5XaUZpIFBvd2VyZWQgYnkg
T2R5c3N5c+KEojwvVmFsdWU+CiAgICAgICAgPC9Ob2RlPgogICAgICAgIDxOb2RlPgogICAgICAg
ICAgPE5vZGVOYW1lPkZRRE48L05vZGVOYW1lPgogICAgICAgICAgPFZhbHVlPm9keXNzeXMubmV0
PC9WYWx1ZT4KICAgICAgICA8L05vZGU+CiAgICAgIDwvTm9kZT4KICAgIDwvTm9kZT4KICA8L05v
ZGU+CjwvTWdtdFRyZWU+Cg==
--{boundary}
Content-Type: application/x-x509-ca-cert
Content-Transfer-Encoding: base64

MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
--{boundary}--

こうなった。
更に、x-passpoint-profile部分を抜き出してデコードしてみる。

<MgmtTree xmlns="syncml:dmddf1.2">
  <VerDTD>1.2</VerDTD>
  <Node>
    <NodeName>PerProviderSubscription</NodeName>
    <RTProperties>
      <Type>
        <DDFName>urn:wfa:mo:hotspot2dot0-perprovidersubscription:1.0</DDFName>
      </Type>
    </RTProperties>
    <Node>
      <NodeName>X1</NodeName>
      <Node>
        <NodeName>Credential</NodeName>
        <Node>
          <NodeName>CreationDate</NodeName>
          <Value>2017-02-16T14:21:36Z</Value>
        </Node>
        <Node>
          <NodeName>UsernamePassword</NodeName>
          <Node>
            <NodeName>MachineManaged</NodeName>
            <Value>true</Value>
          </Node>
          <Node>
            <NodeName>EAPMethod</NodeName>
            <Node>
              <NodeName>EAPType</NodeName>
              <Value>21</Value>
            </Node>
            <Node>
              <NodeName>InnerMethod</NodeName>
              <Value>MS-CHAP-V2</Value>
            </Node>
          </Node>
          <Node>
            <NodeName>Username</NodeName>
            <Value>hoge@example.net</Value>
          </Node>
          <Node>
            <NodeName>Password</NodeName>
            <Value>パスワードがBase64でデコードされたやつ</Value>
          </Node>
        </Node>
        <Node>
          <NodeName>Realm</NodeName>
          <Value>odyssys.net</Value>
        </Node>
      </Node>
      <Node>
        <NodeName>HomeSP</NodeName>
        <Node>
          <NodeName>FriendlyName</NodeName>
          <Value>WiFi Powered by Odyssys&#8482;</Value>
        </Node>
        <Node>
          <NodeName>FQDN</NodeName>
          <Value>odyssys.net</Value>
        </Node>
      </Node>
    </Node>
  </Node>
</MgmtTree>

なるほど。

NTTドコモが配信する「メッセージR/S」をMADOSMAやNexus 5Xで受信する

NTTドコモが配信する「メッセージR/S」*1といったメッセージは、ドコモが販売するAndroidスマートフォン(「ドコモメール」アプリを使用)、あるいはiPhone/iPad(メールアカウント情報が含まれた専用のプロファイルをダウンロードしてインストール)でしか受信ができない。
(所謂キャリアメールは「ドコモメール」として適切な設定を行えばIMAPメールクライアントからdocomo ID/パスワードで認証して利用可能。)

このうち、Android用の「ドコモメール」については、docomo Application Manager*2が必要であり、NTTドコモから販売されているNexus 5Xについては対応機種に含まれていない*3ため、ダウンロード・インストールすることができない。
SIMフリーAndroid機でも同様である。
当然、Windows Phone 8.1 UpdateやWindows 10 Mobileを搭載するMADOSMAでも通常の方法ではメッセージR/Sは受信ができない。

ほとんどがどうでもいい内容のメッセージRであるが、稀に機種変更に使えるクーポンや、ドコモショップからの連絡などが来る場合があるのでなんとなく受信できるようにしておきたい。

「メッセージR/S」の実態はPOP3のメールである

「メッセージR/S」は、ドコモのみが配送を許された専用のメールボックスに配信されたメールを、ユーザがPOP3で受信するサービスである。
しかしながら、POP3のパスワードはユーザに公開されておらず、また複雑な仕組みで動的に自動生成される非常に長いものであるため、ユーザは任意のPOP3クライアントで「メッセージR/S」を受信することは困難である。

このため、iPhoneを別途用意し、メッセージRを受信したい回線のSIMを挿した状態で「iPhone初期設定」のプロファイルをダウンロードする。
Safariでプロファイルをダウンロードすると、自動的にプロファイルのインストールに進んでしまい、プロファイルの内容を解析することができないため、他の手段でファイルとしてプロファイルをダウンロードする。
2015/12/1現在、最も簡単な方法は下記のとおり。

1) App StoreからLS Appsの「Downloads Free」をiPhoneにインストールする。
2) Downloads Freeを使用して「iPhone初期設定」のプロファイルをファイルとしてダウンロードし、その後保存したプロファイルをメールでPCに転送する。
3) PCでテキストエディタを使用してプロファイルを開く。xmlで上から順に「ドコモメール」「メッセージR/S」「ドコモのサービスへのショートカットアイコン」と並んでいるので、メッセージR/SのIncomingPasswordを抜き取る。サーバ設定はプロファイルに書いてある通り。

このようにして抽出した「メッセージR/S」のアカウント情報を、MADOSMAに設定してみると下記のようにメッセージRが受信できるようになる。
SIMを入れ替えてプロファイル抽出の手順を繰り返して設定することにより、複数回線のドコモメール、メッセージR/Sをすべて1台のMADOSMAで受信することも可能で、タイルアイコンが非常にわかりやすくて便利である。

MADOSMA Windows Phoone 8.1)

メッセージR/Sのパスワードが変更されるトリガー

メッセージR/Sのパスワードは動的に生成されるが、プロファイルダウンロード後に変更されたパターン・変更されないパターンは下記の通り。

■プロファイルをSPモード接続したiPhoneからダウンロードする
パスワードが変更されないパターン
→ 当該回線のSIMを、そのままSPモード接続したiPhoneに挿したまま通信
→ 当該回線のSIMを、moperaに接続したMADOSMAに挿して通信
→ 当該回線のSIMを、SPモード接続したSIMフリールーター(MR04LN)に挿して通信

パスワードが変更されたパターン(プロファイルから抽出したパスワードが通らなくなる)
→ 当該回線のSIMを、SPモード接続したMADOSMAに挿して通信(moperaに戻したら旧パスワードで認証通った。ラグがある?)
→ 当該回線のSIMを、SPモード接続したNexus 5Xに挿して通信 
→ 当該回線のSIMを、SPモード接続したXperiaに挿して通信

Fire TV Stickのセットアップ時に、amazon.comにもアカウントがある人は事前にamazon.co.jpと別のパスワードに変えておかないとはまります

Fire TV Stickが届いた。
けっこう嵌ったので、うろ覚えだけどメモ。

■はまる条件
amazon.co.jp と amazon.com に同じメールアドレスでアカウントを持っている場合。

今回の事象では、amazon.co.jp に pirosap@example.com (パスワード hoge_us)でアカウントがあり、
     かつ amazon.com にも pirosap@example.com(パスワード hoge_jp)でアカウントがあり、
両方にクレジットカードを登録していた。
パスワードを変えていたのはたまたま。

■はまった事例
FireTVを起動し、初期セットアップ。
Amazonアカウントでサインインしな、と言うので パスワード hoge_us でサインインした。(※第1の誤り
後で気づいたが、ここでUS版にログインしてしまっていた。

いきなり英語のアニメーションが始まり、全編英語でFire TV Stickの使い方を説明してくれた。
みんなこれで使い方わかるのかな???ってなった。(この時点ではまだ気づいていない)

Prime会員になったら楽しいよ、今なら30日Free Trialだよ、と出るので、「いや俺プライム会員のはずだけどな?」と思いながらFree Trialを押した(※第2の誤り
"Pirosap Hoge"さんのアカウントにFire TVを紐づけますか?的なメッセージが出たので、よろしく!とやった(※第3の誤り 2と3は逆だったかもしれない。

UIは日本語なんだけど、表示される映画がほとんどみたことないものばかり。日本語コンテンツが無い。
これは知ってるなー、とBack to the Futureを見つけたが、視聴しようとすると

INVALID_GEO_IP

というエラーが出て何も視聴できない。
唯一Back to the Futureの予告編が英語で見れたぐらい。

何かおかしいなー?と思いつつ、INVALID_GEO_IPってことはうちのIPアドレスが日本と思われてないのか・・・?って考えているうちに
ふと去年USのAmazonからお取り寄せをしたことがあるのを思い出した。

PCでamazon.co.jpにログインしてみると、Fire TV Stickに入力したパスワードとそういえば違ってhoge_jpだった。
ここで気づいて、amazon.comhoge_usでログインしてみるとログインできた。

■結論
Fire TV Stickを使うときに、amazon.comにもアカウントある人は事前にamazon.comamazon.co.jpのパスワードを変えておく。
Fire TV Stickは恐らく内部で、まずamazon.comに認証しにいって、認証失敗すると次にamazon.co.jpに認証を試みるのではないかと思われる。

amazon.co.jpのパスワードを使ってサインインすると、ちゃんと日本版にログインできて、見たことがあるコンテンツがいっぱいでハッピーになれる。
誤ってUS版にログインしてしまっても、IPアドレスから地域を判別しているので視聴可能区域外と判定されて何も見れない。

■あとしまつ
上記にはまっちゃった人は、一旦Fire TVからamazonアカウントの紐づけを解除した上で、amazon.co.jpのパスワードでサインインしなおす。

■ドジっこのあとしまつ
第2の誤りで、US版のPrime会員のFree Trialをポチってしまっていて、かつ有効なクレジットカードが登録されているので、30日経過すると課金される。
amazon.comにログインして、Prime会員の継続を"Do not continue"で止めておくこと。