オレオレ証明書作ってみる

## 勉強前イメージ

今更ながら・・・・

## 調査

### オレオレ証明書とは？

とりあえず最初にオレオレ証明書ってなんぞ？ってことですが
デジタル署名の発行形態の一つで、 `自己署名証明書` と呼ばれています。
本来ならばSSL証明書は中間認証局が発行するが、
認証局に依頼せずに自分自身の公開鍵を自分自身の秘密鍵で署名して作成するものである。
一応形式上はデジタル署名として暗号化を行うことができるが、
認証局が存在しないため公開鍵が本人のものかは確かめることができないので安全性が確保できない。

※この記事はやってみた、ってだけなので
基本的にはきちんと認証局から発行された証明書を使いましょう。


### 作ってみた

- 作る前

一旦httpsでは通信できてるが、証明書はlocalhost。

![1index.html - Google Chrome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/12792a17-364b-df74-e428-1c252fafcfba.png)


- 秘密鍵を作成

```
openssl genrsa 2048 > server.key
```

- [CSR](https://qiita.com/miyuki_samitani/items/e038e2ca7d8b6443657d) を作成

```
openssl req -new -key server.key > server.csr
```

詳細は以下ですが、今回はオレオレ証明書のため全部Enterで進みます。

```
Country Name (2 letter code) [XX]:   ## 国名
State or Province Name (full name) []:   ## 都道府県
Locality Name (eg, city) [Default City]:   ## 市町村
Organization Name (eg, company) [Default Company Ltd]:   ## 会社名
Organizational Unit Name (eg, section) []:   ## 部署・部門名
Common Name (eg, your name or your server's hostname) []:   ## コモンネーム
Email Address []:   ## メールアドレス

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:   ## パスワード
An optional company name []:   ## 会社の略称
```

csrファイルができました。

```
[root@localhost ~]# ll
....
-rw-r--r-- 1 root root  952  2月  1 21:59 server.csr
-rw-r--r-- 1 root root 1679  2月  1 21:57 server.key
```

- 自己署名証明書の作成

csrファイルとkeyファイルに対して自分で署名を行います。
有効期限は3650日で10年間で作ってみます。

```
openssl x509 -days 3650 -req -sha256 -signkey server.key < server.csr > server.crt
```

- 証明書の確認

```
openssl x509 -text < server.crt
```

`Issuer: C=XX, L=Default City, O=Default Company Ltd` は 証明書の発行者の情報。
今回は発行者も自分なのでSubjectと同じ内容が記載されています。

`Subject: C=XX, L=Default City, O=Default Company Ltd` は csrで記載した内容で、
証明書が証明している対象の情報。
基本的にドメインの内容が記載されます。

```
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            fd:30:63:f9:2c:b9:6c:0c
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=XX, L=Default City, O=Default Company Ltd
        Validity
            Not Before: Feb  1 13:07:25 2022 GMT
            Not After : Jan 30 13:07:25 2032 GMT
        Subject: C=XX, L=Default City, O=Default Company Ltd
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
```

- SSL証明書を移動

上記で作成した、以下の3つのファイルのうち keyとcrtを移動させます。
`server.crt`, `server.csr`, `server.key`
ディレクトリはconf.d配下にsslを掘りました。

```
- server.crt → /etc/httpd/conf.d/ssl/server.crt
- server.key → /etc/httpd/conf.d/ssl/server.key
```

- httpdの設定変更

```
vi /etc/httpd/conf.d/ssl.conf
```

以下に設定を行います。
本来ならvhostsとか切ったほうがいいんだろうけど、今回はお試しなのでズボラにそのままssl.confに書いちゃいます。

```
    SSLEngine on
    SSLCertificateFile /etc/httpd/conf.d/ssl/server.crt
    SSLCertificateKeyFile /etc/httpd/conf.d/ssl/server.key
```

- httpdの再起動

```
service httpd restart
```

- ブラウザで証明書の確認

相変わらず保護されていないと表示されますが、
一応証明書はあたっており期間も2022/02/01から10年間と設定されています。※変わってないけど、たまたまかぶっただけ。
`Default Company Ltd` になってるので、変わってはいます。
`openssl x509 -text < server.crt` で見た内容が表示されています。

![2index.html - Google Chrome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/90b69c5a-336e-aea9-40dc-01cc857d84b9.png)

SSL証明書当たっているのに保護されていない認定になっているのは、ルート証明書以外の自己署名証明書は信頼できないとみなされるからです。
この証明書は自分の署名で作った証明書のため、安全なことが証明できないので結局保護されていない通信になっています。

![2証明書 2022-02-01 22.27.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/3831690d-c4d7-8c3e-1387-c1d26d043657.png)

## 勉強後イメージ

実は初めて作ったかも。。
ちょくちょくほしいなぁって場面あるけど、結局やらずに終わってしまってるのでやってみました。

## 参考

- [オレオレSSL証明書（自己署名証明書）を作るワンライナー](https://www.karakaram.com/creating-self-signed-certificate/)
- [CSR作成方法](https://www.digitrust.jp/source/customer/csr_apache.shtml)
- [SSLサーバー証明書の発行手順](https://laboradian.com/issuing-ssl-certificate/)