自己証明書の作成方法


ここではテスト目的で使用する自己証明書の作成方法を記載する。本ドキュメントでは全て下記の環境で作業を行っていく。

```console
[vagrant@localhost ~]$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
```

## 作成方法

openssl reqコマンドで証明書の発行に必要な鍵とCSRの生成が一気に可能(コマンド実行時に入力するドメイン名や会社名等は適宜変更すること)。

```console
$openssl req \
       -newkey rsa:2048 -nodes -keyout domain.key \
       -x509 -days 365 -out domain.crt
Generating a 2048 bit RSA private key
...+++
.........................................................................................................+++
writing new private key to 'domain.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:jp
State or Province Name (full name) []:tokyo
Locality Name (eg, city) [Default City]:tokyo
Organization Name (eg, company) [Default Company Ltd]:mycompany
Organizational Unit Name (eg, section) []:it
Common Name (eg, your name or your server's hostname) []:mydomain.co.jp
Email Address []:
```

([OpenSSL Essentials: Working with SSL Certificates, Private Keys and CSRs](https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs#generate-a-self-signed-certificate)の自己証明書生成時のopensslの実行方法から引用)

|オプション|意味|
|:--|:--|
|-newkey　rsa:2048|鍵を生成する。その後の引数で鍵の生成に使用するアルゴリズム(RSA)と鍵長(2048bit)を指定。|
|-nodes|生成される鍵を暗号化しない|
|-keyout domain.key|SSL/TLSの通信時に利用する鍵の名前|
|-x509|このオプションを付ける事で証明書の発行を行える(通常は証明書署名要求のファイルを生成する)|
|-days 365|-x509オプションによって生成される証明書の期限を指定。この例では365日間証明書が有効。|
|-out domain.crt|証明書のファイル|
|-sha256|証明書に利用する署名アルゴリズムをsha256に指定.openssl -dgst -hで指定出来るオプションを確認できる。|

鍵はガイドラインを参考にRSAの2048bitを指定している。

>CRYPTREC では、素因数分解問題の困難性に関する調査研究に基づいて RSA の安全性に関す
る見積りを作成している。これによれば、RSA 2048 ビットを素因数分解するのにおおむね 1025
～1027 FLOPS 程度の計算量が必要との見積もりを出しており、劇的な素因数分解手法の発見がな
い限り、計算機性能の向上を考慮しても世界最速の計算機が 1 年かけて解読可能となるのは 2035
年以降と予想している。

([SSL/TLS暗号設定ガイドライン](https://www.ipa.go.jp/security/vuln/ssl_crypt_config.html)から引用)

署名のアルゴリズムもガイドラインを参考にSHA-256を指定している。

>現在発行されているサーバ証明書は、大多数が RSA と SHA-256 との組合せによるものか、RSA
と SHA-1との組み合わせによるものである。特に最近では、安全性向上が必要との観点から SHA-1
から SHA-256 への移行も急速に進みだしている。

([SSL/TLS暗号設定ガイドライン](https://www.ipa.go.jp/security/vuln/ssl_crypt_config.html)から引用)

※ SHA-256をサポートしていないクライアントもあるので必要に応じてSHA-1を利用する必要がある

## 証明書の確認

### crtファイルの確認

生成した証明書の内容を確認する。

- Subjectの情報がopenssl reqコマンド実行時に指定したドメインになっている
- validityで表示されている期限が生成した時間から365日後になっている
- IssuerがSubjectと同じになっている(自己署名なので)



```
[vagrant@localhost ~]$ openssl x509 -text -in domain.crt  | head -n 13
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 12366094239158262854 (0xab9d313130085c46)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=jp, ST=tokyo, L=tokyo, O=mycompany, OU=it, CN=mydomain.co.jp
        Validity
            Not Before: Jun 18 13:16:50 2016 GMT
            Not After : Jun 18 13:16:50 2017 GMT
        Subject: C=jp, ST=tokyo, L=tokyo, O=mycompany, OU=it, CN=mydomain.co.jp
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
```

### サーバ上に配置して確認

nginxに適当に配置

```
[vagrant@localhost ~]$ grep ssl /etc/nginx/nginx.conf
        listen       443 ssl;
	ssl_certificate domain.crt;
	ssl_certificate_key domain.key;
```

opensslコマンドで接続して確認。自己署名というエラーが表示されるが、無事証明書を確認。

```
[vagrant@localhost ~]$ openssl s_client -connect `hostname`:443 | head -n 6
depth=0 C = jp, ST = tokyo, L = tokyo, O = mycompany, OU = it, CN = mydomain.co.jp
verify error:num=18:self signed certificate
verify return:1
depth=0 C = jp, ST = tokyo, L = tokyo, O = mycompany, OU = it, CN = mydomain.co.jp
verify return:1
CONNECTED(00000003)
---
Certificate chain
 0 s:/C=jp/ST=tokyo/L=tokyo/O=mycompany/OU=it/CN=mydomain.co.jp
   i:/C=jp/ST=tokyo/L=tokyo/O=mycompany/OU=it/CN=mydomain.co.jp
---
```