mattintosh note

EasyWine は pixivFANBOX & BOOTH で頒布中

AKKO 3087 レトロメカニカルキーボードを買ってみた

f:id:mattintosh4:20200517221054p:plain
AKKO 3087

中国通販サイトで購入できる AKKO シリーズの 87 テンキーレスキーボード『AKKO 3087』が届きました。このシリーズはカラーバリエーションがいくつかあるのですが、今回購入したレトロカラーは人気があるのか品切れしていることが多く、Banggood でたまたま赤軸が入荷していたので購入しました。AliExpress や Gearbest でも取り扱っていて値段も色々です。(Banggood が多分一番高いです)

www.banggood.com

AKKO 3087 では Cherry MX 軸が採用されています。今回は赤軸を注文しました。

キーキャップは Anne Pro 2 と同じく PBT 製でエッジが効いているので指の当たり具合によっては少々痛いかもしれません。表面はマット長なので手垢は目立ちません。

f:id:mattintosh4:20200517221253p:plain
AKKO 3087

f:id:mattintosh4:20200517221326p:plain
AKKO 3087

EscEnterSpace は色違いの交換用キーキャップが二種類付属しています。CapsLock は形状違いのものが同梱しています。

f:id:mattintosh4:20200517221145p:plain
AKKO 3087

スタンドは二段階で設定出来ます。ただ、一段目はキーボードを奥にずらそうとするとすぐ戻ってしまいます。

f:id:mattintosh4:20200517230354p:plain
AKKO 3087

主に同等品の FILCO Majestouch Convertible 2 Tenkeyless 黒軸(赤軸は持っていない)との比較ですが、打鍵音は AKKO 3087 の方が静かです。スタビライザーもプレートマウントタイプのものが使われており、極端にガチャガチャ言うようなことは無く、Majestouch で気になるプレート鳴りや箱鳴りもありません。打鍵音は OBINS Anne Pro 2 に似ています。

打鍵音は小さい順に

  1. AKKO 3087 Cherry MX 赤軸
  2. OBINS Anne Pro 2 Gateron 赤軸
  3. FILCO Majestouch Convertible 2 Cherry MX 黒軸

という印象です。Anne Pro 2 と Majestouch は家で使っていてもそれなりに煩いなと感じますが AKKO 3087 はまぁまぁ許容範囲でしょうか。とは言え、コワーキングスペースなどではちょっと厳しいかなと思います。

重量は公称約 950 g で実測 958 g でした。Majestouch Convertible 2 87 Tenkeyless は約 1.1 kg なので AKKO 3087 の方が若干軽いです。

接続方法は USB 接続のみで Bluetooth は非対応です。USB コネクタは本体背面に配置されており、ケーブルを中央出しと横出しで選ぶことが出来ます。個人的には Majestouch Convertible 2 のように側面に配置されている方が取り外しが楽で好きなのですが、USB ケーブルがぶつかってしまう、ということもあるので背面に配置されている方が好みという方もいると思います。

欠点としては USB Type-C の挿し込みがイマイチです。付属のケーブルは問題ありませんがケーブルによってはカチッと音がせずキーボードが上手く認識されないことがありました。手持ちの Anker PowerLine+ は差し込みがイマイチでした(Type-C コネクタの内側外壁にピンが実装されているものだと挿し込みが甘くなる模様)。

ソフトウェア上では Ducky 製のキーボードとして認識されるようです(そういえば AKKO×Ducky というモデルもある)。Majestouch のような DIP スイッチは無いのでソフトウェアでリマップする必要があります。

f:id:mattintosh4:20200516211419p:plain

説明書は中国語のみなのでわかりづらいです。87 キーなので 60 % キーボードのようにリマップ出来なくてもあまり困らないですが、最近は 60 % キーボードに慣れてしまっているので出来ればカスタマイズソフトウェアが欲しいですね。

