1

https を使用してサーバーに接続しようとすると、接続にはクライアント証明書が必要であると表示されます。はいを押して続行すると、TLSAlertException が発生します。
接続コードは次のようになります。

SecureConnection con = (SecureConnection)Connector.open("ssl://url:443");

シミュレーター (およびデバイス) で証明書を確認しましたが、既定ではクライアント (個人) 証明書はありません。コードを使用して生成しようとしましたが、電話の個人証明書の下に表示する方法がわかりません。

これを見つけましが、デバイスで個人証明書を取得するために非常に望ましいオプションはありません。

では、理想的にはコードを介して、シミュレーターで個人証明書を取得することは可能ですか?
取得できた場合、SecureConnection はサーバーに接続するときにそれを自動的に使用しますか?
そうでない場合、これを機能させることができるライブラリはありますか?

4

1 に答える 1

1

それで、さらに掘り下げた後、Bouncy Castle TLS API を見つけました。簡単に言えば、これまでのところうまくいっているようですが、途中でいくつかの障害に遭遇したため、実行した手順をリストします。

ソースとクラス ファイルの zip をhttp://www.bouncycastle.org/latest_releases.htmlからダウンロードできます。「ソースと Javadoc」セクションの下に、J2ME へのリンクがあります。

最初に、cldc_classes.zip を外部 JAR としてビルド パスに追加しようとしました。弾む城のコードのコード補完は、現在 Eclipse で機能していました。そのため、シミュレーターを起動しましたが、アプリを起動しようとすると、「アプリの起動中にエラーが発生しました: モジュール 'cldc_classes.zip' が見つかりません」というメッセージが表示されました。私は周りを検索し、ビルドパス設定の「注文とエクスポート」タブのボックスをチェックする必要があるという問題を発見しました。おっとっと!

そのため、チェックして再度実行しようとしましたが、シミュレーターが起動する前に「エラー: preverifier が失敗しました」というメッセージが表示されました。さらに検索すると、zipファイルを機能させるには事前検証が必要であることが明らかになりましたが、それは十分に簡単だと思われました。

preverify ツールを使用すると、Java パッケージ内のクラスの重複作成に関係があるように見える多くのエラーと警告が表示されました。Bouncy Castle の FAQ で、彼らはこのようなことを言及し、コードを難読化することを提案しました。

Java難読化ツールを見つけ、少しいじった後、クラスを難読化することができました。事前検証を試みましたが、再び失敗しました...事前検証について必要以上に学びたくなかったので、ソースファイルをインポートすることにしました。

パッケージの 1 つに ArrayList に依存するエラーがありましたが、必要ではないようでしたので削除しました。実行しようとすると、「重複する属性の不一致: 'MIDlet-name'」に関するエラーが発生しました。エラーを取り除くために削除したパッケージの 1 つに .jad ファイルがありました。また、テスト パッケージを削除しても影響はありませんでした。

今実行しようとすると、「Eclipse I/O エラー: プログラム "jar" を実行できません: CreateProcess エラー = 2」が発生しました。いくつかの検索により、Java jdk bin フォルダー (C:\Program Files\Java\jdk\bin など) を PATH 環境変数に追加する必要があることがわかりました。

最後に実行でき、データを正常に接続、送受信できました。プロジェクトで弾む城の瓶を使用するためのより良い/簡単な方法がおそらくあり、コードが実際に機能することがわかったので、それを検討するかもしれません。以下は、接続のサンプルコードです。

SocketConnection con = (SocketConnection)Connector.open("socket://url:443");
TlsProtocolHandler tph = new TlsProtocolHandler(con.openInputStream(), con.openOutputStream());
tph.connect(new AlwaysValidVerifier());
is = tph.getInputStream();
os = tph.getOutputStream();
于 2012-01-12T02:28:13.227 に答える