サーバ証明書のアンチパターンをまとめてみる

## これは何?

証明書のアンチパターンについてまとめてみた。

---

## 証明書エラーが出る系

- 証明書の有効期限切れ: `Expires On`が過去の日付になっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/67f6b1c5-407f-2fe6-7d2e-49f9ec02bd37.png)


- 自己署名された証明書: SubjectのCNとIssureのCNが同一の組織でないことを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/500aecdf-fae6-493c-d233-69c269343c53.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/10481b2c-1836-7e74-e068-b12706c7c478.png)

---

## アルゴリズムが脆弱系

### 署名のアルゴリズム

> Federal Information Processing Standard (FIPS) 180-4, the Secure Hash Standard
(SHS) [FIPS 180-4], specifies seven approved hash algorithms: SHA-1, SHA-224, SHA-
256, SHA-384, SHA-512, SHA-512/224 and SHA-512/256 
> [Recommendation for Applications Using Approved Hash Algorithms](https://csrc.nist.gov/pubs/sp/800/107/r1/final)より

SHA256以上を使っておけば良さそう。

Certificate Signature Algorithmを確認可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/dfafbd32-793a-cccb-383c-98df11fe531f.png)


### 公開鍵のアルゴリズム

> For asymmetric encryption, use elliptical curve cryptography (ECC) with a secure curve such as Curve25519 as a preferred algorithm. If ECC is not available and RSA must be used, then ensure that the key is at least 2048 bits. 
> [OWASP Cryptographic Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html)より

ECC系(楕円曲線暗号)を使うか，RSAの鍵長2048 bit以上のものが推奨される。

Subject Public Key Algorithmをで確認可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/242ac066-158d-e5cb-1992-f384ff1066aa.png)

---

## サーバ証明書の種類

[CA/Browser Forum Baseline Requirements](https://cabforum.org/)により3つの基準が決められている。

- DV（Domain Validation）: ドメイン所有権の確認のみ。
- OV（Organization Validation）: ドメイン所有権に加え、ドメインを運営する組織について確認する。
- EV（Extended Validation）: OVの要件に加え、追加の厳格な組織検証が必要。

企業ならOVかEVを使うべきみたいな風潮はあるきはしているが，最近のgoogleはDV証明書を使っていたりするのでDV証明書を使うことを一概に否定するのも違うと思っている(せっかくなのでこの記事には書いておいたが)。

https://qiita.com/angel_p_57/items/446130934b425d90f89d#%E3%82%B5%E3%83%BC%E3%83%90%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AE%E7%A8%AE%E9%A1%9E 

この方の記事にいろいろ書いてあったので貼っておく。

※DV証明書はSubjectにCNしかないので見分けられる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/2e4a7b89-7a13-3f95-d3a1-f7f610e47548.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/f8db182b-e99b-0b15-854e-4fa5b6896126.png)

---

## CNを使った検証

上記の記事にCN(Common Name)を使った検証が禁止されるまでの経緯がまとまっているので詳しくはこちら。

https://eng-blog.iij.ad.jp/archives/14820

[RFC9110](https://datatracker.ietf.org/doc/html/rfc9110)でCNを使った禁止になった。

> A reference identity of type CN-ID MUST NOT be used by clients. As noted in Section 6.2.1 of [RFC6125], a reference identity of type CN-ID might be used by older clients.

これにより，[RFC2818](https://datatracker.ietf.org/doc/html/rfc2818)に記載のあるSAN値を使った検証の使用が推奨からランクアップし，現在はSAN値を使った検証が必要である。

> If a subjectAltName extension of type dNSName is present, that MUST be used as the identity. Otherwise, the (most specific) Common Name field in the Subject field of the certificate MUST be used. Although the use of the Common Name is existing practice, it is deprecated and Certification Authorities are encouraged to use the dNSName instead.

> Matching is performed using the matching rules specified by [RFC2459].  If more than one identity of a given type is present in the certificate (e.g., more than one dNSName name, a match in any one of the set is considered acceptable.)
> Names may contain the wildcard character * which is considered to match any single domain name component or component fragment. E.g., *.a.com matches foo.a.com but not bar.foo.a.com. f*.com matches foo.com but not bar.com.
> [RFC2818](https://datatracker.ietf.org/doc/html/rfc2818)

以下はSAN値の例だが，SANには複数のドメインを登録できる拡張機能であり，一つでも一致していれば証明書エラーにはならない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/a8e07f82-cdb7-cf67-da95-5455e744b0ba.png)

SANについて詳しくはこちらのQiitaを参照。

https://qiita.com/testnin2/items/0fb2211dffae2ffaec7a