NSS Security Tool と openssl を無理やり連携させて pkcs12 を開く

本当に誰得という話なんだが

> rm -rf *
> tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' </dev/urandom | dd bs=32 count=1 2>/dev/null > pass
> tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' </dev/urandom | dd bs=1024 count=1 2> /dev/null > noise
> certutil -N -d . -f pass
> certutil -S -k rsa -n testcert -s "cn=test,o=example,c=jp" -t P -x -f pass -d . -z noise
> pk12util -o test.p12 -n testcert -d . -k pass -W "" &>/dev/null
> openssl pkcs12 -in test.p12 -nodes -passin pass:

やってることについて一行ずつ解説する。

最初にディレクトリを空にする。以降、certutilとpk12utilはこのディレクトリ上に勝手に出来る cert8.db, key3.db, secmod.db を利用して証明書と秘密鍵を操作するため、一旦消してステートをなくす。

次にパスワードとノイズの作成を /dev/urandom を使いながらやる。noise としてはイマイチなことになっているが、ご愛嬌。この変なコマンドライン行はSimpleSAMLphpのconfig.phpでsaltを設定する項目のコメント部分に記載してあるものを丸々使ってる。

certutil -N -d . -f pass は「新しいデータベースを作れ。ディレクトリは .、パスワードの入力をユーザとインタラクティブにやらずにパスワードファイルとして pass を使え」

次は「新しい鍵ペアを作れ。RSAを持ちいること。データベース内のニックネームは testcert、証明書オーナーは cn=test2,o=example,c=jp、 認証属性は trusted peer。 独立したCAに頼らない (自己署名)。パスワードは pass ファイル、ノイズはユーザに頼まないで noise ファイルを使え」

次は「現在のディレクトリにある cert8.db, key3db, secmod.db から testcert というニックネームの鍵ペアを抽出してPKCS12フォーマットで test.p12 にエクスポートしろ。 このスロット (PKCS11 の用語。今回はさっき作ったデータベースそのもの) のパスワードは pass から取り、エクスポートするpkcs12ファイルにはパスワードは設定しない」

OpenSSLのコマンドラインによってpkcs12 ファイルの中身が出てくる。

MAC verified OK
Bag Attributes
    friendlyName: testcert
    localKeyID: 66 8C 74 BF 46 C1 7D FB 7C D6 D0 D4 A7 14 A8 46 22 98 7F B1 
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKiRfOOScBqWCXfr
T1l4EtYiodciKVehxEFOdnVFnt3hK78h1QRxEYahloVaiBDZ6WdQdOoXBQ53VGQV
mFEf+6bcjJjpyH3UE0m66pn7Hd154Uqsh3KJk7bhhvqjIHrnj4x6e8IdDGlprSzv
djRfd88J5jXdPkVFkvkgtddd4IvVAgMBAAECgYBNO5N4BSEd3T5rVkHd4TjoKafz
FLDSeMidj2CQ7JwUVtWfVdXumguInsKDSO5sohrhfiiDFJb5gM0GqipGiRvYInq8
9nfpbnWFMPt3oNL0TPTk3SHoCAK4pXwcKqxcgtyS98YfPFHpTjeg2FeA2skNJmlp
hyhBq1Bul76pHBG/xQJBANCpCwAA2CdmFgSPGZtSNJN/zG8Yv56Z6YnUJwBa4R/w
GjBoaEmSuN4zvineeIr6A9rNB3QnNbpqI7v683cTkhcCQQDOz+hPG8DvuQey1thz
R728xiGtOQunVdbsdNKSbHaeOLSFsdwg5UczXuip2OTGvYPYiFSxw7/bn7L5UCZ0
hiDzAkAd/EzyYSyu7MK5QP9DDNs1XyY3yOywlBm1juFT8btsZYq97iMef5FFjVYE
mk3kWu124gPyMzhLY7li6DtYn11dAkEApTu1JqdM8frKLNe8nfY+oLlIJMcECZDq
o4b+ymAAMY+qo3qkHmAxD9kPWMxilGrMEU9zI4f7HLSuYMTpxIV5gwJAeL6zQ6IA
wX517zIBhHxFR24lG6oNp3U/mgdcYSYpob9LILd48+FsDE4N/FtxrU1BGBT4ZuRB
dQfLzJLui5346A==
-----END PRIVATE KEY-----
Bag Attributes
    friendlyName: testcert
    localKeyID: 66 8C 74 BF 46 C1 7D FB 7C D6 D0 D4 A7 14 A8 46 22 98 7F B1 
subject=/C=jp/O=example/CN=test
issuer=/C=jp/O=example/CN=test
-----BEGIN CERTIFICATE-----
MIIB1DCCAT2gAwIBAgIFAJrnfHAwDQYJKoZIhvcNAQEFBQAwLjELMAkGA1UEBhMC
anAxEDAOBgNVBAoTB2V4YW1wbGUxDTALBgNVBAMTBHRlc3QwHhcNMTMwMzA2MDY0
MjA2WhcNMTMwNjA2MDY0MjA2WjAuMQswCQYDVQQGEwJqcDEQMA4GA1UEChMHZXhh
bXBsZTENMAsGA1UEAxMEdGVzdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
qJF845JwGpYJd+tPWXgS1iKh1yIpV6HEQU52dUWe3eErvyHVBHERhqGWhVqIENnp
Z1B06hcFDndUZBWYUR/7ptyMmOnIfdQTSbrqmfsd3XnhSqyHcomTtuGG+qMgeueP
jHp7wh0MaWmtLO92NF93zwnmNd0+RUWS+SC1113gi9UCAwEAATANBgkqhkiG9w0B
AQUFAAOBgQAqoKIUrVHzeWiyahVxOj1Jab3Di3Tn/4B3GkWKLXi7QsJ2ebKsmsWI
XPsyPeNnvfgC7UvOcLIeu47rFhy6bFs2pqeF/Gxtnq06aQJgZLleeBeZxZpQDnPQ
vB0H8JhnkL+qq4j6vNJAPWWFiLtvfMg6pnHq8Pk+MZSoBqp7SPc9Xg==
-----END CERTIFICATE-----

「Bad Attributes」に見えるが「Bag Attributes」。bagはpkcs12 の用語。

BEGINとENDに囲われている部分がそれぞれ秘密鍵と証明書。実用に堪えるものではないが。

それらを読みたければエディタでコピって

> openssl rsa -inform pem -in ~/priv.pem -text
> openssl x509 -in ~/pub.pem -text

などとやれば良い。

このブログの人気の投稿

WiiUのコントローラが通信不良に陥った話

LibreOfficeで表紙、目次、本体でフッターのページ番号のスタイルを変える

技術書典2 あ-03 『もわねっとのPythonの本』