自堕落な技術者の日記

基本は喰ってるか飲んでるかですが、よく趣味でカラオケ・PKI・署名・認証・プログラミング・情報セキュリティをやっています。旅好き。テレビ好きで芸能通

OpenSSL

OpenSSLで対応しているDirectoryStringType一覧

自堕落な技術者の日記 : OpenSSLでNumericStringの入った証明書が読み込めない - livedoor Blog(ブログ)
RFC 3280では規定外になりますが識別名にNumericStringを含む証明書を作ってみて、そのPKCS#12を作ろうとOpenSSLで読み込ませてみたら見事にエラーになりました。


前のブログでOpenSSLでNumericStringを識別名に含む証明書を読み込むとエラーになると書きましたが他はどうなのか(別の調査のついでに)調べてまとめてみたのが以下です。














DirectoryString
Type
TagOpenSSL
サポート※1
RFC3280
Issuer※2
RFC3280
Subject※3
UTF8String0c
NumericString12×××
PrintableString13
TeletexString14
VideotexString15×××
IA5String16×
GraphicString19×××
VisibleString1a×××
GeneralString1b×××
UniversalString1c
BMPString1e



※1: OpenSSL 0.9.8hで証明書識別名で使われているものを読み込んだ際、エラー終了しなければ「○」
※2: RFC 3280 4.1.2.4でIssuerに使ってよいとしているDirectoryString Typeであるか
※3: RFC 3280 4.1.2.6 SubjectではIssuerのものに加え過去との互換性からメールアドレスにIA5Stringをつかってもよい。


X.680で定義されている文字列を扱うプリミティブをリストにしました。OpenSSLは0.9.8hで確認しました。RFC 3280でサポートされているDirectoryString Typeしかサポートしてないんですね。

読めなかったときのエラーはこんな感じです。

% openssl x509 -inform DER -noout -txt -in EE-ECOM-XMLDN-DS-VIDEOTEX-ASCII.cer
unable to load certificate
24264:error:0D07808C:asn1 encoding routines:ASN1_ITEM_EX_D2I:mstring wrong tag:tasn_dec.c:228:Type=ASN1_PRINTABLE
24264:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:749:Field=value, Type=X509_NAME_ENTRY
24264:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:710:
24264:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:710:
24264:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:749:Field=issuer, Type=X509_CINF
24264:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:749:Field=cert_info, Type=X509


OpenSSLでNumericStringの入った証明書が読み込めない

とある事情でRFC 3280では規定外になりますが識別名にNumericStringを含む証明書を作ってみて、そのPKCS#12を作ろうとOpenSSLで読み込ませてみたら見事にエラーになりました。

% openssl x509 -in foo.cer -inform DER -noout -text
unable to load certificate


と出てしまうのでNumericStringが多分いけないのでしょう、、、、、意外に弱いのね、、、、、、
仕方ない明日Javaでやることにしよう、、、、


OpenSSL 0.9.8i Win32バイナリ

自堕落な技術者の日記 : OpenSSL 0.9.8iリリース - livedoor Blog(ブログ)


OpenSSL 0.9.8i がリリースしたことをここで書きましたが、その際、Shining Light Productionsという Windows 用のバイナリを提供してくれているサイトがあることも書きました。

OpenSSL 0.9.8i 用のバイナリもあるのでとりあえずフルバージョンをインストールしてみました。インストールにはMicrosoft Visual C++ 2008 Redistributable Package (x86)も必要。で、早速 engine の確認、、、、、

OpenSSL> version
OpenSSL 0.9.8i 15 Sep 2008
OpenSSL> engine
(padlock) VIA PadLock (no-RNG, no-ACE)
(dynamic) Dynamic engine loading support
(4758cca) IBM 4758 CCA hardware engine support
(aep) Aep hardware engine support
(atalla) Atalla hardware engine support
(cswift) CryptoSwift hardware engine support
(chil) CHIL hardware engine support
(nuron) Nuron hardware engine support
(sureware) SureWare hardware engine support
(ubsec) UBSEC hardware engine support


だめじゃ〜〜〜ん、CryptoAPI用のengineつきではビルドされてないようです。

ちなみに cygwin の OpenSSL の engine はこんな感じでたった2つだけと至ってシンプル。

(padlock) VIA PadLock (no-RNG, no-ACE)
(dynamic) Dynamic engine loading support


やっぱり自分でビルドしないとだめみたいです、、、、

OpenSSL 0.9.8iリリース

9月15日敬老の日にOpenSSL 0.9.8iがリリースされたというのでCHANGESを覗いてみました。

他はどうでもよいんですが、↓

Add CryptoAPI ENGINE to support use of RSA and DSA keys held in Windows
keystores. Support for SSL/TLS client authentication too.
Not compiled unless enable-capieng specified to Configure.


