タイトル/名前 | 更新者 | 更新日 |
---|---|---|
技術 | msakamoto-sf | 2013-07-28 18:28:39 |
技術/RCS/Mercurial | msakamoto-sf | 2013-07-28 16:49:26 |
技術/HTML5/FileSystemAPI | msakamoto-sf | 2013-07-28 16:33:55 |
日記/2012/11/18/JSON.stringifyの勉強メモ。 | msakamoto-sf | 2013-07-28 16:30:21 |
Java/jarファイルの配布と実行方式 | msakamoto-sf | 2013-07-28 15:38:48 |
Java/clas3hift | msakamoto-sf | 2013-07-27 22:09:36 |
技術/TDD/Javaでstaticメソッドをmockする | msakamoto-sf | 2013-07-27 21:59:24 |
Java/XMLメモ | msakamoto-sf | 2013-07-27 19:17:28 |
技術/Security/PKI,SSL,TLS/メモ04_OpenSSLでファイルを暗号化して復号する練習 | msakamoto-sf | 2013-07-27 19:04:04 |
技術/Security/PKI,SSL,TLS/メモ03_OpenSSLと証明書の練習 | msakamoto-sf | 2013-07-27 18:52:36 |
GoogleCodeやCodePlex(Microsoft)でもサポートされている分散型のリビジョン管理システムのメモ。
FileSystem API のサンプルとメモ。
参考:
今更ながらJSON.stringify()を勉強したのでメモ。
https://github.com/msakamoto-sf/webtoys/blob/master/js/t_practices.html
大分、頭の中も"\uXXXX"の表現に慣れてきました。
実行可能なJavaプログラムをjarファイルで配布する場合、その形態として次の2方式をよく見かけます。
本記事ではこれらの配布と実行方式の実現方法について調べてみました。
バイトコードの動的な生成処理とClassLoaderを組み合わせる技法は、JVMに対する高度かつ深い知識が必要で、しかもトラブルが発生した場合に非常にデバッグや解決が難しい場合が多々あります。
OpenSourceで実際の開発で耐えうるプロジェクトが存在することもあり、clas3hiftはクローズします。
ただし、 技術/TDD/Javaでstaticメソッドをmockする にも書きましたがClassLoader周りはひとつ間違えると、非常にデバッグや解決が難しいトラブルが発生します。可能な限り、ClassLoaderを操作する以外の妥協策を探ることを推奨します。また、まだ勉強中ですがアプリ内でクラスローダを分割してコンテナ化したい用途であればOSGiを検討してみても良いかもしれません。
万が一ClassLoaderを操作しなければならない場面に遭遇したら、BCELやJavassist, さらにobjenesisなどのシリアライズライブラリを組み合わせた非常に高度な技法を駆使する必要があります。そのような自体にならないことを切に祈念します。
clas3hiftの紹介
powermockがオススメ・・・というか他に知らないんですが。ただし、staticメソッドやSystem ClassLoaderによりロードされるJDKコアクラスをmockする必要が発生する場合、それ以前の問題としてそもそもアーキテクチャが不味くてリファクタリングした方が良いような状況だったりします。後述しますが、可能な限りstaticメソッドのmockやJDKコアクラスをmockする手法は避けてください。ぶっちゃけ地雷原です。
メリットを遥かに上回る(というか実際トラブルで嵌る)デメリット群:
ということで、個人的にはstaticメソッドやJavaのシステムクラスをmockしたいような場合、powermockを使って頑張ってmockするのではなく、以下の様な妥協案を探ることをオススメします。
以下の記事を読んでみると、staticメソッドやSystem ClassLoaderにより読み込まれるJDKコアクラスをmockするのがどれほどセンシティブな処理であるか理解いただけるかと。
OpenSSLの enc コマンドでファイルの暗号化と復号を行うことが出来ます。
暗号化(AES256):
$ openssl enc -aes256 -e -in original.txt -out encrypted.txt enter aes-256-cbc encryption password: (パスワード入力) Verifying - enter aes-256-cbc encryption password: (パスワード確認入力)
復号(AES256):
$ openssl enc -aes256 -d -in encrypted.txt -out decrypted.txt enter aes-256-cbc decryption password: (パスワード入力)
"-in"を指定しない場合は標準入力が使われます。
$ echo "abcdefg" | openssl enc -aes256 -e -out e.txt $ cat e.txt | openssl enc -aes256 -d -out d.txt $ cat d.txt abcdefg
サポートされているアルゴリズムは、 enc(1) の "SUPPORTED CIPHERS" を参照してください。
("openssl enc -h" など不正なオプションを指定して enc コマンドを実行した時に表示される、"Cipher Types" からも確認出来ます。)
OpenSSLコマンドを使った「テストCA環境の準備」「証明書要求の作成」「テストCA環境で証明書の発行」を駆け足で紹介します。作業ディレクトリは特に指定がなければお好みのカレントディレクトリです。
※なお今回は秘密鍵を暗号化せずに取り扱っているため、証明書作成や署名で一切パスフレーズを訊かれません。実際は非常に危険な状態となりますので、ご注意ください。
テスト用ルート証明書のRSA秘密鍵を生成:
> openssl genrsa 2048 > testca_seckey.pem
テスト用ルート証明書のための設定ファイル testca_conf_req.txt を準備:
[req] prompt = no distinguished_name = testca_dn x509_extensions = testca_ext [testca_dn] countryName = JP stateOrProvinceName = Tokyo organizationName = Test Root CA commonName = Test CA emailAddress = ca@example.com [testca_ext] basicConstraints = CA:true
テスト用ルート証明書を生成:
> openssl req -config testca_conf_req.txt -new -x509 -sha1 -days 3650 -key testca_seckey.pem > testca.crt "-new" : 新しい証明書要求を作成。"-in"オプションや標準入力は無視される。 "-x509" : 証明書要求ではなくX509証明書自体を発行する。
秘密鍵を生成:
> openssl genrsa 2048 > testcert1_seckey.pem
証明書要求用の設定ファイル testcert1_conf.txt を準備:
[req] prompt = no distinguished_name = testcert1_dn [testcert1_dn] countryName = JP stateOrProvinceName = Tokyo organizationName = Test Cert1 commonName = localhost emailAddress = testcert1@example.com
証明書要求を生成:
> openssl req -config testcert1_conf.txt -new -sha1 -days 3650 -key testcert1_seckey.pem > testcert1.csr
テストCA環境用のディレクトリと初期設定ファイルを準備する。
"C:/temp" 以下に次のようなファイルを準備する。
C:/temp/ testca.crt : テスト用ルート証明書をコピーしてくる testca_seckey.pem : テスト用ルート証明書の秘密鍵をコピーしてくる index.txt : 中身空っぽ。 serial.txt : "01"とだけ書かれたテキストファイル certs/ : 空ディレクトリ
テストCA環境用の設定ファイル testca_conf_ca.txt を準備:
[ca] default_ca = testca [testca] dir = C:/temp certificate = $dir/testca.crt database = $dir/index.txt new_certs_dir = $dir/certs private_key = $dir/testca_seckey.pem serial = $dir/serial.txt default_days = 3650 default_md = sha1 policy = testca_policy [testca_policy] countryName = supplied stateOrProvinceName = supplied organizationName = supplied organizationalUnitName = optional commonName = supplied emailAddress = supplied
署名:
> openssl ca -config testca_conf_ca.txt -in testcert1.csr -batch Using configuration from testca_conf_ca.txt Loading 'screen' into random state - done Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'JP' stateOrProvinceName :PRINTABLE:'Tokyo' organizationName :PRINTABLE:'Test Cert1' commonName :PRINTABLE:'localhost' emailAddress :IA5STRING:'testcert1@example.com' Certificate is to be certified until Feb 2 13:23:42 2022 GMT (3650 days) Write out database with 1 new entries Certificate: Data: Version: 1 (0x0) Serial Number: 1 (0x1) Signature Algorithm: sha1WithRSAEncryption Issuer: CN=Test CA, ST=Tokyo, C=JP/emailAddress=ca@example.com, O=Test Root CA ...
"C:/temp/certs/01.pem" が生成される。これがテスト用ルート証明書で署名された証明書(PEM形式)ファイルになる。
これを "testcert1.crt" にリネームしてダブルクリックすると以下のように証明書の検証に失敗する。
ここでtestca.crtをダブルクリックして証明書を「信頼されたルート証明機関」にインポートする。
改めてtestcert1.crtをダブルクリックすると以下のようになり、無事証明書のチェインが確認できた。
更にローカルで動作させているApache + mod_ssl環境に、testcert1.crtとtestcert1_seckey.pemを組み込んでみる。
SSLCertificateFile C:/(...)/conf/ssl/testcert1.crt ... SSLCertificateKeyFile C:/(...)/conf/ssl/testcert1_seckey.pem
・エクスプローラからtestca.crtをインポートした状態であれば、IE9ではエラー無くlocalhostにアクセス出来る。
・Firefox9はWindowsとは別に証明書ストアを管理しているため、別途手動でtestca.crtをインポートした。
・インポートした後であれば、特にエラーや警告無くhttpsにアクセス出来た。
・Android 2.2の場合、まずtestca.crtをSDカードにコピーし、証明書をインストールする。
その後、localhostは使えないので直接IPアドレスを指定してアクセスしてみると名前の不一致で警告が表示された。
「セキュリティ警告」に戻り「続行」をクリックすることでhttpsにアクセスできた。