しょんぼり技術メモ

まいにちがしょんぼり

PKCS#11対応USBトークンをいじる

OpenSCを使ってPKCS#11対応のUSBトークンにアクセスするメモ。

http://www.opensc-project.org/opensc/からソースをダウンロードして、インストーる。

# yum install libtool-ltdl libtool-ltdl-devel
# ./configure --prefix=/usr/local/opensc --enable-openssl --enable-doc
# make -j8
# make install

/usr/local/opensc/bin/pkcs11-tool がお目当てのツール。
このツールを使うには、対象となるUSBトークン用のライブラリが必要。
恐らくドライバと一緒にインストールされているはず。

自分が持っている、ePass2000では、/usr/local/ngsrv/libepsng_p11.so.1 というファイル。
pkcs11-toolを使う際には、毎回必ず--moduleオプションでライブラリを指定してやる必要がある。

トークン全体に関する情報を取得(--show-info)

--show-info オプションで、トークン全体に関する情報を取得できる。

$ /usr/local/opensc/bin/pkcs11-tool --module=/usr/local/ngsrv/libepsng_p11.so.1 --show-info
Cryptoki version 2.11
Manufacturer     Feitian Technologies Co., Ltd.
Library          EnterSafe PKCS#11 Library (ver 1.21)

スロット情報を取得(--list-slots)

--list-slots オプションで、トークンのスロット情報を取得できる。

$ /usr/local/opensc/bin/pkcs11-tool --module=/usr/local/ngsrv/libepsng_p11.so.1 --list-slots
Available slots:
Slot xxxxxxxxxx          FT SCR2000 0 0
  token label:   ePass2000
  token manuf:   Feitian Technologies Co., Ltd.
  token model:   ePass2000
  token flags:   rng, login required, PIN initialized, token initialized, other flags=0x880000
  serial num  :  xxxxxxxxxxxxxxxx
Slot xxxxxxxxxx          (empty)

トークンがサポートする機能一覧を取得(--list-mechanisms)

--list-mechanisms オプションで、トークンがサポートしている演算機能一覧を取得できる。

$ /usr/local/opensc/bin/pkcs11-tool --module=/usr/local/ngsrv/libepsng_p11.so.1 --list-mechanisms
Supported mechanisms:
  RSA-PKCS-KEY-PAIR-GEN, keypairgen
  RSA-PKCS, digest, sign, verify, wrap, unwrap, encrypt, decrypt, other flags=0xa5000
  RSA-X-509, digest, sign, verify, wrap, unwrap, encrypt, decrypt, other flags=0x25000
  MD2-RSA-PKCS, sign, verify
  MD5-RSA-PKCS, sign, verify
  SHA1-RSA-PKCS, sign, verify
  DSA-KEY-PAIR-GEN, keypairgen
  DSA, sign, verify
  DH-PKCS-KEY-PAIR-GEN, keypairgen
  DH-PKCS-DERIVE, other flags=0x80000
  RC2-KEY-GEN, other flags=0x8000
  RC2-ECB, wrap, unwrap, encrypt, decrypt, other flags=0x20000
  RC2-CBC, wrap, unwrap, encrypt, decrypt, other flags=0x20000
  RC4-KEY-GEN, other flags=0x8000
  RC4, encrypt, decrypt
  DES-KEY-GEN, other flags=0x8000
  DES-ECB, wrap, unwrap, encrypt, decrypt, other flags=0x20000
  DES-CBC, wrap, unwrap, encrypt, decrypt, other flags=0x20000
  DES2-KEY-GEN, other flags=0x8000
  DES3-KEY-GEN, other flags=0x8000
  DES3-ECB, wrap, unwrap, encrypt, decrypt, other flags=0x20000
  DES3-CBC, wrap, unwrap, encrypt, decrypt, other flags=0x20000
  MD2, digest
  MD5, digest
  SHA-1, digest

格納されているオブジェクト一覧を取得する(--list-objects)

--list-objects オプションで、トークンに格納されているオブジェクト(証明書や公開鍵など)の一覧を取得できる。

$ /usr/local/opensc/bin/pkcs11-tool --module=/usr/local/ngsrv/libepsng_p11.so.1 --list-objects
Certificate Object, type = X.509 cert
  label:      hogehoge's FOOBAR CA ID
  ID:         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Certificate Object, type = X.509 cert
  label:      FOOBAR CA's FOOBAR CA ID
  ID:         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Public Key Object; RSA 1024 bits
  label:      hogehoge's FOOBAR CA ID
  ID:         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  Usage:      encrypt, verify, wrap

この例では、FOOBAR CAのCA証明書と、そのCAで署名されたhogehogeの証明書、公開鍵が格納されている。

格納されている証明書をファイルに書き出す(--read-object, --label, --type)

--read-object オプションで、指定したオブジェクトを取得できる。
--type, --label オプションで、取得するオブジェクトを指定する。
ここでは、hogehogeの証明書を取得してみる。

$ /usr/local/opensc/bin/pkcs11-tool --module=/usr/local/ngsrv/libepsng_p11.so.1 \
    --read-object --label="hogehoge's FOOBAR CA ID" --type="cert" > cert.der

こうすることで、バイナリ(DER)形式の証明書がcert.derに書き出される。

opensslのx509コマンドを利用することで、書き出した証明書を確認できる。

$ openssl x509 -in cert.der -inform der -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 2 (0x2)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: (略)
        Validity
            Not Before: (略)
            Not After : (略)
        Subject: (略)
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):(略)
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Cert Type:
                SSL Client, S/MIME
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                (略)
            X509v3 Authority Key Identifier:
                (略)

    Signature Algorithm: sha1WithRSAEncryption
        (略)