OpenSSLでオレオレ証明書を作成

#手順
1.OpenSSL(Windows版)のダウンロード
2.CA証明書の作成
2-1.CA秘密鍵生成
2-2.CSR作成
2-3.証明属性定義ファイルの作成
2-4.CA証明書作成
3.サーバ証明書の作成
3-1.秘密鍵生成
3-2.CSR作成
3-3.証明属性定義ファイルの作成
3-4.サーバ証明書作成
4.CRT形式ファイルをPFX形式に変換する

*今回使ったコマンドラインはPower Shellです。

#1.OpenSSL(Windows版)のダウンロード
今回利用したWindows用にコンパイル済みのインストーラーを配布しているサイト
[http://slproweb.com/products/Win32OpenSSL.html](http://slproweb.com/products/Win32OpenSSL.html)

環境に合わせてダウンロードしてください。
*今回は下記のファイルをダウンロードしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508418/f707ba49-a288-4e11-a020-eb38665c42a6.png)

ダウンロードしたファイルを実行

ウィザードが起動したら、【Next>】をクリック

使用許諾を確認後、問題なければ【Next>】をクリック

インストール先フォルダを設定したら、【Next>】をクリック
*今回は初期状態のままにしました。

スタートメニューのフォルダを設定したら、【Next>】をクリック
*これも初期状態のままにしました。

DLLのコピー先を指定する
*今回は下側の【The OpenSSL binaries (/bin) directory】にしました

セットアップ内容が良ければ、【Install】をクリック

インストールが完了後、寄付を求められるが見なかったことにしてチェックを全て外し【Finish】をクリック

※環境変数にOpenSSLを追加する手順についてはこちらで書かせていただきます

#2.CA証明書の作成
##2-1.CA秘密鍵生成
証明書を作成したいディレクトリに移動します

```openssl genrsa```コマンドで証明書の秘密鍵を生成します

下記のコマンドで、RSA2048bitの鍵が作成されます。

```
openssl genrsa -out ca.key 2048
```

##2-2.CSR作成
2-1で作成した秘密鍵を基に、下記のコマンドでCSRを作成する
※＠＠＠＠の部分には、設定したい値を入力してください

```
openssl req -new -key ca.key -out ca.csr -subj "/C=JP/CN=@@@@"
```

```-subj``` というオプションを使うと、必要事項の対話式入力なしで指定した情報で作成することができ、便利でした

##2-3.証明書属性定義ファイルの作成
CSRを署名する前に、証明書属性定義ファイルを作成しておく
今回はca.extという名前で用意しました

```ca.ext
#　CA証明書用
[v3_ca]
basicConstraints = critical, CA:true
keyUsage = keyCertSign, cRLSign
extendedKeyUsage = serverAuth, clientAuth
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
```

##2-4.CA証明書作成
ルートCAは自己署名である必要があり、自己署名の場合は2-1で作成した秘密鍵で2-2のCSRを署名する形式
```-signkey``` オプションで署名に使用する秘密鍵を指定する

```
openssl x509 -req -signkey ca.key -extfile ca.ext -extensions "v3_ca" -in ca.csr -out ca.crt -days 3652 -sha256
```

#3.サーバ証明書の作成
これまでに作成したCAの秘密鍵と証明書を使って、サーバ証明書を作成します
##3-1.秘密鍵生成
2-1と同じ手順と同様に生成

```
openssl genrsa -out server.key 2048
```

##3-2.CSR作成
こちらも2-2と同様にCSRを作成
※＠＠＠＠の部分には、設定したい値を入力してください
```
openssl req -new -key server.key -out server.csr -subj "/CN=@@@@@"
```

##3-3.証明書属性定義ファイル作成
CA証明書用とサーバ証明書用で一部属性が異なる為、別ファイルを作成します
今回はserver.extという名前で用意しました
DNSとIPはどちらかだけでも大丈夫です

```server.ext
#TLSサーバ証明書用
[v3_server]
basicConstraints = critical, CA:false
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = DNS:@@@@@@@@@@,IP:@@.@@.@.@@@
```

##3-4.サーバ証明書作成
CAからのチェーン証明書として発行する場合は、```-CAkey``` オプションでCAの秘密鍵、```-CA``` オプションでCA証明書を指定します
これにより、CAの鍵でCSRが署名され、チェーン証明書となります

```
openssl x509 -req -CAkey ca.key -CA ca.crt -CAcreateserial -extfile server.ext -extensions "v3_server" -in server.csr -out server.crt -days 365 -sha256
```

#4.CRT形式ファイルをPFX形式に変換する
CRT形式ファイルをPFX形式に変換する際、パスワードを設定することになるので用意しておいてください

```
openssl pkcs12 -export -out Qiita.pfx -inkey server.key -in server.crt
```

上記のコマンドを実行すると下記の画像の様にパスワードの入力と確認用の再入力が求められので設定してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508418/8b76525d-7944-b5ca-cd48-ea12d9bae6f2.png)

そのまま下記のコマンドを実行するとパスワードのテキストファイルを作成できるので便利でした
今回はpassword.txtというファイルで作ります。@@@@@@@@の部分にPFX形式へ変換時に設定したパスワードを入力してください

```
echo @@@@@@@@@ > Password.txt 
```