これ「チ、チょっと、おと〜〜〜さぁ〜〜ん!!!」って感じでよね(^^v

enable-capieng オプション付きでビルドしてやればWindows CryptoAPIの証明書・鍵ストアが使えると、、、、、SSLクライアント認証もいけるそうです。いろいろ制約事項の多かったWindows証明書ストアでの鍵生成・証明書発行要求にも使えるかも〜〜〜〜〜

0.9.8i 以降の話もCHANGESに書いてしまっているという情報もあるので確認して本当ならこれはビルドしてみない手はありません、、、、

engines/e_capi.c があるので大丈夫そうかな、、、

<追記>
ちょっとココで配布されるのを待ってみよう、、、
http://www.slproweb.com/products/Win32OpenSSL.html

IETF S/MIME WGでのSHA1アルゴリズムパラメータの議論

Archive of ietf-smime, by date


あれれ、IETF S/MIME WGのメールリストで
SHA-1のAlgorithmIdentifierのパラメータについてもめてます???

一連のメールでOpenSSLはPKCS#7にしか対応しておらずCMSには対応して
いないことがわかりました。CMSに対応するには0.9.9か0.9.8h以降で
configでenable-cmsつけてビルドしなければならいないそうです。
#一般のLinuxディストリビューションやcygwinではついてないものが
#配布されるでしょうね、、、、、

PKCS#1署名の際にはきちんとパラメーターNULL入れてくださいね〜〜〜〜

openssl-blacklist 0.4.2 (2008.06.17)

OpenSSL/Debian脆弱性/ブラックリストのメモ


Debianのopenssl-blackリストですが地味に更新されていて
2008年6月11日にバージョン0.4がリリースされ
2008年6月17日に0.4.2になっています。
リストとしてはかなり充実しておりRSA 4096bit鍵やbig endianの
CPUのケースにも対応しています。

各リリースに含まれる鍵の対応状況を別館にてまとめましたので
よかったらご覧ください。

<ソースダウンロード>
ftp://ftp.debian.org/debian/pool/main/o/openssl-blacklist

OpenSSLコマンド入力例集

OpenSSLのコマンドって、オプションの種類が多すぎて少し離れているとすぐ忘れてしまったりするので別館で地味〜〜〜にまとめてみました。

今後もぼちぼち追加していきますのでよかったらご利用下さい。

OpenSSLで鍵生成した秘密鍵をJavaで使う

OpenSSLで生成したRSA/DSA秘密鍵は

今までずっと暗号化しないPKCS#8だと勘違いしていたんですが

PKCS#1の秘密鍵だったんですね。

#常識でしたか、、、、、(T_T)

Javaの

PKCS8EncodedKeySpecで読んで使おうと思ったら

できないんで、おかしいなぁと思って調べちゃいました。

ちなみにOpenSSLで生成したDSA秘密鍵

% openssl dsaparam -out aaa.prm 1024

% openssl gendsa -out aaa.prvkey aaa.prm

当たり前ですが、こんなASN.1構造です。

SEQUENCE {

INTEGER 0 -- version

INTEGER -- P プライム

INTEGER -- Q サブプライム

INTEGER -- G ベース

INTEGER -- Y 公開鍵

INTEGER -- X 秘密鍵 }

さらにはOpenSSLで生成したPKCS#1 RSA秘密鍵

% openssl genrsa -out bbb.prvkey 1024

ASN.1構造はこんな感じ。

SEQUENCE {

INTEGER 0 -- version

INTEGER -- n モジュラス(modulus)

INTEGER -- e 公開指数(public exponent)

INTEGER -- d 秘密指数 (private exponent)

INTEGER -- p プライム1 nの素因数 (prime1)

INTEGER -- q プライム2 nの素因数 (prime2)

INTEGER -- プライム1指数 (exponent1 = d mod (p-1))

INTEGER -- プライム2指数 (exponent2 = d mod (q-1))

INTEGER -- 中国剰余定理係数 (coefficient = (inverse of q) mod p) }

以上のPKCS#1フォーマットのRSA/DSA鍵はそのままでは

Javaでは読み込むことができない(と思う)ので

PKCS#8にくるんでやる必要があります。

OpenSSLのPKCS#1 DSA秘密鍵をPKCS#8に変換

秘密鍵を共通鍵暗号で保護しない平文形式の鍵に

変換するには以下のようにします。

% openssl pkcs8 -in dsa.prvkey -out dsa.prvkey.p8 -topk8 -nocrypt

すると生成されたPKCS#8のDSA秘密鍵は

SEQUENCE {

INTEGER 0 -- version

SEQUENCE {

OBJECT IDENTIFIER dsa (1.2.840.10040.4.1)

SEQUENCE {

INTEGER -- P プライム

INTEGER -- Q サブプライム

INTEGER -- G ベース

}

}

OCTET STRING, encapsulates {

INTEGER -- X 秘密鍵

}

}

}

