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 (略)