4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ラズパイでYubikeyを光らせてみる

Last updated at Posted at 2019-07-29

#はじめに
ラズパイにFIDO2セキュリティキーを接続してCTAPコマンドでお話してみました。

#環境

####補足
#####ラズパイのバージョンについて
2019/7/30時点でRaspbinはBusterというバージョンなんですが、これ新しすぎてちょっとアレなんで一つ前のStrechというバージョンを使います。Strechをインストールする方法については以下を参考にしました。
→参考:Raspbian Busterリリース!Stretchとの違いとStretchの入手方法

#####ここまでセットアップした状態から始めます

#サンプルプロラム実行までの手順

###pythonのバージョン確認
pythonの2と3が最初から入っています。今回はpython3でやります。

pythonのバージョン確認
pi@raspberrypi:~ $ python --version
Python 2.7.13
pi@raspberrypi:~ $ python3 --version
Python 3.5.3

###openssl 1.0.2のインストール
まず、OpenSSLをいれます。
pipでインストールできませんでした。どうやらラズパイ用のOpenSSLはないらしく、仕方がないので、ソースを落としてきてビルドします。

openssl_1.0.2のインストール
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

get_info.py
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の以下のコマンドが使われています。

credential.py
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です。

code-ossのインストール→失敗
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を実行して再起動する

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をダウングレードする

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起動!
code-oss

image.png

あとは適当にoss-codeを操作していくと、勝手にインストールがリコメンドされるので入れていきます。

  • japanese
  • Python
  • Linter Pylint

ラズパイなのでさくさくはいかないですが、デバック実行もOK。

image.png

#おつかれさまでした
いがいと簡単!

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?