レガシーJavaのSSL/TLS対応メモ
Java1.4 SSL 3.0、TLS 1.0
https://docs.oracle.com/javase/jp/1.4/guide/security/jsse/JSSERefGuide.html
Java5 SSL 3.0、TLS 1.0
https://docs.oracle.com/javase/jp/1.5.0/guide/security/jsse/JSSERefGuide.html
Java6 SSL 3.0、TLS 1.0
https://docs.oracle.com/javase/jp/6/technotes/guides/security/jsse/JSSERefGuide.html
※Update111以降でTLS1.1が使用できる
https://www.oracle.com/technetwork/java/javase/documentation/overview-156328.html#R160_111
Java7 TLS1.1 ( 設定でTLS1.2)
https://docs.oracle.com/javase/jp/7/technotes/guides/security/jsse/JSSERefGuide.html
Java7 TLSv1.2 Apache Commons HttpClient3.1
・Java7
・TLSv1.2
・Apache Commons HttpClient3.1
※TLSv1.2はJava7以上が必須
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import javax.net.ssl.SSLContext; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.GetMethod; public class HttpClientTLSv12 { static { //System.setProperty("javax.net.debug", "ssl"); //System.setProperty("https.protocols", "TLSv1.2"); //System.setProperty("jdk.tls.client.protocols", "TLSv1.2"); //System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog"); //System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true"); //System.setProperty("org.apache.commons.logging.simplelog.log.httpclient.wire.header", "debug"); //System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient", "debug"); } public static void main(String[] args) { HttpClientTLSv12 tls = new HttpClientTLSv12(); tls.execute(); } public HttpClientTLSv12() { } private void execute() { GetMethod httpget = null; BufferedReader br = null; try { // 使用するSSLプロトコルのデフォルトをTLS1.2にする SSLContext ctx = SSLContext.getInstance("TLSv1.2"); ctx.init(null, null, null); SSLContext.setDefault(ctx); // Apache Commons HttpClient3.1 HttpClient httpclient = new HttpClient(); httpget = new GetMethod("https://www.yahoo.co.jp/"); httpclient.executeMethod(httpget); // Response System.out.println(httpget.getStatusLine()); InputStream is = httpget.getResponseBodyAsStream(); br = new BufferedReader(new InputStreamReader(is)); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (Exception e) { System.out.println(e.getMessage()); } finally { if(httpget != null) { httpget.releaseConnection(); httpget= null; } if (br != null) { try { br.close(); } catch (IOException e) { // } br = null; } } } }
2019/10/15 追記
・Java8の場合は、TLSv1.2がデフォルトのため、下記の記述は不要
// 使用するSSLプロトコルのデフォルトをTLS1.2にする SSLContext ctx = SSLContext.getInstance("TLSv1.2"); ctx.init(null, null, null); SSLContext.setDefault(ctx);
・下記ファイルにルート証明書が設定されている必要がある
%JAVA_HOME%/lib/security/cacerts
・Java7でVM引数やプロパティにTLSv1.2を設定すれば動くみたいな記事を見かけるけど上手く動作しない。
-Dhttps.protocols=TLSv1.2 -Djdk.tls.client.protocols=TLSv1.2 System.setProperty("https.protocols", "TLSv1.2"); System.setProperty("jdk.tls.client.protocols", "TLSv1.2");
・参考
java tls1 Commons HTTPClient 3.1にTLS 1.2をHTTPS専用に使用させる方法 - 初心者入門サンプル
SFTPアカウント作成とChrootメモ(CentOS6.7)
ユーザ作成とパスワード設定
useradd sftp-hoge passwd sftp-hoge
★★指定ディレクトリのみ参照可能にする(chroot)★★
※/var/wwwを参照可能とする場合
vi /etc/ssh/sshd_config
変更内容
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match User sftp-hoge
ChrootDirectory ~
ForceCommand internal-sftp
ホームディレクトリを/var/wwwに変更、ログインシェルを無効化
usermod -d /var/www -s /sbin/nologin sftp-hoge
sshdの設定を反映
service sshd reload
/var/wwwの権限を変更
rootのみ書込み可能できるように変更する必要がある(グル―プやその他に書き込み権限はNG)
chown root:sftp-hoge /var/www ls -l /var | grep sftp drwxr-xr-x. 3 root sftp-hoge 4096 3月 29 00:58 2016 www
・/var/www直下にはSFTPで書き込み出来ない。
・SElinuxが有効な場合は別途設定が必要。
参考:
sftp関係
chrootされたsftp専用ユーザを作るメモ - Qiita
openssh chrootかつsftpだけ利用できる環境を構築する - うまいぼうぶろぐ
SFTP専用アカウントを作成(ログインシェル無効化、鍵認証、chroot対応) | tutty.info
「JavaScript」ドット記法とブラケット記法
オブジェクトのプロパティにアクセスする方法は2種類ある。
ドット記法
.(ドット)を使ってプロパティにアクセスする。
var obj = new Object(); //nameというプロパティに"はらこ"という文字を格納する。 obj.name = "はらこ"; //nameというプロパティから値を取得してコンソールに表示する。 console.log(obj.name);
ブラケット記法
[]を使ってプロパティにアクセスする。
var obj = new Object(); //nameというプロパティに"はらこ"という文字を格納する。 obj["name"] = "はらこ"; //nameというプロパティから値を取得してコンソールに表示する。 console.log(obj["name"]);
違いについて
ブラケット記法は、プロパティ名に変数を使うことが出来る。
※ドット記法は変数を使ってプロパティにアクセスできない。
var obj = new Object(); var propertyName = "name" ; obj[propertyName] = "はらこ"; console.log(obj); //Object { name="はらこ"} obj.propertyName = "はらこ"; console.log(obj); //Object { name="はらこ", propertyName="はらこ"}
ブラケット記法は、プロパティ名が不正な文字でもアクセス可能。
不正なプロパティ名:数字で始まるプロパティ名
ドット記法の場合はエラーになる。
//ブラケット記法 var obj = new Object(); var propertyName = "0123" ; obj[propertyName] = "はらこ"; console.log(obj); // Object { 0123="はらこ"} //ドット記法 var obj = new Object(); obj.0123 = "はらこ"; //SyntaxErrorになる console.log(obj.0123); //SyntaxErrorになる
基本はドット記法で書く。
例えば、console.log(obj)をブラケット記法で書くとconsole["log"](obj)になるが、
ドット記法のほうが読みやすい!
ただ、動的にプロパティ名を変更してアクセスしたい場合や、
不正なプロパティ名にアクセスした場合は、ブラケット記法が有効。
意味もなく記述の仕方を混在させないことが大切ですね。
開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質
- 作者: Cody Lindley,和田祐一郎
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/06/19
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
「VB.NET」 AndAlsoとOrElse
Javaで、
if( a && b){
・・・
}
と書いた場合、aがfalseだったらbは評価されない。
VB.NETでは
If a And bThen ・・・ End If
と書いた場合、aがfalseでもbを評価してしまう。
If a AndAlso b Then ・・・ End If
と書いた場合、aがfalseだったらbは評価されない。
Orも同様で、OrElseという演算子がある。
参考サイト:
Info Archive - VB.NET - And と AndAlso / Or とOrElse
全ては時の中に… : 【VB.NET】条件式に指定する論理演算子(And, AndAlso, Or, OrElse)について
「Java」StringBufferとStringBuilderの違い
StringBufferとStringBuilderの違いは、
synchronizedするかどうか。
StringBuffer synchronizedする
StringBuilder synchronizedしない
なので、
単一スレッドからの文字列操作の場合は、StringBuilderを使いましょう。※Java5以上
実処理はAbstractStringBuilderにあって、どちらも継承してるみたいですね。
参考サイト
J2SE 5.0 Tiger 虎の穴 StringBuilder
【Java】StringBuilderとStringBufferの違いをスレッドセーフの観点で検証してみた - カタカタブログ
「Java」StringBuilderでappendメソッドの引数内での文字列連結
やっていないとは言い切れないのでメモ
参考ページ
StringBuilderを使ったクソコードはどこまで遅いか - きしだのはてな
StringBuilder sb = new StringBuilder() sb.append(data1); sb.append("," + data2 );
appendメソッドの引数の中で文字列連結やっちゃStringBuilderを使う意味ない!
急ぎの修正とかでやらかしてしまっていそう…。
appendを分けるかStringBuilder使わないこと。