Banggood の質問で is it hot swappable? という質問に yes と答えているものがありますが、製品情報に表記されていないですし、引っ張ってみても抜ける気配は無いのでホットスワップには対応していないと思います。

f:id:mattintosh4:20200516213519p:plain


最近は机のスペースの関係で 60 % キーボードを使っているので利用頻度は低くなりそうですが良いキーボードなのでたまに使ってあげようと思います。

pip3 で curator がインストール出来なくなったので GitHub ソースからビルドする

久しぶりに Elasticsearch のインデックスを見てると保存期間 30 日で curator で削除しているはずなのにずっと残ったままになっていた。何かのタイミングで pip3 でインストールした curator が動かなくなっていたっぽい。(そういえば Debian Streach から Buster にアップグレードしたようなしなかったような)

で、pip3 で elasticsearch-curator のアップデートを試みるも謎のオプション使っててそれがコマンドに対応していないとかで完了出来ない。

面倒なので GitHub のソース引っ張ってきてビルドすることにした。

環境

Distributor ID: Debian
Description:    Debian GNU/Linux 10 (buster)
Release:        10
Codename:       buster

Terminal

$ git clone https://github.com/elastic/curator
$ cd curator
$ python3 setup.py build

実行ファイルは build ディレクトリ以下に出力された PATH の設定などをしなくてもそのまま使える。cron に登録して使うのでフルパスで呼び出せば問題ない。

Terminal

$ curator/build/exe.linux-aarch64-3.7/curator --version
curator, version 5.8.2

QMK 対応 60% キーボードのキーマップを公開してみる

60% 自作キーボードをお使いの方は結構いると思うのですが 「QMK で配置はこれにしてるよ!」みたいな記事はあまり無い気がするので自分のを公開してみます。まだ試行錯誤しているところなので QMK Configure を使っています。

先に書いておくと私は LinuxmacOS を使っていて、インフラエンジニアなのでシェルの操作をすることが多い人間です。テキストエディタVIM を使いますがシェルや macOS では Emacs キーバインドを使います。

変則的なキーマップだと気分で普通のキーボードに交換したときに脳内キーリマップが面倒なのでおとなしめな配置だと思います。

2020年5月18日

Layer 0

CapsLock は使わないので左 Ctrl に割り当てています。左 Ctrl の元の位置には Fn 1 を割り当てています。Markdown や Asciidoc で仕様書を書いたりすることが多いのでコードブロック等で ` をよく入力しますが Fn 1 だと微妙に押しづらいので右親指の位置に Fn 2 を割り当てて Layer 2 で ` を入力するようにしています。

ホームポジションが崩れるので文字入力中はあまり使いませんが右下には Anne Pro 2 のタップ機能と同じようにカーソルキーを割り当てています。Anne Pro 2 ではタップキーのキーリピート機能はありませんが、QMK の場合はダブルタップでキーリピートがかかったり、Shift との組み合わせで範囲選択も出来るので結構使いやすいです。

macOS だと左 Command と左 Option の位置が逆になりますが、これは Layer 2 で切り替えられるようにしています。

QMK Configurator
QMK Configurator

Layer 1

カーソルキーの操作はこのレイヤーを使っています。配置は VIM と同じです。右側の配置は 87 テンキーレスキーと同じにしていますが L を使うので Insert を削っています。バックライトなどの配置はデフォルトのままです。BackspaceDelete で使っています。

Anne Pro 2 だとこのレイヤーでファンクションキーが macOS のメディアコントロール(ボリューム操作等)になるのですが QMK の場合はそのままファンクションキーを入力したことになります。

QMK Configurator
QMK Configurator

Layer 2

macOS で Layer 1 のファンクションキーがメディアコントロールとして使えないのでこちらで定義しています。iTunes はあまり使わないので PreviousPlayNext は適当です。ノート PC で使うことがあるので Brightness DownBrightness Up などもこちらで定義。マウスはおまけ程度に定義しています。

