Posted at: 2018-04-19 05:45:47  Category: tech

SNI(Server Name Indication)に非対応のHTTPSサーバーを、検証のために立ち上げる必要がありました。
構築の方法をメモします。

うまくいった方法

Python の BaseHTTPServer で HTTPS サーバーを立ち上げる方法です。

肝になるのは、SSLContextオブジェクトにset_servername_callbackをしている箇所です。
set_servername_callbackについてはドキュメントには下記のように記載されています。

コールバック関数 server_name_callback は 3 つの引数で呼び出されます; 最初の引数は ssl.SSLSocket です。2 つ目の引数は、クライアントが相手をしようと意図しているサーバ名を表す文字列 (または TLS Client Hello がサーバ名を含まない場合は None) です。そして 3 つ目の引数はオリジナルの SSLContext です。サーバ名引数は IDNA デコードされたサーバ名です。

TLS ネゴシエーションを継続させるならば、 server_name_callback 関数は None を返さなければなりません。TLS が失敗することを必要とするなら、 constant ALERT_DESCRIPTION_* を返してください。ここにない値を返すと、致命エラー ALERT_DESCRIPTION_INTERNAL_ERROR を引き起こします。


ということで、SNIに対応しないためには、ALERT_DESCRIPTION_UNRECOGNIZED_NAMEを返せばおっけいです。

うまくいかなかった方法

SNIに対応する前の Nginx をビルドしようと思いましたが、ビルドにはまってうまくいきませんでした。
次のページよれば、Configuring HTTPS servers
SNI has been supported since 0.5.23.
とのことなので、0.5.22 を使えば、SNIに非対応のHTTPSサーバーになるはずです。
Posted at: 2018-04-16 10:15:47  Category: tech

CT(Certificate Transparency)とは

CTの仕組みにより、認証局がどのような証明書をこれまでに発行したかという情報は、公開情報となります。CT自体がどういったものであるかについては、下記に分かりやすくまとまっています。

Certificate Transparency
http://www.certificate-transparency.org/

current cryptographic mechanisms aren’t so good at detecting malicious websites if they’re provisioned with mistakenly issued certificates or certificates that have been issued by a certificate authority (CA) that’s been compromised or gone rogue.

Certificate Transparency aims to remedy these certificate-based threats by making the issuance and existence of SSL certificates open to scrutiny by domain owners, CAs, and domain users

危うい認証局から誤って発行されちゃった様な証明書の存在を、ドメイン所有者とか認証局の人とか
一般ユーザーが早めに気づくことができるようになります。

CTで遊んでみる

遊び様はいろいろありますが、手っ取り早い方法として、Comodoが公開している
Certificate Search https://crt.sh/ というツール使ってみたいと思います。
アクセスするとわかりますが、検索画面が表示されるので、そこにいろいろ入力することで世の認証局で発行された証明書を検索することができます。

crt.sh自体は、2015年からあるっぽいです。
Comodo Launches New Digital Certificate Searchable Web Site
https://www.comodo.com/news/press_releases/2015/06/comodo-launches-new-certificate-transparency-search-web-site.html

試しに、このサイト mtcq.jp に関する証明書を取得してみます。
% でワイルドカードとなりますので、 %.mtcq.jp で検索すると下記のような結果が返ります。

crt.sh ID Logged At Not Before Not After Identity Issuer Name
80865493 2017-01-27 2017-01-27 2017-04-27 mail.mtcq.jp C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3
80865493 2017-01-27 2017-01-27 2017-04-27 www.mtcq.jp C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3
64244582 2016-12-11 2016-12-11 2017-03-11 kl.mtcq.jp C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3
48723518 2016-10-29 2016-10-29 2017-01-27 mail.mtcq.jp C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3
48723518 2016-10-29 2016-10-29 2017-01-27 www.mtcq.jp C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3
31691934 2016-09-11 2016-09-11 2016-12-10 kl.mtcq.jp C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3
26395770 2016-07-31 2016-07-31 2016-10-29 mail.mtcq.jp C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3
26395770 2016-07-31 2016-07-31 2016-10-29 www.mtcq.jp C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3
17685033 2016-05-01 2016-05-01 2016-07-30 mail.mtcq.jp C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3
17685033 2016-05-01 2016-05-01 2016-07-30 www.mtcq.jp C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3


どんなドメイン名でいつどこの認証局から発行されたのかがまる分かりです。
各行のcrt.sh IDをクリックすると更に詳細な証明書情報を取得することができます。
詳細は書きませんが、Advanced な検索をすることで、CN単位の検索だけでなくOやOU項目での検索もできます。
Posted at: 2018-04-09 08:35:45  Category: programming


Pythonのデータ可視化ライブラリ、Plotly Dashのお勉強をしています。
Pythonだけの知識を用いて簡単にWebベースの可視化ツールを作れるので面白いです。

