StartSSLでSHA2署名の証明書

最近のChromeはSHA1署名の証明書に厳しいので,SHA2署名の証明書を発行しようとしたが,StartSSLでうまく認識できなくて困っていた.
この記事の通りにやってみたら,うまくSHA2の証明書として認識された.→ StartSSLで取得した証明書がsha1で認証されてしまう - Qiita
なんか,公式が証明書出してたので修正しました→StartCom • View topic - can I use a SHA256 Intermediate certificate
なんか,crtのダウンロード形式が変わったので修正しました

以下,nginxでsslを使う場合.
apacheで使う場合は,中間証明書をリンク先のものと差し替えるだけなんだけど,apache2.4以降の設定をほとんど真面目にやったことないので,詳しくは分かんない.

$ openssl genrsa -aes256 2048 > server.key
$ openssl req -new -sha256 -key server.key -out server.csr

StartSSLで証明書を発行したあと…
fqdn.zip 的なアーカイブをダウンロードできるようになるので,落として,解凍すると有名なhttpdサーバ毎に必要ファイルをまとめたzipが入っているので,必要なやつを更に解凍する.
なければ,OtherServer.crtにルート・中間認証局の証明書と,fqdn用に発行された証明書があるので,それを使う.

dovecotとかならパスフレーズを指定できるらしいけど,nginxはできんかった気がするので

$ openssl rsa -in server.key.org > server.key

httpとhttpsで動作を分ける場合は両方に記述を追加すること(SPDYも注意)

nginx+uwsgiで80番ポートのあるアクセスにpythonスクリプトの出力を流すようにしていたのだが,443ポートでのアクセスは想定していなかったので,特に何も設定していなかった.
そうしたら,httpsでアクセスすると表示されないはずのindex.htmが表示されることに気付いた.
さらに,pythonスクリプトファイル名をダイレクトに指定すると,pythonスクリプトがダウンロードできることも判明した.
そのファイルにこそ,パスワードの類は入れていないものの,インポートしているファイルの一覧が見えてしまうし,これはかなり危険だ.

で,443ポートのserverディレクティブに80番と同じ設定をコピペしたが,動かない…
firefoxやchromeでアクセスしていたため,443ポートとは別に443 spdyが有効になっていたのだ!
二段の罠だった.

あふwでmd5sumを実行してメッセージ枠に結果を出力する

お気に入りのツールを気ままに拡張するブログ で公開されているafxtoolsに同梱のafxamsを使う.
afxtoolsをGitHubからDLして,afxtoolsというフォルダをafxwと同じフォルダに展開した状態,かつcygwinの実行ファイル群にパスが通っている前提.

何故か,直接実行ではうまくいかなかったので,バッチファイルを挟む.
afxwと同じフォルダへ適当な名前(pmd5sum.batとする)のバッチファイルを作成して,

md5sum.exe %1 | xargs.exe c:\path\to\afxw\afxtools\bin\afxams.exe MesPrint

続いて,あふwの設定ダイアログのプログラムタブのShift-Xとかに,

%afxw%\pmd5sum.bat "$P\$F"

とかすれば,Shift-Xでカーソル下のファイルのmd5sumがメッセージ枠に出るはず.

ubuntuをwindowsマシンの第2パーティションにインストールしようとしてハマった

ハマった環境.

  • SSD+HDD搭載ノートPC
  • C:(SSD)へWindows7インストール済
  • D:(HDD)へデータを格納
  • C:とD:それぞれパーティションを切り直して,C:の後ろに/とswapを,D:の後ろに/homeを入れる
  • 新たに導入したOSはUbuntu Server 14.04.2
  • インストーラはUSBメモリを使用./dev/sdaがUSB,/dev/sdbがC:,/dev/sdcがD:
  • expert installでブートローダはLILOを/dev/sdb2のPBRへ導入
  • MBRのブートローダはMBMを導入.USBへMBM.144を焼いてインストールするが,edit partitionでは0がUSB,1がD:,2がC:だったくせに,install mbmでは1を指定するとC:のmbrに入った
    mbmから/deb/sdb2を指定してliloを起こすも,ディスクを読み込めずプロンプトにinitramfsと表示されるbusyboxが始まる.

原因

USBでインストールしたため,HDDのマッピングがうまくできていなかったこと.
by-idとかで指定してくればいいものを,自動ではやってくれなかった.