QMK を使ったキーボードは macOS の Karabiner-Elements でリマップが出来ないので OptionCommand の入れ替えをここで定義しています。Toggle LAlt/LGUI があればよかったのですが QMK には無いっぽい?

Backspace には Eject を割り当てているのですが、これは macOSCtrl + Shift + Eject でディスプレイをスリープさせるためのものです。

QMK Configurator
QMK Configurator


とりあえずこんな感じ。Shift and Space を割り当ててみたりしたけど Ctrl + Space で全角半角切り替えを行っているせいかタイミングが合わなかったりするのでやめました。LT とかも上手く使えるようになって面白いことがしたいなぁ。あと N/A の重なりを上手く使える配置が思いつかない。色々覚えるときっとすごく使いやすい配置が作れると思うんだけどまだまだ未熟です。

SSH の Match Exec で接続元の環境が異なっても同じホスト名を使いたい

私はよく外出先から自宅のサーバに SSH で接続する。

自宅のサーバに「家にいるときはプライベート IP やローカルドメイン、外出先からだと自宅のグローバル IP やグローバルドメインなどで接続する」という場合、ホスト名別に設定を分けて書いていた。コンフィグに書くとこんな感じ。

~/.ssh/config

Host rpi rpi-home
    User pi
    IdentityFile ~/.ssh/rpi_id_rsa

Host rpi
    HostName 192.168.1.100

Host rpi-home
    HostName example.com
    Port 12345

ホスト名を変えれば家でも外出先でもサーバに簡単に接続できる。

Terminal

# 自宅から接続する場合
$ ssh rpi

# 外出先から接続する場合
$ ssh rpi-home

自分がいま自宅にいるか外出先かは問うまでもないのでこの設定でも特に問題は無い。しかし、やはり人間なのでたまに外にいるのにローカルのホスト名を叩いてしまったりすることがある。当然そんなホストは無いので SSH は沈黙し、そしてホスト名を間違ったことに気づく。

そこで、ssh_config の Match ブロックを使うことで条件に応じて HostNamePort を変えるようにしてみる。Exec の終了ステータスが 0 でない場合に True とする場合は !Exec で反転する。if else が使えないので仕方がない。

Host rpi
    User pi
    IdentityFile ~/.ssh/rpi_id_rsa

# ホスト名 rpi で ping が成功した場合
Match Host rpi  Exec "ping -c1 -t1 raspberrypi.local"
    HostName raspberrypi.local

# ホスト名 rpi で ping が失敗した場合
Match Host rpi !Exec "ping -c1 -t1 raspberrypi.local"
    HostName example.com
    Port 12345

ホスト名で一致する Match が二つあるので ping も二回行われてしまうが、その結果によって HostName が切り替わるので接続時のホスト名を気にする必要はなくなる。

$ ssh rpi

True になる Match が複数存在する場合は先に出現した方が利用される。下記に雑な例を示すが、この状態で自宅で実行すると ping が両方とも成功して先に記述されている HostName 192.168.1.100 が有効になる。

Host rpi
    User pi
    IdentityFile ~/.ssh/rpi_id_rsa

Match Host rpi Exec "ping -c1 -t1 192.168.1.100"
    HostName 192.168.1.100

Match Host rpi Exec "ping -c1 -t1 192.168.1.100"
    HostName example.com
    Port 12345

しかし、例えば公共の場所に自宅のサーバのプライベート IP アドレスと同じマシンが存在する場合、ping はいいとしても SSH のログイン試行履歴が残ってしまうかもしれない。これはとても恥ずかしいし、相手も不安に思うかもしれない。(通常は StrictHostKeyChecking yes なはずなので接続先のフィンガープリントが違えばそもそも SSH が教えてくれるのだがそれは置いておく)

そこで、厳密にホストを識別するためにサーバのフィンガープリントを照合するようにしてみる。

Match ブロックの結果が True になるものが複数ある場合は先の Match が適用されるので自宅と外出先の両方を同時にチェックしてしまえばいいだろう。ちなみに例のフィンガープリントは github.com のもの。

