はらこメモ

プログラミングに関して調べたことについてのメモ書きです。言語はバラバラ…。

レガシー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を参照可能とする場合

/etc/ssh/sshd_configを編集

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  329 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の本質

開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質

「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使わないこと。