勉強がてら、簡単なツールを作ってみました。csviz
1スクリプトファイルからなります。

CSVファイルっぽい形式のファイルを配置したディレクトリを引数に指定して起動します。
$ python csviz.py dataset/

datasetディレクトリ配下には下記のようなファイルを置いてます。
$ cat dataset/hoge_service_level
# Service Level for Hoge Server System
# Hoge Servers
# Service Level(%)
# bar
# _, IPv4, IPv6
sv1.hoge.net, 95.7, 92.6
sv2.hoge.net, 94.3, 98.4
sv3.hoge.net, 98.3, 99.4


こんな感じでグラフが描けます
Posted at: 2018-04-08 01:44:44  Category: tech


openssl s_client で connect するときに cipher suites を指定してアクセスする方法。

まず、opnesslでサポートしてるcipher suites を確認してみる
そのままだと、コロン(:)で区切られてるので改行区切りに
$ openssl ciphers | sed -e "s/:/\n/g" | sort
AES128-GCM-SHA256
AES128-SHA
AES128-SHA256
AES256-GCM-SHA384
AES256-SHA
AES256-SHA256
CAMELLIA128-SHA
CAMELLIA256-SHA
DES-CBC3-SHA
DH-DSS-AES128-GCM-SHA256
DH-DSS-AES128-SHA
DH-DSS-AES128-SHA256
DH-DSS-AES256-GCM-SHA384
DH-DSS-AES256-SHA
DH-DSS-AES256-SHA256
DH-DSS-CAMELLIA128-SHA
DH-DSS-CAMELLIA256-SHA
DH-DSS-DES-CBC3-SHA
DH-DSS-SEED-SHA
DHE-DSS-AES128-GCM-SHA256
DHE-DSS-AES128-SHA
DHE-DSS-AES128-SHA256
DHE-DSS-AES256-GCM-SHA384
DHE-DSS-AES256-SHA
DHE-DSS-AES256-SHA256
DHE-DSS-CAMELLIA128-SHA
DHE-DSS-CAMELLIA256-SHA
DHE-DSS-SEED-SHA
DHE-RSA-AES128-GCM-SHA256
DHE-RSA-AES128-SHA
DHE-RSA-AES128-SHA256
DHE-RSA-AES256-GCM-SHA384
DHE-RSA-AES256-SHA
DHE-RSA-AES256-SHA256
DHE-RSA-CAMELLIA128-SHA
DHE-RSA-CAMELLIA256-SHA
DHE-RSA-SEED-SHA
DH-RSA-AES128-GCM-SHA256
DH-RSA-AES128-SHA
DH-RSA-AES128-SHA256
DH-RSA-AES256-GCM-SHA384
DH-RSA-AES256-SHA
DH-RSA-AES256-SHA256
DH-RSA-CAMELLIA128-SHA
DH-RSA-CAMELLIA256-SHA
DH-RSA-DES-CBC3-SHA
DH-RSA-SEED-SHA
ECDH-ECDSA-AES128-GCM-SHA256
ECDH-ECDSA-AES128-SHA
ECDH-ECDSA-AES128-SHA256
ECDH-ECDSA-AES256-GCM-SHA384
ECDH-ECDSA-AES256-SHA
ECDH-ECDSA-AES256-SHA384
ECDH-ECDSA-DES-CBC3-SHA
ECDH-ECDSA-RC4-SHA
ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES128-SHA
ECDHE-ECDSA-AES128-SHA256
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES256-SHA
ECDHE-ECDSA-AES256-SHA384
ECDHE-ECDSA-DES-CBC3-SHA
ECDHE-ECDSA-RC4-SHA
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-SHA
ECDHE-RSA-AES128-SHA256
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-SHA
ECDHE-RSA-AES256-SHA384
ECDHE-RSA-DES-CBC3-SHA
ECDHE-RSA-RC4-SHA
ECDH-RSA-AES128-GCM-SHA256
ECDH-RSA-AES128-SHA
ECDH-RSA-AES128-SHA256
ECDH-RSA-AES256-GCM-SHA384
ECDH-RSA-AES256-SHA
ECDH-RSA-AES256-SHA384
ECDH-RSA-DES-CBC3-SHA
ECDH-RSA-RC4-SHA
EDH-DSS-DES-CBC3-SHA
EDH-RSA-DES-CBC3-SHA
IDEA-CBC-SHA
PSK-3DES-EDE-CBC-SHA
PSK-AES128-CBC-SHA
PSK-AES256-CBC-SHA
PSK-RC4-SHA
RC4-MD5
RC4-SHA
SEED-SHA
SRP-3DES-EDE-CBC-SHA
SRP-AES-128-CBC-SHA
SRP-AES-256-CBC-SHA
SRP-DSS-3DES-EDE-CBC-SHA
SRP-DSS-AES-128-CBC-SHA
SRP-DSS-AES-256-CBC-SHA
SRP-RSA-3DES-EDE-CBC-SHA
SRP-RSA-AES-128-CBC-SHA
SRP-RSA-AES-256-CBC-SHA

