ラベル java の投稿を表示しています。 すべての投稿を表示
ラベル java の投稿を表示しています。 すべての投稿を表示

2012年3月6日火曜日

Autoingestion.classを使うとjavax.net.ssl.SSLHandshakeExceptionが出ちゃう

どうも、俺@残業中です。

iPhoneアプリの販売データを取得するため、AppleはAutoingestion.classなるものを用意してくれてます。
iTunesConnectのSales and TrendsにあるデータをTSVデータとしてDLできます。
わざわざHTMLをスクレイピングしなくて良いですね!
ドキュメントはココ
とても分かりやすい参考サイトは iTunesConnectからアプリダウンロード数レポートを自動取得する方法 - zaru blog がとても分かりやすいです!

ところが、僕の開発環境だと、このプログラムを実行させるとタイトルの通り

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
になっちゃいます。ほとんどの人は関係ないと思いますが。。
今日はその解決法をばめもめも。

javaのkeytoolというコマンドを使って、証明書をインポートすれば良いそうです。
あまりjavaには明るくない俺なりに調べてみたのですが、
どうやら[SSLHandshakeException]信頼できない証明書のサイトと無理矢理接続する方法にあるように、
Javaで信頼できないSSL証明書を使ってHTTPコネクションを貼ろうとした場合に出る例外のようです。
AppleからのAutoingestion.classがどういう実装になっているのか調べてみれば分かるかもしれませんが、
とりあえず今回は解決優先ということで、「Sales And Trends」データを取得しにいくサーバへSSL通信するときの証明書が怪しいのでは?という仮説を立てて対応することにしました。

つまり、接続先の証明書をkeytoolを使ってインポートすれば良いのです。
証明書はhttps://itunesconnect.apple.comのものだと思います。
つまり、Autoingestion.classはitunesconnect.apple.comへ接続しにいっているはず。
(多分。。。tcpdumpとかでパケットを監視してないので嘘だったらごめんなさい。今度調べます。)

なので、FireFox(僕Mac版FireFox使ってます)とかで上記URLを叩き、
アドレスバーの左側(緑色になっているはず)をクリック>詳細を表示>「セキュリティ」タブ>証明書を表示...>「詳細」タブ>書き出す...
の操作を行えば証明書を取得できます。

この証明書ファイルを、開発サーバのjavaへ組み込みます。

$ keytool -import -keystore /usr/local/jdk1.6.0_16/jre/lib/security/cacerts -storepass changeit -file /path/to/証明書ファイル
これでOK。
-keystore は俺の環境での値を書きましたが、環境に合わせて書き換えて下さい。
-storepass はデフォルトでchangeitです。
-file は先程FireFoxから取得した証明書ファイルへのパスです。
何とこれでサーバのjava(/path/to/jdk/jre/lib/security/cacerts)に証明書データがインポートされ、
「信頼できる証明書」として扱われます。
オレオレ証明書を作成した場合などで使えますね!

keytoolについてはJava/keytool - 備忘録に詳しく書かれています。


これでAutoingestion.classを使えば、悩み解決されます!

$ java -cp . Autoingestion username password vendorid Sales Daily Summary `date +%Y%m%d -d "2 days ago"`

.gzファイルがDLされます!

以上でぇぇぇえぇす。

2010年2月25日木曜日

[java]logback+slf4jでロギング

どうも、俺@仕事中です。
今日はlogbackを使ってログを取得する方法をメモします。
※OS:CentOS 4.3
※java:1.6.0_18

ライブラリを以下から取得。
Logback:http://logback.qos.ch/
SLF4j:http://www.slf4j.org/

ダウンロードしたアーカイブを解凍して、
slf4j-api-1.5.10.jar
logback-core-0.9.18.jar
logback-classic-0.9.18.jar
をjavaのCLASSPATHに通します。

では、サンプルソース。

import org.slf4.Logger;
import org.slf4j.LoggerFactory;

public class LogSample {
private static Logger logger = LoggerFactory.getLogger(LogSample.class);

public static void main(String[] args) {
logger.info("INFO");
logger.debug("DEBUG");
}
}

で、設定ファイル(logback.xml)を作成します。これもCLASSPATHの通ったディレクトリへ設置します。
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- ファイル出力 -->
<appender name="FILE_OUT" classs="ch.qos.logback.core.rolling.RollingFileAppender">
<File>sample.log</File>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy/MM/dd HH:mm:ss} %-5level [%thread] %class{0} %line : %msg %n</pattern>
</layout>

<!-- 日付でローテート -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>sample.%d{yyyy_MM_dd}.log</FileNamePattern>
</rollingPolicy>
</appender>



# <!-- ファイルサイズでローテート -->
# <appenderclass="ch.qos.logback.core.rolling.RollingFileAppender">
# <File>sample.log</File>
# <layout class="ch.qos.logback.classic.PatternLayout">
# <pattern>%d{yyyy/MM/dd HH:mm:ss} %-5level [%thread] %class{0} %line : %msg %n</pattern>
# </layout>
# <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
# <FileNamePattern>sample.log.%i</FileNamePattern>
# <MinIndex>1</MinIndex>
# <MaxIndex>10</MaxIndex>
# </rollingPolicy>
# <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
# <MaxFileSize>512MB</MaxFileSize>
# </triggeringPolicy>
# </rollingPolicy>
# </appender>


<logger name="com.blogger.koexuka.app">
<level value="warn" />
<appender-ref ref="FILE_OUT" />
</logger>
以上どぇぇーす。