#はじめに
ラズパイにFIDO2セキュリティキーを接続してCTAPコマンドでお話してみました。
- FIDOとかCTAPって何?
- CTAP
#環境
- ラズパイ:Raspberry Pi 3 Model b+
- ラズパイのOS:raspbian stretch (2019-04-08)
- 光らせるFIDO2セキュリティキー:Security Key by Yubico
- 言語:Python 3.5.3
####補足
#####ラズパイのバージョンについて
2019/7/30時点でRaspbinはBusterというバージョンなんですが、これ新しすぎてちょっとアレなんで一つ前のStrechというバージョンを使います。Strechをインストールする方法については以下を参考にしました。
→参考:Raspbian Busterリリース!Stretchとの違いとStretchの入手方法
#####ここまでセットアップした状態から始めます
- ラズビアンstrechはセットアップ完了して、ラズパイ起動できる状態
- Wifi接続済み
- 日本語入力システムインストール済み
- VNC・SSH接続できる状態
#サンプルプロラム実行までの手順
###pythonのバージョン確認
pythonの2と3が最初から入っています。今回はpython3でやります。
pi@raspberrypi:~ $ python --version
Python 2.7.13
pi@raspberrypi:~ $ python3 --version
Python 3.5.3
###openssl 1.0.2のインストール
まず、OpenSSLをいれます。
pipでインストールできませんでした。どうやらラズパイ用のOpenSSLはないらしく、仕方がないので、ソースを落としてきてビルドします。
wget https://www.openssl.org/source/openssl-1.0.2.tar.gz
tar xvf openssl-1.0.2.tar.gz
cd openssl-1.0.2
./config zlib shared no-ssl2
make && sudo make install
// makeには30分くらいかかります
参考:Raspberry Piに最新版の各種ツール・言語・ライブラリをインストールする
###サンプルソースのダウンロード
YubicoのサンプルをGitHubから落とします。
どこか作業のフォルダを作ってその中で実行しましょう。
注意:Python3なのでpip3です
// gitでソースを落とす
git clone https://github.com/Yubico/python-fido2.git
// fido2をインストールする
pip3 install fido2
// インストールに成功すると
// Successfully installed asn1crypto-0.24.0 cffi-1.12.3 cryptography-2.7 fido2-0.7.0 pycparser-2.19 six-1.12.0
// と出る
// ちゃんとfido2がインストールされたかどうか確認
pip3 list | grep fido2
// fido2 (0.7.0)とか出ればOK
###サンプルソースの実行
落としてきたサンプルソースのexamplesディレクトリにpyが今回実行するサンプルです。
####get_info.py
FIDO2キーの情報をGETして出力するサンプルです。
ラズパイのUSBにYubikeyを刺して、get_info.pyを実行します。
Yubikeyがビカビカ光って、結果が表示されたらOK。
キーにGetInfoコマンドを送ってGETしたキーの情報を出力したあと、Winkコマンドを送ってキーを光らせているようです。
注意:pyの実行はpython3
pi@raspberrypi:~/work/python-fido2-master/examples $ python3 get_info.py
// ここからが実行結果(適当に改行いれてます)
CONNECT: CtapHidDevice(/dev/hidraw1)
CTAPHID protocol version: 2
DEVICE INFO: Info(
versions: ['U2F_V2', 'FIDO_2_0'],
extensions: ['hmac-secret'],
aaguid: h'fa2b99dc9e3942578f924a30d23c4118',
options: {'clientPin': True, 'up': True, 'rk': True, 'plat': False},
max_message_size: 1200, pin_protocols: [1]
)
WINK sent!
####credential.py
キーにクレデンシャルを登録して、認証を行うサンプルです。
CTAPの以下のコマンドが使われています。
- authenticatorMakeCredential
- authenticatorGetAssertion
- authenticatorGetNextAssertion
- authenticatorClientPIN
pi@raspberrypi:~/work/python-fido2/examples $ python3 credential.py
Use USB HID channel.
Please enter PIN:
// ◆ここでPINを入力してENTERします
Touch your authenticator device now...
// ◆ここでキーをタッチします
// キーにクレデンシャルを登録して成功すると以下のログが出る
New credential created!
CLIENT DATA: {
"origin": "https://example.com",
"clientExtensions": {},
"challenge": "Y2hhbGxlbmdl",
"type": "webauthn.create"
}
ATTESTATION OBJECT: AttestationObject(
fmt: 'packed',
auth_data: AuthenticatorData(
rp_id_hash: h'a379a6f6...2fa13d2125586ce1947',
flags: 0x45,
counter: 66,
credential_data: AttestedCredentialData(
aaguid: h'fa2b99dc9e3942578f924a30d23c4118',
credential_id: h'9b26...f262d2bfbb3525cf8b',
public_key: {
1: 2,
3: -7,
-1: 1,
-2: b'\x00\x...84\x99`\x9f/\xda',
-3: b'\x98\x...x9f\x90J\xe5\xda'
}
),
att_statement: {
'alg': -7,
'sig': b'0F\x02!\...xd3+\xaap\xa7|\x1bBKA\xd9X',
'x5c': [
b'0\x82\x02\xbc9...9\xff\xbc\x93\x8c\xa0\xb47'
]
}
)
CREDENTIAL DATA: AttestedCredentialData(
aaguid: h'fa2b99dc9e3942578f924a30d23c4118',
credential_id: h'9b262e9c0fe5fa34d7a687b5cc1b81abd9ecebee055de2f9c04985b0b691c41f059f4ab3e043bec57426863ba1f05288de1f27d36b8e935762d2bfbb3525cf8b',
public_key: {
1: 2,
3: -7,
-1: 1,
-2: b'\x00\xbdm\xce\xc2\xc2\xb0!#u\xc18\xb9Z\xd5R[A\x14\xea\xfe\xc6F\xe1T\xcc\x84\x99`\x9f/\xda',
-3: b'\x98\x89,\xa9\xacv\x92\xa9q7\xee;\xa3\xf1\x7f\x1f-%\xb0[\x80\xeeR\xf0\xb8|\xee\x9f\x90J\xe5\xda'
}
Attestation signature verified!
// 登録完了した、という意味。
// 認証のテスト
Touch your authenticator device now...
// ◆もう一度キーにタッチします。
Credential authenticated!
CLIENT DATA: {
"origin": "https://example.com",
"clientExtensions": {},
"challenge": "Q0hBTExFTkdF",
"type": "webauthn.get"
}
ASSERTION DATA: AssertionResponse(
credential: {
'id': b"\x9b&.\x9c\xd2\xbf\xb\xcf\x8b...",
'type': 'public-key'
},
auth_data: AuthenticatorData(
rp_id_hash: h'a379ad30ab13d21255ce1947...',
flags: 0x05,
counter: 67
),
signature: h'3044022016c0224af4814eaa6cb...'
)
Assertion signature verified!
// 認証も完了した、という意味
#ラズパイでVSCODEでpyをデバック実行してみる
さて、次はこのサンプルプログラムをデバック実行してみたくなります。
ラズパイに開発環境を導入します。
開発環境は今最もモダンなVSCODEにします。
(VSCODEはラズパイではcode-ossっていう名前です)
このcode-ossですが、セットアップにトラップが2つあります。(2019/7/30時点)
###トラップ1
あちこちのサイトで以下の2発のコマンドでインストールしていますが、私の環境ではエラーになりました。このやり方はNGです。
sudo -s
. <( wget -O - https://code.headmelted.com/installers/apt.sh )
// 色々処理が走って、最後に以下のエラーメッセージが出てインストール失敗する
// E: 認証されていないパッケージがあり、-y オプションが --allow-unauthenticated な しで使用されました
// Visual Studio Code install failed.
###トラップ2
code-ossをインストールできても、起動したら真っ黒なウィンドウがでてくるだけでなんもできません。最新バージョンのモジュールはダメみたいです。
参考:RaspberryPiにVSCodeをインストールして起動してもウィンドウに何も表示されない問題
###というわけで、上記トラップを回避してcode-ossをセットアップする手順は以下の通り
- guiを使うので、SSHではなくVNC接続するか、ラズパイにモニタキーボードつないで直でやりましょう。
- どっか作業ディレクトリを作成して、その中でやりましょう。
####1)apt.shを落としてくる
wget https://code.headmelted.com/installers/apt.sh
####2)テキストエディタでapt.shを開いて以下の行を変更する
apt-get install -t ${repo_name} -y ${code_executable_name};
#apt-get install -t ${repo_name} -y --allow-unauthenticated ${code_executable_name};
#apt-get install -t ${repo_name} -y ${code_executable_name};
apt-get install -t ${repo_name} -y --allow-unauthenticated ${code_executable_name};
####3)apt.shを実行して再起動する
sudo -s
. apt.sh
// こんなコメントが出たらOK
Installation complete!
You can start code at any time by calling "code-oss" within a terminal.
A shortcut should also now be available in your desktop menus (depending on your distribution).
// rebootしましょう
reboot
####4)code-ossをダウングレードする
sudo apt-get install code-oss=1.29.0-1539702286
// コマンドが成功したら、更新しないマークを付けてreboot
sudo apt-mark hold code-oss
reboot
####5)code-oss起動!
code-oss
あとは適当にoss-codeを操作していくと、勝手にインストールがリコメンドされるので入れていきます。
- japanese
- Python
- Linter Pylint
ラズパイなのでさくさくはいかないですが、デバック実行もOK。
#おつかれさまでした
いがいと簡単!