対策

  • initramfsの状態で,
    (initramfs) ls /dev/sd*
    (initramfs) ls -l /dev/disk/by-uuid/
    (initramfs) mkdir /mnt
    (initramfs) mount /dev/sda2 /mnt # <-インストール時は/dev/sdb2だったが,今は/dev/sda2
    (initramfs) cd /mnt/etc
    (initramfs) /mnt/bin/ed lilo.conf # <-ラインエディタ.viとか見付けられたら,viでもいい.とにかくエディタで修正する
    
  • lilo.confで,
    - append="root=/dev/sdb2  "
    + append="root=/dev/disk/by-uuid/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  "
    
  • lilo.confに従いブートローダの再構築.ただし,/mntにマウントした状態ではうまく動作しない&busyboxだとエラーを吐くので,
    (initramfs) mv /mnt/dev /mnt/d # <- /devを移動してくるための準備
    (initramfs) mv /dev /mnt # <- 後でchrootする/mnt配下にsdXやdisk/by-uuidがないといけない.シンボリックリンクではchroot後に上に辿れないので,移動するしかない
    (initramfs) ls /mnt/bin/*sh # <- bashとか入ってるか確認.hadacchiはbashでやった
    (initramfs) chroot /mnt /bin/bash # <- chroot後のパスで指定
    # sudo /sbin/lilo # <- rootのプロンプトに見えたけれど,sudoしないと動いてくれなかった
    # exit # <- busyboxへ戻る
    (initramfs) reboot
    

私の環境では,これで通常のubuntuが起き上がってくれた.
あとで,他に不整合が起こってないか確認すること.
といいつつ,/devは起動時に中身を再構築されるっぽいので,/dが残っていることさえ気にしなければ,特に問題ないと思う.

PythonでOSのPingコマンドを叩いて死活監視する

ここを参考にしたのだが,うまく動かなかった→[Python] Pingコマンド実行 : Edo::World::Blog
上のサイトのスクリプトでは,pingコマンド自体のエラーを見ているため,存在しないFQDNなどを指定した場合にはpingがIPアドレスを引けないことからエラーを返す.
つまりDNSが設定されていないホスト名の検出になっている.
一方で,pingコマンドを使用する通常のケースでは,たとえばあるセグメント配下の全IPアドレスにpingを飛ばすなどの作業を行なう.
この場合,例えばDestination Host Unreachableを返す場合であっても,pingコマンド自体は正常に完了するため,コマンドのエラーではDestination Host Unreachableを検出できない.
ということで,ちょっとだけ手を入れて検出できるようにした.

#!/usr/bin/python
# vim: fileencoding=utf-8

import subprocess

class Ping(object):
    def __init__(self, hosts):
        loss_pat='0 received'
        msg_pat='icmp_seq=1 '
        for host in hosts:
            ping = subprocess.Popen(
                ["ping", "-c", "1", host],
                stdout = subprocess.PIPE,
                stderr = subprocess.PIPE
            )
            out, error = ping.communicate()
            msg = ''
            for line in out.splitlines():
                if line.find(msg_pat)>-1:
                    msg = line.split(msg_pat)[1] # エラーメッセージの抽出
                if line.find(loss_pat)>-1: # パケット未到着ログの抽出
                    flag=False
                    break
            else:
                flag=True # breakしなかった場合 = パケットは到着している
            if flag:
                print('[OK]: ' + 'ServerName->' + host)
            else:
                print('[NG]: ' + 'ServerName->' + host + ', Msg->\'' + msg + '\'')


if __name__ == '__main__':
    hosts=map(lambda x:'xxx.xxx.xxx.'+str(x),range(1,255))
    Ping(hosts)

dmenuの見た目を変更

suckless-toolsに入っている、ちょー小型ランチャのdmenuの見た目を変える。
xmonad+ubuntu14.04の環境では、.Xdefaultsにdmenu.hogehogeで設定変更が効かなかったので、スクリプトから起こすことにした。

$ update-alternatives --display dmenu
dmenu - auto mode
  link currently points to /usr/bin/dmenu.default
/usr/bin/dmenu.default - priority 100
/usr/bin/dmenu.xft - priority 50
Current 'best' version is '/usr/bin/dmenu.default'.

man dmenuでオプションを調べて、例えばこんなのを作る。

/usr/bin/dmenu.xft -fn Ricty -nb '#c0c0c0' -nf black -sb navy -sf white

実行属性をつけて、テキトーなとこに置く。/usr/local/bin/dmenu.shとか。
で、dmenuで呼ばれるように設定する。

$ sudo update-alternatives --install /usr/bin/dmenu dmenu /usr/bin/dmenu.default 10
$ sudo udpate-alternatives --install /usr/bin/dmenu dmenu /usr/local/bin/dmenu.sh 100

リンクを貼らずに、今優先度高いdmenu.defaultを優先度下げる方法が分からんかったので、上書きすることにした。

xmonadでmodキーを右Altのみにする

modキーはXの中で共通の設定っぽい。

現在の設定の確認
$ xmodmap
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3        
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)
modキーのマップで、右Altだけのグループを作る
上の出力の場合、~/.Xmodmap を

remove Mod1 = Alt_R
add Mod3 = Alt_R

とし、~/.xprofile あたりで

xmodmap .Xmodmap
xmonadのmodMaskを設定する
xmonad.hsのxmonadに渡すコンフィグのところを

 , modMask = mod3Mask

とか。
外で変数に代入している場合は、そこで指定。

言わずもがな、modキーを使うのがあらゆるアプリの中でxmonadだけ、というわけではないので、他のアプリで使えなくなってもいいキーにした方がいいと思われ。
emacsは、メタキーのないよくあるキーボードを使っていると、Altキーでメタキーの役割を代替していると思うが、modキーの割り当てを変えてもメタキーは働く。
ただし、xmonadでキーバインドしている組み合わせを押した場合は、xmonadにキーを奪われてemacsでは動作しないんで注意。
よーするに、xmodmapでないところでemacsのキーバインドは動作しているっぽいんで、xmonadとキーバインドが被ってなければ使えるっぽいよ。

Rictyフォント

ubuntu だと migu 1M がパッケージ配布されていないので(14.04,2015.6.15現在),ダウンロードしてきて.fontsあたりに展開しておくこと.
手順はyascentur/Ricty · GitHub参照.
ただし,Migu 1Mは,チルダとウェイブダッシュの区別のため,全角チルダが逆向きになってるとか,気持悪いことこの上ない.
また,Miguシリーズはいずれも全角スペースの表現が気に入らないので,U+2423の「␣」で置き換えたいが,-Z で指定するとInconsolataのコードが使われ,U+2423が半角なので(Miguも),代用にならない.
ということで,fontforgeでU+2423の幅を倍にしたInconsolataとMigu 2Mでrictyを生成する.

$ sudo apt-get install fontforge fonts-inconsolata
$ wget **** # <- migu-2Mダウンロード
$ unzip **** # <- migu-2M 解凍
$ mkdir ~/.fonts
$ cp migu*/*.ttf ~/.fonts/
$ fontforge /usr/share/fonts/truetype/inconsolata/Inconsolata.ttf
   # Ctrl-Shift-> で9251へジャンプ
   # (根性のある人は,ipag.ttfの9251をコピーしInconsolata.ttfの9251へペーストし,
   #  transform → scale uniformly → 48.8% として,
   #  更に Center in Width としてから,以下をする)
   # openbox (空白文字) を選択して右クリック→set widthを選択し幅を1000に変更
   # (ElementsからFont Infoを開いて,上から3つの入力フォームを編集し
   #  Inconsolataとフォント名がかぶらないようにすると,尚良いかも)
   # Ctrl-sで~/.fontsへsfdファイルを保存
   # Ctrl-Shift-gで~.fontsへフォントの書き出し(ttf)
   # Ctrl-Qで終了