Host rpi
    User pi
    IdentityFile ~/.ssh/rpi_id_rsa

Match Host rpi Exec "ssh-keyscan -T1 -trsa 192.168.1.100 | grep -sq '192.168.1.100 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ=='"
    HostName 192.168.1.100

Match Host rpi Exec "ssh-keyscan -T1 -p 12345 -trsa example.com | grep -sq 'example.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ=='"
    HostName example.com
    Port 12345

正常な場合、フィンガープリント照会が三回ほど走ることになり無駄ではある。そう、Exec 行にどこまで書けるのかやってみたかっただけである。

ちなみに Exec は複数書いてもいいっぽい。この場合、左から順に Exec が実行され、すべての終了ステータスが 0(True)であれば有効になる。途中で 0 以外(False)になった場合はそこで Exec は終了する。何のシェルを使っているかまでは調べていないがシェルのビルトインコマンドも認識している様子。

Match Exec date           Exec /usr/bin/false
    # 失敗

Match Exec /usr/bin/false Exec date
    # 失敗

Match Exec date           Exec /usr/bin/true
    # 成功

Match Exec /usr/bin/true  Exec date
    # 成功

macOS で sslscan を使う…ソースからコンパイルすると inet_ntop のエラーが出るよ

以前 Qiita に掲載していたものですが Qiita を使うのを辞めたのでこちらに転機。

AWS脆弱性診断対応で各種プロトコルのチェックをする機会があったので、一通り curl でテストしようと思ったら最近の OS に載っている OpenSSL ではそもそも SSLv2 が無効になっているためテスト出来なかった。

Terminal

$ /usr/bin/curl --sslv2 https://example.com        # macOS 標準 curl
curl: (35) Your version of the OS does not support SSLv2

$ /opt/local/bin/curl --sslv2 https://example.com  # MacPorts 版 curl
curl: (4) OpenSSL was built without SSLv2 support

となるとシステム標準の OpenSSL は使えないので OpenSSL をソースからビルドする必要がありそう。これはちょっと面倒だなぁ…と思ってたら sslscan が OpenSSL のビルドとスタティックリンクに対応しているようだったので導入してみることにした。sslscan は各種パッケージマネージャからインストール出来るが Ubuntu の APT や MacPorts のバイナリはダイナミックリンクになっていて SSLv2 非対応の OpenSSL を使おうとするのでソースからビルドした。Ubuntu では特に問題なくコンパイル出来たが macOS の場合はエラーが起きたのでそのときのことをメモしておく。

sslscan って何?

GitHub - rbsec/sslscan: sslscan tests SSL/TLS enabled services to discover supported cipher suites

サポートしてる TLS のバージョンを調べたりすることができるツール。今回の要件では CloudFront や ELB/ALB の TLSv1.0 無効化対応をしなくてはならなかったので確認用として導入した。(この話はまた今度書こうかなと思っている)

実行してみると下記のように対応している Cipher や証明書の有効期限の確認などが出来る。

Terminal

$ sslscan example.com
Version: 1.11.11-rbsec-18-gef08e6f-static
OpenSSL 1.0.2-chacha (1.0.2g-dev)

Connected to 93.184.216.34

Testing SSL server example.com on port 443 using SNI name example.com

  TLS Fallback SCSV:
Server supports TLS Fallback SCSV

  TLS renegotiation:
Secure session renegotiation supported

  TLS Compression:
Compression disabled

  Heartbleed:
TLS 1.2 not vulnerable to heartbleed
TLS 1.1 not vulnerable to heartbleed
TLS 1.0 not vulnerable to heartbleed

  Supported Server Cipher(s):