ここに表示されたものを -cipher オプションに与えると、それをつかってTLSのネゴシエーションが行われるみたい
$ openssl s_client -connect mtcq.jp:443 -servername mtcq.jp  -cipher ECDHE-RSA-AES256-GCM-SHA384 < /dev/null

パケットのキャプチャとかすると、Client Hello 時にcipher suites に指定したものが使われているのがわかります。

(tls_empty_renegotiation_info_scsvってなに?リネゴシエーションに関する制御情報であることは分かった)
Posted at: 2018-04-06 04:42:35  Category: memo


CRL Distribution PointsからDER形式のCRLをダウンロードして、
CRLの中身をopensslで確認してみます。CRL Distribution Pointsとは、下記の記載のことです。
・・・省略・・・

X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication
X509v3 CRL Distribution Points:
Full Name:
URI:http://crl3.digicert.com/sha2-ev-server-g2.crl
Full Name:
URI:http://crl4.digicert.com/sha2-ev-server-g2.crl
X509v3 Certificate Policies:
Policy: 2.16.840.1.114412.2.1
CPS: https://www.digicert.com/CPS
Policy: 2.23.140.1.1
・・・省略・・・
あなたとCRL、今すぐダウンロード。
$ wget http://crl3.digicert.com/sha2-ev-server-g2.crl
中身をみてみます。
$ openssl crl -inform DER -in sha2-ev-server-g2.crl -text -noout

Certificate Revocation List (CRL):
Version 2 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 Extended Validation Server CA
Last Update: Apr 4 17:04:34 2018 GMT
Next Update: Apr 11 17:00:00 2018 GMT
CRL extensions:
X509v3 Authority Key Identifier:
keyid:3D:D3:50:A5:D6:A0:AD:EE:F3:4A:60:0A:65:D3:21:D4:F8:F8:D6:0F

X509v3 CRL Number:
297
X509v3 Issuing Distrubution Point: critical
Full Name:
URI:http://crl3.digicert.com/sha2-ev-server-g2.crl

Revoked Certificates:
Serial Number: 0E6661714B51D961E7CC9F98898D3B09
Revocation Date: Jun 13 19:44:41 2017 GMT
Serial Number: 0C739DEE06FCE885BCB5470C18F593B2
Revocation Date: Jun 14 13:54:24 2017 GMT
Serial Number: 0AE90F05DED223B48FBD2978F54F2229
Revocation Date: Jun 15 18:00:13 2017 GMT
・・・省略(失効された証明書のシリアル番号がいっぱい)・・・
Signature Algorithm: sha256WithRSAEncryption
28:1c:4a:ad:de:4e:24:cb:14:3a:33:52:6d:19:12:31:66:09:
64:6c:07:08:10:a8:3e:43:46:85:52:0d:c5:e0:26:0a:3e:a0:
ca:f6:bc:3f:1b:eb:22:99:b0:30:d1:54:64:e8:69:cf:12:98:
9c:b4:60:f9:24:45:d9:74:d5:f9:52:9f:7c:cc:e9:f0:de:89:
55:0f:6e:54:6a:16:49:05:e0:35:7d:36:39:74:3b:bb:3d:37:
a8:a8:f0:de:13:d3:dc:3c:a8:09:df:a6:34:c5:a6:fb:e2:76:
d9:1a:ea:a8:87:50:36:ee:3f:8f:84:68:21:9a:79:78:fd:4d:
f6:b9:ae:16:93:87:bf:12:d1:9d:5f:81:ed:94:25:38:89:e6:
26:1f:aa:b1:70:8e:4c:3c:b8:ee:1d:49:ed:76:6b:74:78:b0:
2d:d2:83:54:e1:fc:0f:1f:74:03:55:57:b3:5c:be:4b:88:6e:
91:22:71:84:cc:39:af:4d:f8:a6:29:b3:de:8e:61:57:b5:35:
12:6e:9f:a3:66:ea:3a:33:48:7e:97:37:5d:1c:ac:58:d6:06:
e9:c8:a8:ee:b4:34:44:4c:4e:52:85:af:00:56:89:a2:ae:d6:
c6:e2:1b:6b:2a:aa:32:57:a1:b2:4c:89:ae:7f:2e:8f:30:69:
21:23:ef:8c
五千件程度のEV証明書が失効されてました。

標準出力せずに、PEMに変換する方法は次のコマンドで
openssl crl -inform DER -in sha2-ev-server-g2.crl -outform PEM