401と403、そして証明書
目標
401と403を手がかりに、認証問題の層を絞り込み、証明書の失敗モードをファイルから直接確認できるようになります。
なぜ重要なのか
401は認証の失敗です。「あなたが誰なのか確認できない」。403は認可の失敗です。「誰なのかはわかったが、これはできないことになっている」。この区別が、調査の方向を正反対に分けます。401なら認証情報そのものを見て、403なら認証情報には手を付ける必要なく、権限の設定を見ます。「権限エラー」とひとまとめにすると、見当違いの方向を何時間も掘ることになります。
そして、401の中でも理由が分かれます。トークンなし、不明なトークン、期限切れのトークンは、すべて401ですが、対応が異なるので、応答本文の理由の文字列も一緒に見る必要があります。
証明書のほうでは、2つを確認します。期限切れはnotAfterで見ますが、このとき、現在時刻も一緒に表示する必要があります。時計が間違っているクライアントで、問題のない証明書が期限切れに見えることが、かなり多いからです。名前の不一致は、CNではなくSANを見る必要がありますが、このラボの証明書はCNしか持っていないので、サブジェクト名で確認します。
トークン4種類: (헤더 없음)(韓国語で「ヘッダーなし」を意味します)、expired-token-2025、readonly-token、fde-prod-2026
証明書2つ: /opt/data/tls/expired.pem、/opt/data/tls/wronghost.pem(接続しようとしていた名前はapi.customer.example)
ステップ
/opt/app/authapi.pyを実行して、127.0.0.1:8003/publicが200を返すようにしてください。- Authorizationヘッダーなしで
/privateを呼び出したステータスコードを、/root/auth/no_token.txtに書いてください。 expired-token-2025で/privateを呼び出した応答本文を、/root/auth/expired_reason.txtに保存してください。readonly-tokenで/privateを呼び出したステータスコードを、/root/auth/readonly.txtに書いてください。fde-prod-2026で/privateを呼び出したステータスコードを、/root/auth/ok.txtに書いてください。expired.pemの有効期限を、/root/auth/cert_expiry.txtに保存してください。wronghost.pemのサブジェクト名を、/root/auth/cert_cn.txtに保存してください。/root/auth/report.mdに、401と403の違い、そして2つの証明書の問題をまとめてください。2つのステータスコードと、api.other.example、有効期限の年が含まれている必要があります。
参考
curl -s -o /dev/null -w '%{http_code}' -H 'Authorization: Bearer 토큰' http://127.0.0.1:8003/private(プレースホルダーはトークンです)openssl x509 -in 파일 -noout -enddate -subject(プレースホルダーはファイルです)- 現在時刻と比較するには、
date -uも一緒に表示してみてください。 - よくあるミス1: ステップ3でステータスコードだけを保存することです。401の理由が必要です。
- よくあるミス2: ヘッダーの形式を、
Bearerなしでトークンだけ送ることです。そうすると、トークンがそもそも認識されません。
認証ゲートウェイを起動する
/opt/app/authapi.pyを実行して、127.0.0.1:8003/publicが200を返すようにしてください。
/opt/app/authapi.pyを実行すると、127.0.0.1:8003で待ち受けます。/publicは認証なしで開かれています。
トークンなしで呼び出してみる
Authorizationヘッダーなしで/privateを呼び出したステータスコードを/root/auth/no_token.txtに書いてください。
Authorizationヘッダーなしで/privateを呼ぶと、どのコードが来るかを記録してください。
期限切れの理由を確保する
expired-token-2025で/privateを呼び出した応答本文を/root/auth/expired_reason.txtに保存してください。
期限切れのトークンも401です。ステータスコードだけでは理由がわからないので、応答本文を保存してください。
権限不足を確認する
readonly-tokenで/privateを呼び出したステータスコードを/root/auth/readonly.txtに書いてください。
readonly-tokenは、身元確認は通過します。そのときに出るコードが、401とどう違うかを見てください。
正常な認証を確認する
fde-prod-2026で/privateを呼び出したステータスコードを/root/auth/ok.txtに書いてください。
fde-prod-2026のトークンなら通過します。成功のコードを記録してください。
期限切れの証明書を確認する
expired.pemの有効期限を/root/auth/cert_expiry.txtに保存してください。
openssl x509で、証明書の有効期間を見られます。有効期限がいつかを保存してください。
名前が異なる証明書を確認する
wronghost.pemのサブジェクト名を/root/auth/cert_cn.txtに保存してください。
wronghost.pemのサブジェクト名を取り出してください。接続しようとしていた名前とは違います。
診断レポートを書く
/root/auth/report.mdに、401と403の違い、そして2つの証明書の問題をまとめてください。2つのステータスコードと、api.other.example、有効期限の年が含まれている必要があります。
401と403がそれぞれ何の失敗なのか、そして2つの証明書の問題が何なのかを、まとめてください。