Preferred TLSv1.2  128 bits  ECDHE-RSA-AES128-GCM-SHA256   Curve P-256 DHE 256
Accepted  TLSv1.2  256 bits  ECDHE-RSA-AES256-GCM-SHA384   Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  ECDHE-RSA-AES128-SHA256       Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.2  256 bits  ECDHE-RSA-AES256-SHA384       Curve P-256 DHE 256
Accepted  TLSv1.2  256 bits  ECDHE-RSA-AES256-SHA          Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  AES128-GCM-SHA256            
Accepted  TLSv1.2  256 bits  AES256-SHA                   
Accepted  TLSv1.2  256 bits  CAMELLIA256-SHA              
Accepted  TLSv1.2  128 bits  AES128-SHA                   
Accepted  TLSv1.2  128 bits  CAMELLIA128-SHA              
Accepted  TLSv1.2  128 bits  SEED-SHA                     
Preferred TLSv1.1  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.1  256 bits  ECDHE-RSA-AES256-SHA          Curve P-256 DHE 256
Accepted  TLSv1.1  256 bits  AES256-SHA                   
Accepted  TLSv1.1  256 bits  CAMELLIA256-SHA              
Accepted  TLSv1.1  128 bits  AES128-SHA                   
Accepted  TLSv1.1  128 bits  CAMELLIA128-SHA              
Accepted  TLSv1.1  128 bits  SEED-SHA                     
Preferred TLSv1.0  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.0  256 bits  ECDHE-RSA-AES256-SHA          Curve P-256 DHE 256
Accepted  TLSv1.0  256 bits  AES256-SHA                   
Accepted  TLSv1.0  256 bits  CAMELLIA256-SHA              
Accepted  TLSv1.0  128 bits  AES128-SHA                   
Accepted  TLSv1.0  128 bits  CAMELLIA128-SHA              
Accepted  TLSv1.0  128 bits  SEED-SHA                     

  SSL Certificate:
Signature Algorithm: sha256WithRSAEncryption
RSA Key Strength:    2048

Subject:  www.example.org
Altnames: DNS:www.example.org, DNS:example.com, DNS:example.edu, DNS:example.net, DNS:example.org, DNS:www.example.com, DNS:www.example.edu, DNS:www.example.net
Issuer:   DigiCert SHA2 High Assurance Server CA

Not valid before: Nov  3 00:00:00 2015 GMT
Not valid after:  Nov 28 12:00:00 2018 GMT

Homebrew で sslscan をインストールした場合

Homebrew では make static でインストールされるようになっているので、macOS ユーザーで「sslscan を使いたい」かつ「Homebrew を導入している」ならこれでいいと思う。

Terminal

$ /opt/hb/bin/sslscan --version
        1.11.11-static
        OpenSSL 1.0.2f  28 Jan 2016

openssl@1.1 を導入している場合はテストしていないので不明

MacPorts で sslscan をインストールした場合

依存関係にある openssl パッケージで SSLv2 が無効になっているようなのでこちらは SSLv2 のテストが出来ない。特にバリアントの設定なども無いのでこれで固定なようだ。

Terminal

$ /opt/local/bin/sslscan --version
        1.11.11
        OpenSSL 1.0.2p  14 Aug 2018
        OpenSSL version does not support SSLv2
        SSLv2 ciphers will not be detected

ソースコードから sslscan をインストールする

今回は下記の環境で検証しています。

Terminal

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.10.5
BuildVersion:   14F2511
$ git remote -v
origin  https://github.com/rbsec/sslscan (fetch)
origin  https://github.com/rbsec/sslscan (push)
$ git branch
* master
$ git log -1
commit ef08e6ffaab20e9d144436715b2ab8b24ecae54f
Author: rbsec <robin@rbsec.net>
Date:   Mon Aug 20 12:59:42 2018 +0100

    Fix missing newline in SCSV output if server only supports TLSv1.0

ソースを https://github.com/rbsec/sslscan からクローンしてくる。

Terminal

$ git clone https://github.com/rbsec/sslscan.git

README の通りに make static すると OpenSSL のビルドは成功するが、sslscan のビルドで inet_ntop 部分でエラーが出る。

Terminal

