TODESKING
技術ブログ

SSL接続時にHandshakeに失敗する場合はSNIが原因かもしれない

|

発端としてはCloudFrontなHostにJsoupでHTTPS接続しようとしたところ

1
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

というエラーになり、原因調査のためにOpenSSLで当該ホストに繋いでも同様に

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ openssl s_client -connect d1lto7any9tcj3.cloudfront.net:443 -debug
CONNECTED(00000003)
write to 0x7fad93d087e0 [0x7fad94007000] (130 bytes => 130 (0x82))
0000 - 80 80 01 03 01 00 57 00-00 00 20 00 00 39 00 00   ......W... ..9..
0010 - 38 00 00 35 00 00 16 00-00 13 00 00 0a 07 00 c0   8..5............
0020 - 00 00 33 00 00 32 00 00-2f 00 00 9a 00 00 99 00   ..3..2../.......
0030 - 00 96 03 00 80 00 00 05-00 00 04 01 00 80 00 00   ................
0040 - 15 00 00 12 00 00 09 06-00 40 00 00 14 00 00 11   .........@......
0050 - 00 00 08 00 00 06 04 00-80 00 00 03 02 00 80 00   ................
0060 - 00 ff a5 a9 c7 ed 47 05-40 24 f7 e7 d1 fd 33 62   ......G.@$....3b
0070 - 6c 36 0a 90 ca ee 7c 55-d9 41 b1 1b 90 7e 91 ad   l6....|U.A...~..
0080 - d3 8b                                             ..
read from 0x7fad93d087e0 [0x7fad9400c600] (7 bytes => 7 (0x7))
0000 - 15 03 01 00 02 02 28                              ......(
26360:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-59.60.1/src/ssl/s23_clnt.c:593:

このようなことになってしまった。なおcurlやChromeでは普通につながる。

Server Helloの段階で拒否されてるので証明書の検証エラーではなさそう。

いろいろ調べたところ、SNIが原因だった(検証に使用したドメインはこのページより)。 SNI対応サーバに対しては、-servernameを指定してやらないと拒絶されるんですね。

1
2
3
4
5
6
$ openssl s_client -connect d1lto7any9tcj3.cloudfront.net:443 -servername d1lto7any9tcj3.cloudfront.net < /dev/null
CONNECTED(00000003)
depth=1 /C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 Secure Server CA - G4
verify error:num=20:unable to get local issuer certificate
verify return:0
(以下略)

Java7以降では標準でSNI有効になってるらしいんですが、 Jsoupで証明書の検証を無効にしようとConnection#validateTLSCertificates(true)したところ巻き添えで無効になってしまった模様。

人はなぜキーボードを切断してしまうのか

|

前回切断したのはじつに2007年のことで、そのモチベーションなどについてはこちらに発表資料がある

さて近年ErgoDoxの普及などで分割キーボードに注目が集まっており、個人的にも作業姿勢(スタンディングデスク使用)との兼ね合いから興味があり、よしとりあえずその辺のキーボードを買ってきて切ろうという勢いが出てきたのでProgress Touch Retroと糸鋸などが購入された。

iTerm2の日本語表示が重いのは、フォント設定を変えれば解決するかもしれない

|

  • 環境: iTerm2 2.1.1

iTerm2で、非ASCII文字が大量に表示されていると描画が異常に重くなるという問題にぶつかりまして。

アンチエイリアス無効やスクロールバッファ小さくしても無駄。試行錯誤した結果、Non-ASCII Fontに設定したフォントによって表示が重くなるようだ。

↑最初の設定(重い)

↑Non-ASCII Fontに日本語フォントを設定(軽い)

設定を変更することで、ASCII文字のみ表示されてる時と遜色ない速度になりました(めでたし)

MacBook Airのトラックパッド買った。とりあえず詳細を書く

|

Mac用の小型外付けトラックパッドがほしくて、しかし市販品が2種類(Apple Magic Trackpad, Logicool t651)しかなくてどちらもクソでかいという現状があり、MacBookの部品で自作できたらいいなというのがモチベーションです。

とりあえずebayでGENUINE APPLE MACBOOK AIR A1465 11” MID 2013 TRACK PAD 923-0429買った。

MacBookの部品を使用した外付けトラックパッド自作には前例があり、以下のページで紹介されてます。

これらの資料によれば2008年くらいまでのモデルのトラックパッドはUSBインタフェースを内蔵しているため改造が容易、それ以降の物は本体側に移動しているので難しいだろうとのことなのですが、今回手に入れたトラックパッドにはUSBインタフェース内蔵マイコンが搭載されており、最近のモデルでふたたび改造可能になった可能性があります。

全体像

全体像

写真が暗い、だがこれは序章にすぎない。

基板部分

基板部分の拡大

搭載部品

ML25L2006E

基板写真いちばん右のチップ。

1
2
3
4
MXIC
X133580-12G
MX25L2006EZNI
3L974600

Macronix のメモリIC ML25L2006Eシリーズらしい。

動作電圧は2.7V - 3.6Vっぽい。データシートの見方がいまいち自信なし。

STM32F103VB

1
2
3
4
STM32F
103VBI6
HPAFB 9U
KOR 329

ST STM32シリーズ STM32F103VB

Mainstream Performance line, ARM Cortex-M3 MCU with 128 Kbytes Flash, 72 MHz CPU, motor control, USB and CAN

USBインタフェース内臓のCPU、これは期待が持てる。

動作電圧は2.0 - 3.6V とのこと。

謎の小さいやつら

1
2
3
JXM
B3G
  A

謎です。

1
2
EEW
3NAA

謎です。

下のやつは実際は鏡面になってて(チップスケールパッケージというものだと思う)、表面の印刷を読み取るのが困難すぎる。

iFixtによるとBroadcom BCM5976A0KUB2G trackpad controllerとのこと。

参考情報

iFixitのMacBook Air分解記事

所感

とりあえず電源電圧として何ボルト用意すればいいのか知りたいですね。 基板上にレギュレータがあって適当に5V突っ込めば動いてくれるのか、3.3V用意しないといけないのかが不明。

フレキケーブルのコネクタが4個並んでいて、左右のコネクタはトラックパッドのセンサと接続されている模様。

おそらくはこの基板がキーボードとのインタフェースを兼ねていて、中央のコネクタのうち大きいほうがキーボードとの接続、もう一方が本体に続いている。

銀色のシールが貼られているようにみえるのは、トラックパッドのセンサ面にGNDを接続するためのものだと思われる。

その反対にある「いかにもコネクタ(8ピン)がつきそうな空きパターン」が気になる。iFixitの写真を見ると、フレキケーブル用と思われるコネクタが実装されている(未接続)。 これがテスト端子だとすると、USB信号線を楽に引き出せる可能性があるのだが。

超ロープロファイルなL字型Micro USBコネクタを自作する

|

あらすじ

入力デバイス配置の都合上、 超小型のL字型Micr USBコネクタ付きケーブルがないと困るということとなったが入手できなかったので自作した。

詳細

とりあえず剥く

不要な部分をガンガン切ってから適切に配線する。電源用途なのでデータ線省略できて楽。

ホットボンドで固める。ホットボンド最高!!(強度はない)

使用風景。あまりにコンパクトすぎて何がなんだかわからん状態となった。通常のコネクタ使うとキーボードとトラックパッドの間が2センチ以上空きます。

以上です。良かったですね。

5年前にもMicroじゃないUSBで同じことやってたのを思い出した

innerText(textContent)/innerHTMLを使ったHTMLエスケープは充分でないので今すぐやめろ、お前たちはもう終わりだ

|

JavaScriptでHTMLエスケープする方法を検索すると、以下のようなサンプルが上位を占めている。

1
2
// jQueryでHTMLエスケープする例
function escape(content) { return $('<div />').text(content).html() }

テキストとして解釈してHTMLとして読み出せば確かに安全だ、これはいける!!!!!111 と思ってこういうことをすると

1
container.innerHTML = '<a href="/path/to/some_content/' + escape(user_input) + '">CLICK HERE THIS IS SAFE I PROMISE</a>'

こういう入力が来て、インターネットがめちゃくちゃになってしまうので今すぐ悔い改めてほしい。

1
2
3
4
var user_input = '" onclick="alert(1)" "'

escape(user_input)
// => '" onclick="alert(1)" "'

以上、innerHTML"をエスケープしてくれるとは限らないという話でした。

じゃあどうすればいいのかというと、危険な文字を手動で置き換えるしかないんじゃないでしょうか……(下記で本当に安全なのか、それほど自信がない)

1
2
3
function escapeHtml(content) {
  return content.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
}

Logicool T651買った+分解に失敗した

|

T651というのはMac用のBluetoothトラックパッド(調べた限りではApple公式以外でほとんど唯一の選択肢)です。 マルチタッチの対応は公式のものに比べて劣る(BTT使えない等)という問題はあるようですが、普通に使うぶんには普通に使える。そして安い。

ただ電源端子が上部にあるという問題があって、キーボードの手前において充電しながら使うとケーブルが物凄く邪魔、余分な空間ができるので指が長くないと使えない。 というわけで電源端子の位置を横に移動させるべく分解を試みたんですが、ガラス製天板とプラスチックのボディの接着部を剥がすのが困難すぎたのであきらめました。 力ずくでやると絶対割れる。

というわけでバッテリ駆動で使用することになった。

こういう邪悪なデバイスはヒートガン使うといいっぽいので情熱のある人は試すといいんじゃないでしょうか。

Javadoc/Scaladocをmarkdown形式に変換するユーティリティ作った

|

todesking/nyandoc

Javadoc/Scaladocのhtmlをmarkdownに変換するコマンドを作りました。便利です。

scala-libraryの変換済みアーカイブも提供してます:

インストール

Conscriptユーザの人は

1
$ cs install todesking/nyandoc

でインストール可能です。

それ以外の人はプロジェクトをcloneしてきてsbt runするなどしてください。

使い方

1
2
$ nyandoc <source-location> <dest-dir>
$ sbt 'run <source-location> <dest-dir>'

source-locationにあるドキュメントをmarkdown化してdest-dirに保存します。

ドキュメントの探し方

  • Scala API Documentation
  • JDK API Documentation
  • その他のドキュメント
    • mavenで配布されてるライブラリのドキュメントについては、maven.orgからjarが落とせる事が多い。

ctagsを使う

~/.ctags にこのような設定を書いておく

1
2
3
4
5
--langdef=markdown-scala-nyandoc
--regex-markdown-scala-nyandoc=/^#+ .*(def|val|var|type)[[:space:]]+([^ (\[]+)/\2/

--langdef=markdown-java-nyandoc
--regex-markdown-java-nyandoc=/^#+ .*[[:space:]]([a-zA-Z0-9]+(<.+>)?)\(/\1/

ドキュメントのあるディレクトリで以下のコマンドを実行すればタグファイルができます。

1
2
ctags --langmap=markdown-scala-nyandoc:.md -R . # Scalaドキュメント用
ctags --langmap=markdown-java-nyandoc:.md -R .  # Javaドキュメント用

Vimで閲覧する

私はunite.vimを使ってます。

1
:Unite file:.nyandoc/ -default-action=rec

select-document-type

scala-2.11.2を選択

select-document

immutable/Seq.mdを選択

view-document

1
:Unite outline

view-document-outline

便利です。

Mac OSX: Vimで選択した領域をHTML化してクリップボードにコピーするコマンド

|

KeyNoteでスライド作ってると、シンタクスハイライトしたコードを貼りたくなることがあるのですが、Vimでやろうとすると非常に厄介。

  • 選択領域のHTML化自体は:TOhtmlコマンドで可能
  • HTMLをそのままKeyNoteにコピペするとプレインテキスト扱いになる
  • 生成されたHTMLをファイルに保存→Safariで開く→コピペ という手順を踏むことで貼り付け可能

あまりにもつらいので調査したところ、textutilpbcopyコマンド(どちらもMac標準だと思います)を組み合わせることで解決することがわかった。

copy_html.vim

1
2
3
4
5
6
7
8
" 選択領域(またはファイル全体)のハイライトをHTML化→rtf化してクリップボードにコピーするコマンド
command! -nargs=0 -range=% CopyHtml call s:copy_html()

function! s:copy_html() abort
  '<,'>TOhtml
  w !textutil -format html -convert rtf -stdin -stdout | pbcopy
  bdelete!
endfunction

便利!!!!!!!!!!!!!!!!!!!!!!!(以上です)

ScalaでNashornを使うときは、ScriptEngineManagerのコンストラクタにnullを渡す必要がある

|

1
2
import javax.script.ScriptEngineManager
val engineManager = new ScriptEngineManager(null);

ScriptEngineManagerの引数には目的のScriptEngineをロード可能なClassLoaderを指定する必要があるんですが、 引数省略時にはThread.currentThread.contextClassLoaderが使用されるようになっており、sbt runで起動した場合に謎のクラスローダーが使われることになってJDKのextensionであるNashornのエンジンがロード不能。なので明示的にnullを渡す必要があります。

これ、sbt consoleだと引数省略でもうまくいったりするので闇が深い。sbtのクラスローダには気をつけましょう。

ref: http://stackoverflow.com/questions/23567500/how-to-use-scriptengine-in-scalatest