git clone https:// 時の証明書エラー

HTTPSGitHub から clone しようとしたら証明書のエラーになる。

git clone --depth=1 https://github.com.example.com/repo.git
Cloning into 'repo'...
fatal: unable to access 'https://github.com.example.com/repo.git/': SSL certificate problem, verify that the CA cert is OK. Details:

メンテが微妙な共有サーバで cacert.pem が10年物で使い物にならない。それで仕方なくローカルに置いていたが、また古くなっているのかもしれない。
検索すると検証をオフにする話がよくヒットする。確かに GitHub に限っては ブラウザで commit ID を読めるので証明書の検証をオフにしても改竄は見つけられるが、それならば git プロトコルで clone したほうが楽そうだ。
そんなわけで今回検証を無効にせずに手探りで HTTPS のまま解決してみた。

解決法

http://curl.haxx.se/ca/cacert.pem
をダウンロードして git config の http.sslCAInfo に設定すればよい

git config --global http.sslCAInfo /path/to/cacert.pem

但し、libcurlが古いとgithub.comへTLS接続ができないのでそちらも更新する必要がある。

解決までの詳細

とりあえず認証局証明書を更新してみる。

wget http://curl.haxx.se/ca/cacert.pem -O $SSL_CERT_FILE.new
diff -U0 $SSL_CERT_FILE $SSL_CERT_FILE.new | less
mv $SSL_CERT_FILE.new $SSL_CERT_FILE

更新したのだが出力は変わらず。SSL_CERT_FILE を参照していないのか。git のドキュメントによると GIT_CURL_VERBOSE で詳しいエラーが出るらしい。