$ make static
if [ -d openssl -a -d openssl/.git ]; then \
        cd ./openssl && git checkout OpenSSL_1_0_2-stable && git pull | grep -q "Already up-to-date." && [ -e ../.openssl.is.fresh ] || touch ../.openssl.is.fresh ; \
    else \
        git clone --depth 1 -b OpenSSL_1_0_2-stable https://github.com/PeterMosmans/openssl ./openssl && cd ./openssl && touch ../.openssl.is.fresh ; \
    fi
M   apps/Makefile
M   crypto/asn1/Makefile
M   crypto/chacha/Makefile
M   crypto/evp/Makefile
M   crypto/modes/Makefile
D   krb5.h
M   ssl/Makefile
M   test/Makefile
Already on 'OpenSSL_1_0_2-stable'
Your branch is up-to-date with 'origin/OpenSSL_1_0_2-stable'.
true
/Applications/Xcode.app/Contents/Developer/usr/bin/make sslscan STATIC_BUILD=TRUE
cc -o sslscan -Wall -Wformat=2 -Wformat-security -L/tmp/sslscan/openssl/ -D_FORTIFY_SOURCE=2 -fstack-protector-all -fPIE -I/tmp/sslscan/openssl/include/ -I/tmp/sslscan/openssl/  -DVERSION=\"1.11.11-rbsec-18-gef08e6f-static\" sslscan.c -lssl -lcrypto -lz -ldl
sslscan.c:3113:13: warning: implicit declaration of function 'inet_ntop' is invalid in C99 [-Wimplicit-function-declaration]
            inet_ntop(ai->ai_family, &options->serverAddress6.sin6_addr, options->addrstr, sizeof(options->addrstr));
            ^
1 warning generated.

inet.h/usr/include/arpa/inet.h にあるが、inet.hリポジトリ内のソースを検索してみると sslscan.c 内で __linux__ が定義されていたら読み込むようになっているらしい。

Terminal

$ grep -r /usr/include inet_ntop
/usr/include/apr-1/apr_network_io.h:     *  used in inet_ntop... */
/usr/include/arpa/inet.h:const char *inet_ntop(int, const void *, char *, socklen_t);
/usr/include/net-snmp/net-snmp-config.h:/* Define to 1 if you have the `inet_ntop' function. */
/usr/include/php/ext/standard/basic_functions.h:PHP_NAMED_FUNCTION(php_inet_ntop);
/usr/include/php/main/php_config.h:/* Define to 1 if you have the `inet_ntop' function. */

sslscan/sslscan.c

#ifdef __linux__↩
    #include <arpa/inet.h>#endif

sslscan.c を書き換えるか、CPPFLAGS="-D__linux__" をセットするとビルドが通る。ただし、最初から CPPFLAGS="-D__linux__" make static としてしまうと OpenSSL のビルドでエラーが起きるので make static で OpenSSL のビルドを済ませ、sslscan のビルドでコケた後に CPPFLAGS をセットして再度 make static する。

Terminal

$ CPPFLAGS="-D__linux__" make static
if [ -d openssl -a -d openssl/.git ]; then \
        cd ./openssl && git checkout OpenSSL_1_0_2-stable && git pull | grep -q "Already up-to-date." && [ -e ../.openssl.is.fresh ] || touch ../.openssl.is.fresh ; \
    else \
        git clone --depth 1 -b OpenSSL_1_0_2-stable https://github.com/PeterMosmans/openssl ./openssl && cd ./openssl && touch ../.openssl.is.fresh ; \
    fi
