MikroTik hAP acで作るHotspot 2.0環境 (Android編)
■前説
hAP ac側の環境については前回参照。
MikroTik hAP acで作るHotspot 2.0環境 (iOS編) - pirosapの備忘録
■Android 7.1.1/Android O Developer Previewで接続確認できたプロファイル
※現状、Android 7.0を搭載した端末では、一部(Samsung Galaxy系のもの)を除き接続確認ができていない
Qua tab px → プロファイルはインストール可能であるが、Wi-Fiの詳細設定よりPasspointを有効にしても接続されない)
honor8 → プロファイルインストール時にエラー
検証環境
FreeRADIUSに登録したユーザ名: hoge@pirosap.tech
FreeRADIUSに登録したパスワード: hs20!test17
FreeRADIUSサーバは、Let's Encryptで取得したサーバ証明書を使用している
サンプルプロファイル
プロファイルファイル名:pirosap-tech.config
<a href="pirosap-tech.config">pirosap-tech.config</a>
な感じでWEBサーバ上に置いて、ブラウザでリンクを踏んでインストールした
WEBサーバ側には下記のような設定が必要
(Apacheの場合) AddType application/x-wifi-config .config
プロファイルの構成
実際のプロファイルは下記のようになっている。
これは、後述する(A)をBase64でエンコードしたものである。
<実際のプロファイル>
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 VSthRzluWlR3dlZtRnNkV1UrQ2lBZ0lDQWdJQ0FnSUNBOEwwNXZaR1UrQ2lBZwpJQ0FnSUNBZ0lD QThUbTlrWlQ0S0lDQWdJQ0FnSUNBZ0lDQWdQRTV2WkdWT1lXMWxQbEJoYzNOM2IzSmtQQzlPYjJS bFRtRnRaVDRLCklDQWdJQ0FnSUNBZ0lDQWdQRlpoYkhWbFBtRklUWGxOUTBZd1dsaE9NRTFVWXow OEwxWmhiSFZsUGdvZ0lDQWdJQ0FnSUNBZ1BDOU8KYjJSbFBnb2dJQ0FnSUNBZ0lEd3ZUbTlrWlQ0 S0lDQWdJQ0FnSUNBOFRtOWtaVDRLSUNBZ0lDQWdJQ0FnSUR4T2IyUmxUbUZ0WlQ1UwpaV0ZzYlR3 dlRtOWtaVTVoYldVK0NpQWdJQ0FnSUNBZ0lDQThWbUZzZFdVK2NHbHliM05oY0M1MFpXTm9QQzlX WVd4MVpUNEtJQ0FnCklDQWdJQ0E4TDA1dlpHVStDaUFnSUNBZ0lEd3ZUbTlrWlQ0S0lDQWdJQ0Fn UEU1dlpHVStDaUFnSUNBZ0lDQWdQRTV2WkdWT1lXMWwKUGtodmJXVlRVRHd2VG05a1pVNWhiV1Ur Q2lBZ0lDQWdJQ0FnUEU1dlpHVStDaUFnSUNBZ0lDQWdJQ0E4VG05a1pVNWhiV1UrUm5KcApaVzVr YkhsT1lXMWxQQzlPYjJSbFRtRnRaVDRLSUNBZ0lDQWdJQ0FnSUR4V1lXeDFaVDVPUjBnZ2RHVnpk R0psWkNCaWVTQndhWEp2CmMyRndMblJsWTJnOEwxWmhiSFZsUGdvZ0lDQWdJQ0FnSUR3dlRtOWta VDRLSUNBZ0lDQWdJQ0E4VG05a1pUNEtJQ0FnSUNBZ0lDQWcKSUR4T2IyUmxUbUZ0WlQ1R1VVUk9Q QzlPYjJSbFRtRnRaVDRLSUNBZ0lDQWdJQ0FnSUR4V1lXeDFaVDV1WjJndWNHbHliM05oY0M1MApa V05vUEM5V1lXeDFaVDRLSUNBZ0lDQWdJQ0E4TDA1dlpHVStDaUFnSUNBZ0lEd3ZUbTlrWlQ0S0lD QWdJRHd2VG05a1pUNEtJQ0E4CkwwNXZaR1UrQ2p3dlRXZHRkRlJ5WldVK0NnPT0KLS17Ym91bmRh cnl9CkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC14NTA5LWNhLWNlcnQKQ29udGVudC1UcmFu c2Zlci1FbmNvZGluZzogYmFzZTY0CgpNSUlEU2pDQ0FqS2dBd0lCQWdJUVJLK3dnTmFqSjdxSk1E bUdMdmhBYXpBTkJna3Foa2lHOXcwQkFRVUZBREEvCk1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGc0lG TnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhGekFWQmdOVkJBTVQKRGtSVFZDQlNiMjkwSUVOQklG Z3pNQjRYRFRBd01Ea3pNREl4TVRJeE9Wb1hEVEl4TURrek1ERTBNREV4TlZvdwpQekVrTUNJR0Ex VUVDaE1iUkdsbmFYUmhiQ0JUYVdkdVlYUjFjbVVnVkhKMWMzUWdRMjh1TVJjd0ZRWURWUVFECkV3 NUVVMVFnVW05dmRDQkRRU0JZTXpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFv Q2dnRUIKQU4rdjZaZFFDSU5YdE14aVpmYVFndXpIMHl4ck1NcGI3Tm5EZmNkQXdSZ1VpK0RvTTNa Skt1TS9JVW1UckU0TwpyejVJeTJYdS9OTWhEMlhTS3RreWo0emw5M2V3RW51MWxjQ0pvNm02N1hN dWVnd0dNb09pZm9vVU1NMFJvT0VxCk9MbDVDakg5VUwyQVpkKzNVV09EeU9LSVllcExZWUhzVW11 NW91SkxHaWlmU0tPZUROb0pqajRYTGg3ZElOOWIKeGlxS3F5NjljSzNGQ3hvbGtIUnl4WHRxcXpU V01Jbi81V2dUZTFRTHlOYXU3RnFja2g0OVpMT014dCsveVVGdwo3Qlp5MVNic09GVTVROUQ4L1Jo Y1FQR1g2OVdhbTQwZHV0b2x1Y2JZMzhFVkFqcXIybTd4UGk3MVhBaWNQTmFECmFlUVFteGtxdGls WDQrVTltNS93QWwwQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlYKSFE4 QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZNU25zYVI3TEhINjIrRkxrSFgveEJWZ2hZa1FNQTBH Q1NxRwpTSWIzRFFFQkJRVUFBNElCQVFDakdpeWJGd0JjcVI3dUtHWTNPcitEeHo5THd3bWdsU0Jk NDlsWlJOSStEVDY5CmlrdWdkQi9PRUlLY2RCb2RmcGdhM2NzVFM3TWdST1NSNmN6OGZhWGJhdVgr NXYzZ1R0MjNBRHExY0Vtdjh1WHIKQXZIUkFvc1p5NVE2WGtqRUdCNVlHVjhlQWxyd0RQR3hyYW5j V1lhTGJ1bVI5WWJLK3JsbU02cFpXODdpcHhaegpSOHNyekptd04walA0MVpMOWM4UERISXloOGJ3 Ukx0VGNtMUQ5U1pJbWxKbnQxaXIvbWQyY1hqYkRhSldGQk01CkpER0ZvcWdDV2pCSDRkMVFCN3dD Q1pBQTYyUmpZSnNXdklqSkV1YlNmWkdMK1QweWpXVzA2WHl4VjNicXhiWW8KT2I4VlpSekk5bmVX YWdxTmR3dllrUXNFamdmYktiWUs3cDJDTlRVUQpNSUlFa2pDQ0EzcWdBd0lCQWdJUUNnRkJRZ0FB QVZPRmMyb0xoZXluQ0RBTkJna3Foa2lHOXcwQkFRc0ZBREEvCk1TUXdJZ1lEVlFRS0V4dEVhV2Rw ZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhGekFWQmdOVkJBTVQKRGtSVFZDQlNiMjkw SUVOQklGZ3pNQjRYRFRFMk1ETXhOekUyTkRBME5sb1hEVEl4TURNeE56RTJOREEwTmxvdwpTakVM TUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVeGxkQ2R6SUVWdVkzSjVjSFF4SXpBaEJnTlZC QU1UCkdreGxkQ2R6SUVWdVkzSjVjSFFnUVhWMGFHOXlhWFI1SUZnek1JSUJJakFOQmdrcWhraUc5 dzBCQVFFRkFBT0MKQVE4QU1JSUJDZ0tDQVFFQW5OTU04RnJsTGtlM2NsMDNnN05vWXpEcTF6VW1H U1hodmI0MThYQ1NMN2U0UzBFRgpxNm1lTlFoWTdMRXF4R2lIQzZQamRlVG04NmRpY2JwNWdXQWYx NUdhbi9QUWVHZHh5R2tPbFpIUC91YVo2V0E4ClNNeCt5azEzRWlTZFJ4dGE2N25zSGpjQUhKeXNl NmNGNnM1SzY3MUI1VGFZdWN2OWJUeVdhTjhqS2tLUURJWjAKWjhoL3BacTRVbUVVRXo5bDZZS0h5 OXY2RGxiMmhvbnpoVCtYaHErdzNCcnZhdzJWRm4zRUs2QmxzcGtFTm5XQQphNnhLOHh1UVNYZ3Zv cFpQS2lBbEtRVEdkTURRTWMyUE1UaVZGcnFvTTdoRDhiRWZ3ekIvb25reEV6MHROdmpqCi9QSXph cms1TWNXdnhJME5IV1FXTTZyNmhDbTIxQXZBMkgzRGt3SURBUUFCbzRJQmZUQ0NBWGt3RWdZRFZS MFQKQVFIL0JBZ3dCZ0VCL3dJQkFEQU9CZ05WSFE4QkFmOEVCQU1DQVlZd2Z3WUlLd1lCQlFVSEFR RUVjekJ4TURJRwpDQ3NHQVFVRkJ6QUJoaVpvZEhSd09pOHZhWE55Wnk1MGNuVnpkR2xrTG05amMz QXVhV1JsYm5SeWRYTjBMbU52CmJUQTdCZ2dyQmdFRkJRY3dBb1l2YUhSMGNEb3ZMMkZ3Y0hNdWFX UmxiblJ5ZFhOMExtTnZiUzl5YjI5MGN5OWsKYzNSeWIyOTBZMkY0TXk1d04yTXdId1lEVlIwakJC Z3dGb0FVeEtleHBIc3NjZnJiNFV1UWRmL0VGV0NGaVJBdwpWQVlEVlIwZ0JFMHdTekFJQmdabmdR d0JBZ0V3UHdZTEt3WUJCQUdDM3hNQkFRRXdNREF1QmdnckJnRUZCUWNDCkFSWWlhSFIwY0Rvdkwy TndjeTV5YjI5MExYZ3hMbXhsZEhObGJtTnllWEIwTG05eVp6QThCZ05WSFI4RU5UQXoKTURHZ0w2 QXRoaXRvZEhSd09pOHZZM0pzTG1sa1pXNTBjblZ6ZEM1amIyMHZSRk5VVWs5UFZFTkJXRE5EVWt3 dQpZM0pzTUIwR0ExVWREZ1FXQkJTb1NtcGpCSDNkdXViUk9iZW1SV1h2ODZqc29UQU5CZ2txaGtp Rzl3MEJBUXNGCkFBT0NBUUVBM1RQWEVmTmpXRGpkR0JYN0NWVytkbGE1Y0VpbGFVY25lOElrQ0pM eFdoOUtFaWszSkhSUkhHSm8KdU0yVmNHZmw5NlM4VGloUnpadm9yb2VkNnRpNldxRUJtdHp3M1dv ZGF0ZytWeU9lcGg0RVlwci8xd1hLdHg4Lwp3QXBJdkpTd3RtVmk0TUZVNWFNcXJTREU2ZWE3M01q MnRjTXlvNWpNZDZqbWVXVUhLOHNvL2pvV1VvSE9VZ3d1Clg0UG8xUVl6KzNkc3prRHFNcDRma2x4 QndYUnNXMTBLWHpQTVRaK3NPUEF2ZXl4aW5kbWprVzhsR3krUXNSbEcKUGZaK0c2WjZoN21qZW0w WStpV2xrWWNWNFBJV0wxaXdCaThzYUNiR1M1ak4ycDhNK1grUTdVTktFa1JPYjNONgpLT3FrcW01 N1RIMkgzZURKQWtTbmg2L0RORnUwUWc9PQotLXtib3VuZGFyeX0tLQoK
上記の元となるXML (A)は、次のような構成になっている。
<XML (A)>
Content-Type: multipart/mixed; boundary={boundary} Content-Transfer-Encoding: base64 --{boundary} Content-Type: application/x-passpoint-profile Content-Transfer-Encoding: base64 (下記B) --{boundary} Content-Type: application/x-x509-ca-cert Content-Transfer-Encoding: base64 (下記C) (下記D) --{boundary}--
上記(A)に埋まっている(B)部分のHotspot2.0関連の情報は、次のXMLファイルをBase64でエンコードしたものである。
<ネタ元のXML ― (B')>
<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)</Value> </Node> <Node> <NodeName>Password</NodeName> <Value>パスワード hs20!test17 をBase64でエンコードした文字列(aHMyMCF0ZXN0MTc=)</Value> </Node> </Node> <Node> <NodeName>Realm</NodeName> <Value>pirosap.tech</Value> </Node> </Node> <Node> <NodeName>HomeSP</NodeName> <Node> <NodeName>FriendlyName</NodeName> <Value>NGH testbed by pirosap.tech</Value> </Node> <Node> <NodeName>FQDN</NodeName> <Value>ngh.pirosap.tech</Value> </Node> </Node> </Node> </Node> </MgmtTree>
上記(B')をBase64でエンコードしたものが(B)となる。
<(B)>
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+aG9nZTwvVmFsdWU+CiAgICAgICAgICA8L05vZGU+CiAg ICAgICAgICA8Tm9kZT4KICAgICAgICAgICAgPE5vZGVOYW1lPlBhc3N3b3JkPC9Ob2RlTmFtZT4K ICAgICAgICAgICAgPFZhbHVlPmFITXlNQ0YwWlhOME1UYz08L1ZhbHVlPgogICAgICAgICAgPC9O b2RlPgogICAgICAgIDwvTm9kZT4KICAgICAgICA8Tm9kZT4KICAgICAgICAgIDxOb2RlTmFtZT5S ZWFsbTwvTm9kZU5hbWU+CiAgICAgICAgICA8VmFsdWU+cGlyb3NhcC50ZWNoPC9WYWx1ZT4KICAg ICAgICA8L05vZGU+CiAgICAgIDwvTm9kZT4KICAgICAgPE5vZGU+CiAgICAgICAgPE5vZGVOYW1l PkhvbWVTUDwvTm9kZU5hbWU+CiAgICAgICAgPE5vZGU+CiAgICAgICAgICA8Tm9kZU5hbWU+RnJp ZW5kbHlOYW1lPC9Ob2RlTmFtZT4KICAgICAgICAgIDxWYWx1ZT5OR0ggdGVzdGJlZCBieSBwaXJv c2FwLnRlY2g8L1ZhbHVlPgogICAgICAgIDwvTm9kZT4KICAgICAgICA8Tm9kZT4KICAgICAgICAg IDxOb2RlTmFtZT5GUUROPC9Ob2RlTmFtZT4KICAgICAgICAgIDxWYWx1ZT5uZ2gucGlyb3NhcC50 ZWNoPC9WYWx1ZT4KICAgICAgICA8L05vZGU+CiAgICAgIDwvTm9kZT4KICAgIDwvTm9kZT4KICA8 L05vZGU+CjwvTWdtdFRyZWU+Cg==
<(C) FreeRADIUSサーバのサーバ証明書を署名しているLet's Encrypt の中間証明書をクロス署名しているIdenTrust のルート証明書>
※―–BEGIN CERTIFICATE―– とか ―–END CERTIFICATE―– とかいらない
DST Root CA X3
※ISRG Root X1は広く信頼されていないため、多くのブラウザで信頼されているIdenTrustのDST Root CA X3でクロス署名されている
Let's Encryptによる説明:https://letsencrypt.org/certificates/
<(D) FreeRADIUSサーバのサーバ証明書を署名しているLets's Encryptの中間証明書>
※―–BEGIN CERTIFICATE―– とか ―–END CERTIFICATE―– とかいらない
Let's Encrypt Authority X3 (IdenTrust cross-signed)
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、IPv4かIPv6か、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デバイスにインストールするプロファイル
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とかある)
世界中さまよって見つけたネタ元
インドネシアのRofiq Fauziさんのプレゼン
プレゼン資料
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の色々ブログ
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)
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 が落ちてくるがこのファイルの構造はどうなっているのか
Android7.1.1のNexus5Xで試したら謎のファイルが落ちてきた pic.twitter.com/oi7Y2rsSkB
— Hiroyuki (@pirosap) 2017年2月16日
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™</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で受信することも可能で、タイルアイコンが非常にわかりやすくて便利である。
メッセージ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に挿して通信