GIT_CURL_VERBOSE=1 git clone --depth=1 https://github.com.example.com/repo.git
Cloning into 'repo'...
* Couldn't find host github.com in the .netrc file, using defaults
* About to connect() to github.com port 443 (#0)
*   Trying 192.30.252.128... * Connected to github.com (192.30.252.128) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: /usr/local/share/curl/curl-ca-bundle.crt
  CApath: none
* SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
* Expire cleared
* Connection #0 to host github.com left intact
fatal: unable to access 'https://github.com.example.com/repo.git/': SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

curlSSL_CERT_FILE を参照しないようだ。curlCURL_CA_BUNDLE を見るが、ヘルプによると git ではそれとは別に http.sslCAInfoGIT_SSL_CERTで設定するようだ。

git config --global http.sslCAInfo $SSL_CERT_FILE
GIT_CURL_VERBOSE=1 git clone --depth=1 https://github.com.example.com/repo.git
Cloning into 'repo'...
* Couldn't find host github.com in the .netrc file, using defaults
* About to connect() to github.com port 443 (#0)
*   Trying 192.30.252.130... * Connected to github.com (192.30.252.130) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: $SSL_CERT_FILE
  CApath: none
* error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm
* Expire cleared
* Connection #0 to host github.com left intact
fatal: unable to access 'https://github.com.example.com/repo.git/': error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm

証明書は通ったがハッシュアルゴリズムが未知と出る。

続きを読む

target.microad.jpのアタックがひどい

夕方頃に限って動的ページに秒間10アクセスしてくるので負荷が急上昇する。
マイクロアドというのは掲載していないのだがGoogle AdSenseリセラープログラムとやらの関係で来るのだろうか。他の広告ネットワークのbotはちゃんと間隔を置くし説明URLがUser-Agentに書いてあったりするのだが、これは crawler/1.0 とあるだけでもちろんFromヘッダもないしrobots.txtにもアクセスしないしで納得の質の低さだ。
こんなbotのためだけにサイトを開いているわけではないので勘弁してほしい。

続きを読む

CentOS 6のLogwatch 7.3.6でFail2Ban 0.9.2のBan/Unbanがレポートされない

0.9(a9b9c6ea03, 5630c56c75)でログレベルが変わっていたようだ。Logwatch側も7.4.1(r225, bug#37)でそれに対応している。ただFail2BanはEPEL(Fedora)なのでバージョンの追従具合に差が出てしまったようだ。
間に合わせだがLogwatchのr225の差分を取り込めばいい。

# /usr/share/logwatch/scripts/services/fail2ban
-    } elsif ( my ($Service,$Action,$Host) = ($ThisLine =~ m/WARNING:?\s\[?(.*?)[]:]?\s(Ban|Unban)[^\.]* (\S+)/)) {
+    } elsif ( my ($Service,$Action,$Host) = ($ThisLine =~ m/(?:WARNING|NOTICE):?\s\[?(.*?)[]:]?\s(Ban|Unban)[^\.]* (\S+)/)) {

上記パッチで一応動くようになるが [ がレポートのフィルタ名の先頭についてしまうようなので
m/(?:WARNING|NOTICE):?\s\[?(.*?)[]:]?\s(Ban|Unban)[^\.]* (\S+)/ではなく
m/(?:WARNING|NOTICE):?\s+\[?(.*?)[]:]?\s(Ban|Unban)[^\.]* (\S+)/とした。

fail2banが起動しない

サーバに再起動を掛けてから立ち上がらなくなった。(fail2ban-0.9.2-1.el6.noarch)
詳しいエラーを出すために fail2ban-client -xvd start してみると

ERROR  Failed during configuration: 'NoneType' object has no attribute 'startswith'
Traceback (most recent call last):
  File "/usr/bin/fail2ban-client", line 435, in <module>
    if client.start(sys.argv):
  File "/usr/bin/fail2ban-client", line 368, in start
    self.dumpConfig(self.__stream)
  File "/usr/bin/fail2ban-client", line 424, in dumpConfig
    for c in cmd:
TypeError: 'NoneType' object is not iterable

と出る*1。たどっていった結果、直接の原因は

# /usr/lib/python2.6/site-packages/fail2ban/client/jailreader.py (el6)
# /usr/lib/python2.7/site-packages/fail2ban/client/jailreader.py (el7)
    def extractOptions(option):
        match = JailReader.optionCRE.match(option)
        if not match:
            # TODO proper error handling
            return None, None
# ...
    def getOptions(self):
# ...
            if self.__opts["filter"]:
                filterName, filterOpt = JailReader.extractOptions(
                    self.__opts["filter"])

この部分だった。jail.local の filter の設定値が optionCRE にマッチしなくなっていたらしい。
filterにはfilter.d以下のファイル名の拡張子抜きの値を指定する。当該サーバではここに独自のファイル群の入ったディレクトリのシンボリックリンクを置いているため、filter = custom/filter-name のようにしていた。
ソースでは optionCRE = re.compile("^((?:\w|-|_|\.)+)(?:\[(.*)\])?$") となっていて、スラッシュを含むとマッチしない。続くエラー処理はTODOのため、別の場所で返り値の None の属性を取ろうとして落ちたようだ。
サブディレクトリを掘れないというのは不便なので、姑息に (?:\w|-|_|\.)+/を足して [\w_./-]+ として対処した。バージョンアップ時のことはまた今度考えようと思う。

追記:
0.10.2でリファクタリングされた際に文字制限が緩くなったのでパッチが不要になった。

*1:-d(ダンプ)しないと別の場所で落ちる。同じ種類のエラーだがバックトレースが出ない。

JetBrains製品がサブスクリプション型になるらしい

単品の値段が$89/年、2年目$71、3年目以降$53になるようで製品にもよるが2年目以降ほぼ半額だった従来型と比べるとやや値上げのようだ。*1
ただし既存ユーザに関しては2016年中は割引があるため適用を受けると40%オフで最初から$53/年になる。これに加えて移行時に有効なライセンスがあるか失効していても1年以内ならば、2年目が無料になって実質半額で継続できる。*2
一方で今までと違い永久使用権(perpetual fallback license)を得られるのは年間ライセンス開始時点でのメジャーバージョンのみで期間中のメジャーバージョンアップは含まないようだ。既存ユーザの2年目無料というのはこの点とのバランスを取ったのだろう。
結局これ以上に便利なソフトを知らないので今年も更新するのだろうが、2年目の値上げとあわせてライセンスを継続させる圧力が強まった気がする。

値上げする製品でも11月1日中までは従来型のライセンス購入・延長もできるので、更に2年以上使う場合は早めに延長するとトータルでは節約になる場合がある。

*1:WebStormは初年度分もかなり値上げしている。

*2:従来通りライセンス切れの期間も利用していたものとしてカウントされる。