M   apps/Makefile
M   crypto/asn1/Makefile
M   crypto/chacha/Makefile
M   crypto/evp/Makefile
M   crypto/modes/Makefile
D   krb5.h
M   ssl/Makefile
M   test/Makefile
Already on 'OpenSSL_1_0_2-stable'
Your branch is up-to-date with 'origin/OpenSSL_1_0_2-stable'.
true
/Applications/Xcode.app/Contents/Developer/usr/bin/make sslscan STATIC_BUILD=TRUE
cc -o sslscan -Wall -Wformat=2 -Wformat-security -L/tmp/sslscan/openssl/ -D_FORTIFY_SOURCE=2 -fstack-protector-all -fPIE -I/tmp/sslscan/openssl/include/ -I/tmp/sslscan/openssl/ -D__linux__ -DVERSION=\"1.11.11-rbsec-18-gef08e6f-static\" sslscan.c -lssl -lcrypto -lz -ldl

もしくは make static を手動で個別実行するか。make sslscan の場合は STATIC_BUILD=TRUE も必要になります。

Terminal

$ make openssl/libcrypto.a && CPPFALGS="-D__linux__" make static
または
$ make openssl/libcrypto.a && CPPFLAGS="-D__linux__" make sslscan STATIC_BUILD=TRUE

バージョンを確認して SSLv2 が使用できないメッセージが表示されなければ OK。

Terminal

$ ./sslscan --version
        1.11.11-rbsec-18-gef08e6f-static
        OpenSSL 1.0.2-chacha (1.0.2g-dev)

余談: git pull して更新したらビルド出来なくなった

make openssl 側に変更があったりするようなので openssl ディレクトリを一旦削除してから make static すれば良い。

余談: CPPFLAGS ではなく CFLAGS をセットした場合

※これは make に関するメモなので特に読む必要はない

CFLAGS="-D__linux__" とした場合は書き方によって動きが変わる。いずれも OpenSSL のビルドは終わっている状態。

make static の引数に CFLAGS="-D__linux__" を与えた場合

Makefile で設定される CFLAGS が最終的にコマンドラインで指定した -D__linux__ に置き換わるのでヘッダーが読み込まれずエラーになる。

Terminal

$ make static CFLAGS="-D__linux__"
:
中略
:
/Applications/Xcode.app/Contents/Developer/usr/bin/make sslscan STATIC_BUILD=TRUE
cc -o sslscan -Wall -Wformat=2 -Wformat-security -L/tmp/sslscan/openssl/ -D__linux__  -DVERSION=\"1.11.11-rbsec-18-gef08e6f-static\" sslscan.c -lssl -lcrypto -lz -ldl

環境変数CFLAGS をセットした場合

下記の4つの例ではそれぞれフラグや出来上がる実行ファイルが変わる。MacPorts ユーザでなければスタティックリンクになることもある。

Terminal

### command: 1 (MacPorts ユーザはダイナミックリンクになる) ###
$ CFLAGS="-D__linux__" make static
/Applications/Xcode.app/Contents/Developer/usr/bin/make sslscan STATIC_BUILD=TRUE
cc -o sslscan -Wall -Wformat=2 -Wformat-security -L/tmp/sslscan/openssl/ -D__linux__ -D_FORTIFY_SOURCE=2 -fstack-protector-all -fPIE -I/usr/local/include -I/usr/local/ssl/include -I/usr/local/ssl/include/openssl -I/usr/local/opt/openssl/include -I/opt/local/include -I/opt/local/include/openssl -D_FORTIFY_SOURCE=2 -fstack-protector-all -fPIE -I/tmp/sslscan/openssl/include/ -I/tmp/sslscan/openssl/  -DVERSION=\"1.11.11-rbsec-18-gef08e6f-static\" sslscan.c -lssl -lcrypto -lz -ldl

### command: 2 (フラグが余計に追加されるがスタティックリンクになる) ###
$ CFLAGS="-D__linux__" make static STATIC_BUILD=TRUE
/Applications/Xcode.app/Contents/Developer/usr/bin/make sslscan STATIC_BUILD=TRUE
cc -o sslscan -Wall -Wformat=2 -Wformat-security -L/private/tmp/sslscan/openssl/ -D__linux__ -D_FORTIFY_SOURCE=2 -fstack-protector-all -fPIE -I/tmp/sslscan/openssl/include/ -I/tmp/sslscan/openssl/ -D_FORTIFY_SOURCE=2 -fstack-protector-all -fPIE -I/private/tmp/sslscan/openssl/include/ -I/private/tmp/sslscan/openssl/  -DVERSION=\"1.11.11-rbsec-18-gef08e6f-static\" sslscan.c -lssl -lcrypto -lz -ldl
rbsec-18-gef08e6f-static\" sslscan.c -lssl -lcrypto -lz -ldl