$ wget https://raw.github.com/yascentur/Ricty/master/ricty_generator.sh
$ chmod 755 ricty_generator.sh
$ ./ricty_generator.sh -Z 2423 ~/.fonts/Inconsolata.otf ~/.fonts/migu-2m-regular.ttf ~/.fonts/migu-2m-bold.ttf
$ cp *.ttf ~/.fonts/
$ fc-cache -vf

ドライブレターへの割り当て

Windows上のあるフォルダをドライブレターへの割り当てをしようとすると,

 >subst F: C:\path\to\folder

みたいにすることになるが,再起動すると割り当てが解除される.
解除されないためには,レジストリにエントリを追加する.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices]
"F:"="\??\C:\path\to\folder"

ネットワークドライブをドライブレターへ割り当てしようとすると,

 >net use F: \\servername\sharedname

なぜかこの場合は,永続的に割り当てされる.

ドライブ間/ディレクトリ間のdiff

なんかwebに転がっていそうだけど,ちゃんと探さず実装.
python on cygwinで動作確認.
os.statを使っているので,多分シンボリックリンク辿ってしまう.

なんでこんなもんがいるのかっつーと,truecryptのストレージファイルをdropboxで共有していて,うっかりあるPCでマウントしたまま別のPCでもマウントしてしまうと,ストレージファイルのタイムスタンプが両方とも新しくなって競合が起こって,それぞれのPCでマウントしていたストレージファイルが両方残ってしまうから.
すぐその場で気付けばいいんだが,後で増殖しているのに気付いた場合,差分がどこにあるか把握するのが困難なので,全ファイル,全dirを比較して,どのファイル/dirがどう差分あるのか出力する.
linuxは忘れたけど,windowsでフォルダ配下に新規ファイルを作ったりファイルを消したりすると,ディレクトリのタイムスタンプが更新されてしまうので,無駄に差分が出力されるのを防ぐため,ディレクトリの時刻は比較しないことにした.
どうせ,そのディレクトリ配下で何かいじってたら,ファイルの差分として検出できるし.

