- PR -

Axisでベーシック認証のサーバ証明書

1
投稿者投稿内容
るーさん
常連さん
会議室デビュー日: 2003/12/14
投稿数: 28
投稿日時: 2008-09-01 17:02
いつもお世話になっています。

さて、早速ですが
AxisでSOAPクライアントを作成しています。
作成したクライアントから、別システムのサーバに接続しようとしたところ、
以下のような例外が出力されます。
------
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found
at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:154)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)

おそらく、サーバー側の証明書が正しくないのだと思います。
IE7, Safariでは証明書エラーになりませんでしたが、
Firefox2.0では、証明書が信頼されていないダイアログがでてきました。

サーバー側に証明書をインストールしてもらうのが一番の解決なので
そちらは生憎と対応できません。

そこで、Axisで証明書を無視する方法はないでしょうか?
もし、原因が間違っていましたらご指摘下さい。

よろしくお願い致します。
わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 2008-09-01 17:47
>javax.net.ssl.SSLHandshakeException
SSLのハンドシェイクに失敗しているのであって、ベーシック認証とか関係ないですよね?

>No trusted certificate found
Javaは信頼できる証明書がないと言ってます。
接続するサーバが信頼できるのであれば、証明書を実行しているJavaRuntimeのトラストストアに読み込ませなくてはなりません。
くどいようですが(第三者機関によって)信頼されていない証明書をインストールするわけですから、自己責任で行わなくてはなりません。
証明書のインストールはkeytoolのマニュアルを参照ください。
るーさん
常連さん
会議室デビュー日: 2003/12/14
投稿数: 28
投稿日時: 2008-09-02 18:09
わたなべ様
回答ありがとうございます。

Javaで信頼できる証明書がないというのは分かりました。
この解決方法は、証明書を入れるしかないのでしょうか?
プログラムで、証明書を無視するような変更はできないのでしょうか?
コネクションに証明書を誤摩化すような変更を加える方法があるそうなのですが、
AxisのAPIを使う場合、直接コネクションに手を入れることができなく困っています。


Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2008-09-02 19:19
引用:
プログラムで、証明書を無視するような変更はできないのでしょうか?


これをするならSSLを使う意味がまったくないと思います。

引用:
コネクションに証明書を誤摩化すような変更を加える方法があるそうなのですが、
AxisのAPIを使う場合、直接コネクションに手を入れることができなく困っています。


オープンソースなのだから、困ることはないと思いますよ?
わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 2008-09-02 20:24
>この解決方法は、証明書を入れるしかないのでしょうか?
サービスを提供している側がSSLを求めている以上、サービスを受ける側がどうこうできる訳がありません。

>AxisのAPIを使う場合、直接コネクションに手を入れることができなく困っています。
URLをhttpsにすれば、サーバに接続した時点で証明書要求が発行され、SSL通信の準備が行われます。
後はAPIの裏方が必要な手続きを行いますので、クライアントが何か意識する必要はありません。
ですが、信頼できる証明書がなければその手続きを行えないので、keytoolでインストールするなどの方法をとります。
そうすれば、コネクションを直接触れなくとも通信できます。

まずはSSLについて簡単な解説でも読んでみたほうがいいと思います。
何時までも話はかみ合わないと思いますので。
じゃんじゃお
会議室デビュー日: 2008/10/01
投稿数: 1
投稿日時: 2008-10-01 00:12
> プログラムで、証明書を無視するような変更はできないのでしょうか?

できます。
証明書検証はしない(全ての証明書を信用する)けれど、
通信は暗号化したいということですよね。

> コネクションに証明書を誤摩化すような変更を加える方法があるそうなのですが、

例えば、HttpsURLConnection や Jakarta-Commons HttpClient でしたら
このサイトが参考になると思います。
http://trasis.jp/blog/lab/2008/07/%E8%87%AA%E5%89%8D%E8%AA%8D%E8%A8%BC%E5%B1%80%E3%81%AEssl%E3%82%B5%E3%83%BC%E3%83%90.html


> AxisのAPIを使う場合、直接コネクションに手を入れることができなく困っています。

axisのソースを見たところSocketでした。
やり方は同じなのでaxisのソースを直接書き換えればもちろんできますが、
手を入れなくても一部オーバーライドしたclassを作るだけで出来そうです。

(1)org.apache.axis.components.net.JSSESocketFactory
をオーバーライドして証明書検証無しのSocketを返すclassを作る。

(2)org.apache.axis.components.net.SocketFactoryFactory
を一度newしてからJSSESocketFactoryを指定しているstaticな箇所を
上記で作ったclassにして上書き。

と思って検索したら同じこと書いてるサイトがありました。
参考になると思います。
http://www.mail-archive.com/axis-user@ws.apache.org/msg21734.html
1

スキルアップ/キャリアアップ(JOB@IT)