### command: 3 (MacPorts ユーザはダイナミックリンクになる) ###
$ CFLAGS="-D__linux__" make sslscan
cc -o sslscan -Wall -Wformat=2 -Wformat-security -L/usr/local/lib -L/usr/local/ssl/lib -L/usr/local/opt/openssl/lib -L/opt/local/lib -D__linux__ -D_FORTIFY_SOURCE=2 -fstack-protector-all -fPIE -I/usr/local/include -I/usr/local/ssl/include -I/usr/local/ssl/include/openssl -I/usr/local/opt/openssl/include -I/opt/local/include -I/opt/local/include/openssl  -DVERSION=\"1.11.11-rbsec-18-gef08e6f\" sslscan.c -lssl -lcrypto -ldl
ld: warning: directory not found for option '-L/usr/local/ssl/lib'
ld: warning: directory not found for option '-L/usr/local/opt/openssl/lib'

### command: 4 (正常。CPPFLAGS と同様) ###
$ CFLAGS="-D__linux__" make sslscan STATIC_BUILD=TRUE
cc -o sslscan -Wall -Wformat=2 -Wformat-security -L/tmp/sslscan/openssl/ -D__linux__ -D_FORTIFY_SOURCE=2 -fstack-protector-all -fPIE -I/tmp/sslscan/openssl/include/ -I/tmp/sslscan/openssl/  -DVERSION=\"1.11.11-rbsec-18-gef08e6f-static\" sslscan.c -lssl -lcrypto -lz -ldl

これについては Makefile を見てみるとわかるが、make static の場合は sslscan の前に openssl/libcrypto.a がある。このときにはまだ STATIC_BUILD はセットされていないため FALSE になり、else 側へ落ちる。そして定義済みである CFLAGS には -I/usr/local/include -I/usr/local/ssl/include -I/usr/local/ssl/include/openssl -I/usr/local/opt/openssl/include -I/opt/local/include -I/opt/local/include/openssl によって各種パラメータが追加される。

openssl/libcrypto.a が終わって、sslscan ターゲットが実行されるときには STATIC_BUILD=TRUE がセットされているので今度は -I${PWD}/include/ -I${PWD}/CFLAGS に追加され、優先するインクルードディレクトリの順番が狂って意図しない結果になる。

MacPorts ユーザであれば /opt/local が優先されているのでそちらのヘッダーが読み込まれ、Homebrew ユーザであれば /usr/local が優先されてそちらのヘッダーを読み込んでしまうかもしれない。(私は Homebrew を /opt/hb にインストールしているので試してはいない)

sslscan/Makefile

# for static linking
ifeq ($(STATIC_BUILD), TRUE)
PWD          = $(shell pwd)/openssl
LDFLAGS      += -L${PWD}/
CFLAGS       += -I${PWD}/include/ -I${PWD}/
LIBS         = -lssl -lcrypto -lz
ifneq ($(OS), FreeBSD)
    LIBS += -ldl
endif
ifeq ($(OS), SunOS)
    LIBS += -lsocket -lnsl
endif
GIT_VERSION  := $(GIT_VERSION)-static
else
# for dynamic linking
LDFLAGS   += -L/usr/local/lib -L/usr/local/ssl/lib -L/usr/local/opt/openssl/lib -L/opt/local/lib
CFLAGS    += -I/usr/local/include -I/usr/local/ssl/include -I/usr/local/ssl/include/openssl -I/usr/local/opt/openssl/include -I/opt/local/include -I/opt/local/include/openssl
endif