import os,sys,stat

if len(sys.argv)<3:
    sys.stderr.write("""Too few arguments!
Usage:
    python diffdrive.py drivepath1 drivepath2
""")
    sys.exit()

if not os.path.isdir(sys.argv[1]) or not os.path.isdir(sys.argv[2]):
    sys.stderr.write("""input path is not found!
""")
    sys.exit()

apath=sys.argv[1]
bpath=sys.argv[2]

def diffdir(apath,bpath,counter):
    if counter>10000: return True
    try:
        alist=os.listdir(apath)
        blist=os.listdir(bpath)
    except OSError,ex:
        if ex.errno == 13:
            alist=[]
            blist=[]
            # permission error
        else:
            raise ex

    tmplist=[]
    nextlist=[]
    for afile in alist:
        # ignore fucking wasted file started by '._' which is created by Mac OS X
        if afile[:2] == '._':
            continue
        if afile not in blist:
            sys.stdout.write("< %s/%s\n"%(apath,afile))
            counter+=1
        else:
            tmplist.append(afile)
    for bfile in blist:
        # ignore fucking wasted file started by '._' which is created by Mac OS X
        if bfile[:2] == '._':
            continue
        if bfile not in alist:
            sys.stdout.write("> %s/%s\n"%(bpath,bfile))
            counter+=1
    for abfile in tmplist:
        astat=os.stat(apath+'/'+abfile)
        bstat=os.stat(bpath+'/'+abfile)
        amode=astat[stat.ST_MODE]
        bmode=bstat[stat.ST_MODE]
        asize=astat[stat.ST_SIZE]
        bsize=bstat[stat.ST_SIZE]
        atime=astat[stat.ST_MTIME]
        btime=bstat[stat.ST_MTIME]
        if stat.S_ISDIR(amode) and stat.S_ISDIR(bmode):
            nextlist.append((apath+'/'+abfile,bpath+'/'+abfile))
        elif stat.S_ISDIR(amode)==stat.S_ISDIR(bmode):
            if asize==bsize and atime==btime: next
            elif atime>btime:
                sys.stdout.write("< %s/%s is newer\n"%(apath,abfile))
                counter+=1
            elif atime %s/%s is newer\n"%(bpath,abfile))
                counter+=1
            elif asize>bsize:
                sys.stdout.write("< %s/%s is larger\n"%(apath,abfile))
                counter+=1
            elif asize %s/%s is larger\n"%(bpath,abfile))
                counter+=1
        else:
            if stat.S_ISDIR(amode):
                afiletype='DIR'
                bfiletype='FILE'
            else:
                afiletype='FILE'
                bfiletype='DIR'
            sys.stdout.write("< %s/%s is %s\n> %s/%s is %s\n"\
                    %(apath,abfile,afiletype,bpath,abfile,bfiletype))
            counter+=1
    for nextpair in nextlist:
        if diffdir(nextpair[0],nextpair[1],counter): return
    return False

diffdir(apath,bpath,0)