git clone https:// 時の証明書エラー
HTTPS で GitHub から 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
解決までの詳細
とりあえず認証局証明書を更新してみる。
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
curl は SSL_CERT_FILE
を参照しないようだ。curl は CURL_CA_BUNDLE
を見るが、ヘルプによると git ではそれとは別に http.sslCAInfo
か GIT_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年以上使う場合は早めに延長するとトータルでは節約になる場合がある。