前回からいい感じに回数が開きましたが、またRSA BSAFE Shareの話を、、、、
前回はNIST PKITSを使ってRSA BSAFE ShareのPKIX CertPathValidator(パス検証)を試してみましたが、今回はPKIX CertPathBuilder(パス構築)の方をためしてみました。
RSA BSAFE ShareのPKIX CertPathValidatorはSUNと比べてエラーの理由がわからんとダメ出しをしてしまい、同様にSUNのPKIX CertPathBuilderにも失敗の原因がさっぱりわからん!!!とダメ出しをしているですが今度はどうかな、、、、、
結果的に言うとBSAFEのPKIX CertPathBuilderは失敗の理由がバッチリわかるのでSUNなんかより良いです。
テストに使うパスは昔つかったスイカ型メッシュモデル風のパスです。

RSA BSAFEのCertPathBuilder、CertPathValidatorの困ったところは"-Djava.security.debug=cerpath"フラグを使ってもデバッグメッセージを全く吐かないところです。中の動きが見えにくいし、、、、、
一応デバッグフラグをつけておくと、SunのX509CertSelectorのログだけは出力されます。でデバッグ出力からパスの繋ぎ方を見る方法ですが、
の行があれば、この証明書がパス構築に使われたことを示します。それをログの上から順に見ていきます。
で、そのスイカ型モデルでパス検証をしてログを見てると、こんな感じの順序で証明書を使っているのがわかります。

つまり、RSA BSAFE Share for JavaのPKIX CertPathBuilder実装は:
・SUNと同じエンドエンティティからルートに向けた構築
・SUNと同じ深さ優先探索
であることがわかります。
図のGGGから辿るパスは3通りあるわけですが、SUNの場合には2本辿ってダメで次に成功だったわけですが、RSAの場合には1回失敗した後で成功のパスを辿っています。
CollectionStoreの格納元にはArrayListを使っていたんですが、その格納順序で3本中のどれを選ぶかが変わるのかなと思って試してみましたが、どうもそうではないようです。
で、私の気になっているパス構築失敗時のエラーメッセージですが、ちゃんとエラーメッセージ出力するんですよ。当たり前だけど、それがSUNではできてないので、エライじゃないですか(^^v先ほどのスイカモデルで途中の証明書をなくしておいて失敗するように設定してみると、、、、
Java実装のSSLのクライアントで「繋がんね〜〜〜」とか悩んでいる場合には、SUNのはやめてRSA BSAFEを使うよう優先して調べるといいんじゃないっすかね。
PKIX CertPathBuilderはかなり良い感じ
前回はNIST PKITSを使ってRSA BSAFE ShareのPKIX CertPathValidator(パス検証)を試してみましたが、今回はPKIX CertPathBuilder(パス構築)の方をためしてみました。
RSA BSAFE ShareのPKIX CertPathValidatorはSUNと比べてエラーの理由がわからんとダメ出しをしてしまい、同様にSUNのPKIX CertPathBuilderにも失敗の原因がさっぱりわからん!!!とダメ出しをしているですが今度はどうかな、、、、、
結果的に言うとBSAFEのPKIX CertPathBuilderは失敗の理由がバッチリわかるのでSUNなんかより良いです。
テストに使うパスは昔つかったスイカ型メッシュモデル風のパスです。

RSA BSAFEのCertPathBuilder、CertPathValidatorの困ったところは"-Djava.security.debug=cerpath"フラグを使ってもデバッグメッセージを全く吐かないところです。中の動きが見えにくいし、、、、、
一応デバッグフラグをつけておくと、SunのX509CertSelectorのログだけは出力されます。でデバッグ出力からパスの繋ぎ方を見る方法ですが、
certpath: X509CertSelector.match(SN: 証明書シリアル
Issuer: 発行者DN
Subject: 主体者DN)
certpath: X509CertSelector.match returning: true
の行があれば、この証明書がパス構築に使われたことを示します。それをログの上から順に見ていきます。
で、そのスイカ型モデルでパス検証をしてログを見てると、こんな感じの順序で証明書を使っているのがわかります。

つまり、RSA BSAFE Share for JavaのPKIX CertPathBuilder実装は:
・SUNと同じエンドエンティティからルートに向けた構築
・SUNと同じ深さ優先探索
であることがわかります。
図のGGGから辿るパスは3通りあるわけですが、SUNの場合には2本辿ってダメで次に成功だったわけですが、RSAの場合には1回失敗した後で成功のパスを辿っています。
CollectionStoreの格納元にはArrayListを使っていたんですが、その格納順序で3本中のどれを選ぶかが変わるのかなと思って試してみましたが、どうもそうではないようです。
で、私の気になっているパス構築失敗時のエラーメッセージですが、ちゃんとエラーメッセージ出力するんですよ。当たり前だけど、それがSUNではできてないので、エライじゃないですか(^^v先ほどのスイカモデルで途中の証明書をなくしておいて失敗するように設定してみると、、、、
■有効なパス中のROOT→CCCの証明書を削った場合:
java.security.cert.CertPathBuilderException:
Sat May 02 10:26:08 JST 2009 is before Sun Jan 02 09:00:00 JST 2000
ちゃんと有効期限のエラーが表示されます。
■上からさらにROOT→AAAの証明書を削った場合:
java.security.cert.CertPathBuilderException:
Expected a CA certificate.
基本制約cAフラグのエラーっぽい感じがしますよね。
■SUNの場合ならいずれも全く無意味な以下の例外(−−;
sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
こりゃなんの事かさっぱりわからん
Java実装のSSLのクライアントで「繋がんね〜〜〜」とか悩んでいる場合には、SUNのはやめてRSA BSAFEを使うよう優先して調べるといいんじゃないっすかね。