技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

SSL/TLSの暗号スイート

SSL/TLSの設定を行っていると、

TLS_RSA_WITH_DES_CBC_SHA

など、暗号スイートを示す文字列に出くわすことがある。 これは、SSL/TLSの暗号技術の組み合わせを表しているのだが、何を意味するのか分かりにくいので、ちょっと調べてみた。

 

上の暗号スイートを例にとると、

となる。つまり、

プロトコル名_鍵(共通鍵)交換時のアルゴリズム_WITH_SSL/TLS通信時の暗号アルゴリズム_証明書のハッシュアルゴリズム 

 という形式である。

 

SSL/TLSでは、実際の暗号通信を行う前に、サーバから受け取った証明書の認証を行い、その証明書内にあるサーバの公開鍵で、暗号通信で使用する共通鍵を交換する。

この前準備で必要なのが、「鍵(共通鍵)交換時のアルゴリズム」と「証明書のハッシュアルゴリズム」で、実際の暗号通信で使用するのが「SSL/TLS通信時の暗号アルゴリズム」ということになる。

L2スイッチにIPアドレスを振る理由

L2スイッチは、L2層の情報(MACアドレス)を見て、フレームを適切な宛先に転送するネットワーク機器である。なので、フレーム転送の際にL3層の情報(IPアドレス)を見ることはなく、L2スイッチ自身にIPアドレスを振る必要はない。

つまり、サーバやルータのようにIPアドレスを振る必要はなく、ただネットワークに繋ぐだけで、L2スイッチはフレーム転送装置として機能する。

 

しかし、実際にはL2スイッチを導入する際、IPアドレスを振ることがある。これは、外部から対象のL2スイッチにアクセスして、設定確認や設定変更を行うためである。つまり、L2スイッチに振るIPアドレスは管理用のものである。

hostsファイルとDNSサーバとの優先順位

ホスト名からIPアドレスへの名前解決を行う際にOSが参照する情報として、hostsファイルとDNSサーバがある。どちらが優先されるのか、つまり、OSが提供するコマンドや API を使って名前解決した時にどちらの情報を優先的に見るようになっているのか、ちょっと調べてみた。

 

以下によると、Windowsでは、hostsファイルの方がDNSサーバより優先されるようだ。

https://blogs.technet.microsoft.com/jpntsblog/2009/07/13/windows/

 

Linuxでは、/etc/nsswitch.conf ファイルの定義によるのだが、デフォルトではhostsファイルの方がDNSサーバより優先されるようだ。

名前解決の参照順を変更する(/etc/nsswitch.conf)|Linux Tips

 

「ローカルの」hostsファイルを見て、そこで欲しい情報が得られなかったら「リモートの」DNSサーバを見に行くのは、「まずは自分で持っている情報を調べて、なければ上位に聞きに行く」という、IT (ネットワーク) 的な考えに合っているので、調べてはいないが、他のOSでもおそらく同じ挙動になるのではないかと思っている。

各行の先頭に「> 」を付けるスクリプト

各行の先頭に「> 」を付けるperlスクリプト addQuote.pl を作成した。

例えば、

aaa
bbb
ccc
ddd

という文章に対して、このスクリプトを適用すると、以下のようになる。

> aaa
> bbb
> ccc
> ddd

任意の文章に対して、引用として「> 」を付けたい場合に使用すると便利。

use strict;
use warnings;
use Win32::Clipboard;

my $clip = Win32::Clipboard();
my $text = $clip->GetText();
$text =~ s/^/> /mg;
$clip->Empty();
$clip->Set($text);

実装としては、現在のクリップボードの内容を読み込んで、各行の先頭に「> 」を付けて、またクリップボードに戻している。なので、このスクリプトの使い方としては、「> 」を付ける対象となる文章をコピーして、このスクリプトを実行し、貼り付けたい箇所でペーストすることになる。

なお、
キー操作だけで素早くアプリを起動する。 - akrad’s blog
で書いた方法で、このスクリプトを簡単にキー操作だけで起動できるようにしておくと便利。

キー操作だけで素早くアプリを起動する。

今日はWindows上での操作の小ネタについて書く。具体的には「ファイル名を指定して実行」を利用して、キー操作だけで素早くアプリを起動する方法について書く。

 

