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" ボタンをクリックします。