kavo’s diary

備忘録

ISUCON練習 ISUCON12予選環境構築(自己署名証明書利用)

久しぶりに構築。色々あったのでやり方メモ。

資材

aws-isucon/isucon12-qualify at main · matsuu/aws-isucon · GitHub

構築

インスタンス起動

インスタンスタイプ選択

https://ap-northeast-1.console.aws.amazon.com/ec2/home?region=ap-northeast-1#SpotInstances:

足りるか分からないが一旦安いt3.microにする→apt updateで無応答になってしまったのでt3a.mediumに変更。

インターネットからの HTTPS トラフィックを許可 をチェック。

ssh接続に成功。

ssh -i "2021-06-14-isucon-renshu.pem" ubuntu@ec2-hoge.ap-northeast-1.compute.amazonaws.com

ベンチ正常終了に成功。

h$ ./bench -target-addr 127.0.0.1:443
[ADMIN] 19:50:46.609523 TargetURL: https://t.isucon.dev, TargetAddr: 127.0.0.1:443, RequestTimeout: 30s, InitializeRequestTimeout: 30s, StrictPrepare: true, ReproduceMode: false
[ADMIN] 19:50:52.497786 POST /initialize 200 初期化
19:50:52.497895 初期化リクエストに成功しました 実装言語:go
19:50:52.497912 整合性チェックを開始します
[ADMIN] 19:50:52.528032 POST /api/admin/tenants/add 200 新規テナント作成
[ADMIN] 19:50:52.550243 GET /index.html 200 /index.htmlを確認
[ADMIN] 19:50:52.556737 GET /js/app.3a4ec98c.js 200 /js/app.3a4ec98c.jsを確認
...
19:52:19.417110 Error 1 (Critical:0)
19:52:19.417121 PASSED: true
19:52:19.417132 SCORE: 1880 (+1898 -18(1%))

クライアント証明書

おいてあるファイルのままだとChromeにインポートできなかったので変換。

cd /etc/nginx/tls
openssl pkcs12 -export -in fullchain.pem -inkey key.pem -out fullchain.p12

isucon12-qualify/nginx/tls at main · isucon/isucon12-qualify · GitHub

設定してみたがERR_CONNECTION_TIMED_OUT

期限切れてた。

$ openssl x509 -in fullchain.pem -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            03:b0:ab:d5:14:2d:81:74:e8:26:1a:d4:f8:21:ae:20:62:87
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = Let's Encrypt, CN = R3
        Validity
            Not Before: Jun 17 04:40:52 2022 GMT
            Not After : Sep 15 04:40:51 2022 GMT
openssl genpkey -algorithm RSA -out key.pem -pkeyopt rsa_keygen_bits:2048
openssl req -new -key key.pem -out request.csr
openssl x509 -req -days 365 -in request.csr -signkey key.pem -out fullchain.pem
openssl dhparam -out dhparam.pem 2048

sudo cp /tmp/mycert2/myserver.crt fullchain.pem
sudo cp /tmp/mycert2/myserver.key key.pem

sudo service nginx restart
sudo service nginx status

これだとブラウザアクセスが上手く行かない。

Unable to communicate securely with peer: requested domain name does not match the server’s certificate. HTTP Strict Transport Security: true HTTP 公開鍵ピンニング: false

Google Chrome から HTTPS でアクセスすると警告が表示される - Customer Support

Subject Alternative Name (SAN) の設定がないのがダメなのかも。

san.conf

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[req_distinguished_name]
CN = *.t.isucon.dev

[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.t.isucon.dev
DNS.2 = isucon.t.isucon.dev
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout myserver.key -out myserver.crt -config san.cnf
openssl pkcs12 -export -out myserver.pfx -inkey myserver.key -in myserver.crt

ファイル入れ替えてnginx再起動

それでもERR_SSL_KEY_USAGE_INCOMPATIBLEになった。 Key Usage属性がダメっぽい。

openssl genrsa -out myserver.key 2048
openssl req -new -key myserver.key -out myserver.csr -subj "/CN=*.t.isucon.dev"
echo basicConstraints = CA:FALSE > extfile.cnf
echo subjectAltName = DNS:*.t.isucon.dev >> extfile.cnf
echo keyUsage = digitalSignature, nonRepudiation, keyEncipherment >> extfile.cnf
openssl x509 -req -days 365 -in myserver.csr -signkey myserver.key -out myserver.crt -extfile extfile.cnf
openssl pkcs12 -export -out myserver.pfx -inkey myserver.key -in myserver.crt

openssl x509 -in myserver.crt -text -noout

ファイル入れ替えてnginx再起動

ここまでやってもNET::ERR_CERT_AUTHORITY_INVALID。

そのあと↓とchrome再起動をやったらできた。どれが最低限必要だったのか整理できてないが、一旦ブラウザ表示はできた。

アドレスバーに chrome://net-internals/#hsts を入力します。
"Delete domain security policies" のセクションに移動します。
"Delete domain" のフィールドにドメイン名(例:isucon.t.isucon.dev)を入力し、"Delete" ボタンをクリックします。