まず、以下の設定を行う。(例として sakura エディタを起動する時のものを挙げる。)

  1. アプリのショートカットを配置するためのフォルダを作成する。ここでは、例えば C:\shortcut を作成したとする。
  2. 1. で作成したフォルダのパスを、「システムの詳細設定」の「環境変数」の「path」に追加する。ユーザ環境変数の方に追加しても、システム環境変数の方に追加してもOK。
  3. C:\shortcut にsakuraエディタ(sakura.exe)のショートカットを作成し配置する。この時、例えば、ショートカット名を「sk」などにして配置する。

 

ここまで設定すると、sakuraエディタは、「Windowsキー+R」で「ファイル名を指定して実行」を立ち上げ、「sk」と入力してOKするだけで起動するようになる。

 

他のアプリについても、同様に C:\shortcut にアプリのショートカットを配置すれば、「Windowsキー+R」⇒「xx (ショートカット名)」するだけで起動することができる。

マウスを使わずに素早くアプリが起動できて便利なので、私はよく使うアプリについてはこの設定を行っている。

指定したディレクトリ配下のファイルから改行コード LF を探し出すスクリプト

引数で指定したディレクトリ配下のファイルから改行コード LF を探し出すperlスクリプト detectLF.pl を作成した。
使い方は簡単で、「perl detectLF.pl "ディレクトリ"」を実行するだけ。

use strict;
use warnings;

my $dir = $ARGV[0];
if(! -d $dir) {
    die "Invalid argument.";
}

my @fileList;
getFileList($dir, \@fileList);

foreach my $file (@fileList) {
    if(-f $file) {
        open(my $fh, $file);
        binmode $fh; # If not, all linefeeds are changed to "LF" inside Perl.

        my $lineNum = 1;
        foreach my $line (<$fh>) {
            if($line =~ /[^\x0d]\x0a$/) {
                print("$file has LF in line $lineNum.\n");
            }
            $lineNum++;
        }
    }
}

sub getFileList {
    my $dir = shift;
    my $ref_fileList = shift; # for output.
    
    opendir(my $dh, $dir);
    my @fileList = readdir($dh);
    closedir($dh);
    
    foreach my $file (sort @fileList) {
        if($file =~ /^\.{1,2}$/) {
            next;
        }
        
        if( -d "$dir/$file") {
            getFileList("$dir/$file", $ref_fileList);
        }
        else {
            push(@$ref_fileList, "$dir/$file");
        }
    }
}


実行結果は、

C:\Users\testdir/test.txt has LF in line 1.
C:\Users\testdir/test1.txt has LF in line 1.
・・・

のように表示される。

ちなみに、ファイル読み込みの時、

binmode $fh;

としてバイナリモードで読み込んでいる。これがないと、perlの内部でファイルから読み込んだ改行コード CRLF が勝手に LF に変換されるようで、CRLF も LF として検知してしまうため、こうしている。
上記のようにバイナリモードで読み込むと、perl の内部で改行コードの変換が起きず、CRLF は CRLF のまま扱われるので、改行コードを正しく判定できる。

指定したディレクトリ配下のファイル名やディレクトリ名を全て表示するスクリプト

指定したディレクトリ配下のファイル名やディレクトリ名を、再帰的に全て表示するperlスクリプト printAllUnderDir.pl を作成した。

use strict;
use warnings;

my $dir = $ARGV[0];
if(! -d $dir) {
    die "Invalid argument.";
}

$dir =~ s|\\|/|g;
getFileList($dir);

sub getFileList {
    my $dir = shift;
    print("$dir\n");
    
    opendir(my $dh, $dir);
    my @fileList = readdir($dh);
    closedir($dh);
    
    foreach my $file (sort @fileList) {
        if($file =~ /^\.{1,2}$/){
            next;
        }
        
        if( -d "$dir/$file") {
            getFileList("$dir/$file");
        }
        else {
            print("$dir/$file\n");
        }
    }
}


ディレクトリをどんどん下まで潜っていく必要があるので、再帰処理を使っている。(getFileListの中でgetFileListを呼んでいる。)

なお、

$dir =~ s|\\|/|g;

となっているのは、結果の出力の際にディレクトリ・ファイルの区切り文字を「/」で統一するため。これがないと、Windows環境において、表示結果が「C:\test\perl/dir/test.txt」みたいな感じで「\」と「/」が入り混じり、少し見にくくなってしまう。