ありゃりゃ、Yが無くなり、秘密鍵XがOCTET STRINGで

カプセル化されちゃったぞ。

OpenSSLのPKCS#1 RSA秘密鍵をPKCS#8に変換

同様にPKCS#1 RSA秘密鍵をPKCS#8に変換してみます。

% openssl pkcs8 -in rsa.prvkey -out rsa.prvkey.p8 -topk8 -nocrypt

すると生成されたPKCS#8 RSA秘密鍵のASN.1構造は

こんな感じ。

SEQUENCE {

INTEGER 0 -- version

SEQUENCE {

OBJECT IDENTIFIER rsaEncryption (1.2.840.113549.1.1.1)

NULL }

OCTET STRING, encapsulates {

SEQUENCE {

INTEGER 0

INTEGER -- n モジュラス

INTEGER -- e 公開指数

INTEGER -- d 秘密指数

INTEGER -- p プライム1

INTEGER -- q プライム2

INTEGER -- プライム1指数

INTEGER -- プライム2指数

INTEGER -- 中国剰余定理係数

}

}

}

AiCryptoのPKCS#8 DSA秘密鍵は?

Challenge PKI Test Suiteでは秘密鍵はどうなってるのか

ちゃんと見たことも無かったので見てみると保護されないPKCS#8になっていました。

この部分はOpenSSLと同じような暗号ライブラリAiCryptoの

PEM_write_p8()関数が使わています。

で、出力はこんな感じ。

SEQUENCE {

INTEGER 0 -- version

SEQUENCE {

OBJECT IDENTIFIER dsa (1.2.840.10040.4.1)

SEQUENCE {

INTEGER -- P プライム

INTEGER -- Q サブプライム

INTEGER -- G ベース

INTEGER -- Y 公開鍵

INTEGER -- X 秘密鍵

}

}

}

公開鍵Yがあったり、秘密鍵XがOCTETSTRINGでカプセル化

されていないところがOpenSSLとはちょっと違いますね。

AiCryptoのPKCS#8 RSA秘密鍵は?

同様にAiCryptoの生成したPKCS#8 RSA秘密鍵も見てみます。

SEQUENCE {

INTEGER 0 -- version

SEQUENCE {

OBJECT IDENTIFIER rsaEncryption (1.2.840.113549.1.1.1)

NULL }

OCTET STRING, encapsulates {

SEQUENCE {

INTEGER 0

INTEGER -- n モジュラス

INTEGER -- e 公開指数

INTEGER -- d 秘密指数

INTEGER -- p プライム1

INTEGER -- q プライム2

INTEGER -- プライム1指数

INTEGER -- プライム2指数

INTEGER -- 中国剰余定理係数

}

}

}

これは、OpenSSLの変換結果と全く同じ構造ですね。

PKCS#8ファイルをJavaで読み込む

読み込むのは以下のような感じになります。

byte[] p8 = PEMの内容を何らかの方法でbyte配列に

KeySpec keySpec = new PKCS8EncodedKeySpec(p8)

KeyFactory kf = null;

if (鍵がRSAなら)

kf = KeyFactory.getInstance("RSA");

else

kf = KeyFactory.getInstance("DSA");

PrivateKey pk = kf.generatePrivate(keySpec);

その鍵がRSAであるかDSAであるかはkeySpecからはわからないので

tryで適当にやってみるしか無いと思います。

OpenSSLやAiCryptoのPKCS#8がJavaで読めたか

実行結果をまとめたのが下表になります。

秘密鍵の生成方法Javaで読めるか?
DSA OpenSSL PKCS1→PKCS8読める
DSA AiCrypto PKCS8読める
RSA OpenSSL PKCS1→PKCS8読める
RSA AiCrypto PKCS8読める

なるほどなるほど、カプセル化の部分はきちんと吸収してくれるらしい。

しかしながら、DSAだろうが、RSAだろうが

PKCS#1だろうが、PKCS#8だろうが、PKCS#12だろうが

ファイル渡すとポッと秘密鍵が使えるものがあると有難いですね。

ううん、作っておこう、、、、

OpenSSLライブラリを使ったプログラミング

OpenSSL/プログラミングの基本


別館にて、OpenSSLライブラリを使ったプログラミングや
ソースコードを読み解くのための資料を書き始めました。

随時追加していきますので、よろしかったらご覧ください。

dowkdとopenssl-blacklistの脆弱な鍵生成の違い

OpenSSL/Debian脆弱性/dowkdとopenssl-blacklistのブラックリスト生成の違い


乱数ファイルの状態による違いについて、少し調べて別館で説明しています。
最新記事
Categories
Archives
Twitter
記事Google検索

本ブログ内をGoogle検索
Yahoo!アクセス解析
Travel Advisor
記事検索
QRコード
QRコード
  • ライブドアブログ