OpenSSLで秘密鍵と自己証明書を用いた暗号化/復号化やってみた

# 全体の流れ
**1.用語の説明
2.暗号化方法
3.復号化方法
4.参考文献**

といった流れで進めていきます。

# 用語の説明

### OpenSSLとは


> OpenSSLとは、インターネット上で標準的に利用される暗号通信プロトコルであるSSLおよびTLSの機能を実装したプログラムの一つ。他のソフト> ウェアに組み込んで使用するライブラリであり、オープンソースソフトウェアとして公開されている。

色々書いてますが、暗号化する仕組みである***SSL/TLS等を使うことが出来る便利なライブラリ***だということだと私は理解しました。

詳しい情報は[SSLとTLSの違いとは | さくらのSSL](https://ssl.sakura.ad.jp/column/ssl_tls/)を参照ください。


### S/MIME
> S/MIME（エスマイム）とは、メールのセキュリティを高めるための暗号化技術のひとつです。
> OutlookやiPhoneのメールアプリなど多くのメールソフトに対応しており、現在では広く普及している標準規格となっています。

こちらもメール等に使われる暗号化技術であると理解しました。

[S/MIMEの仕組みを図解で分かりやすく説明](https://medium-company.com/s-mime-%E4%BB%95%E7%B5%84%E3%81%BF/#SMIME-3)で説明されているので、詳しく知りたい方は是非。

####証明書署名要求
認証局へ証明書の発行を請求する際に送るメッセージのこと。

###自己署名証明書
自分の持つ秘密鍵によって署名した証明書。

# 暗号化方法

##暗号化イメージ

***1. 秘密鍵をコマンドで作成し、証明書署名要求作成の際に紐づける***
![OpenSSL (5).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349749/367b511c-74fa-fb9b-5a11-3cf5503bd9cb.jpeg)
***2. 1.で作成した証明書署名要求を自分で署名し、秘密鍵を使い自己署名証明書を作成***
![OpenSSL (11).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349749/6227f238-6414-38c8-46a8-ea7972e9f615.jpeg)



***3. 暗号化したいファイルに自己署名証明書を紐づけ、暗号化する***
![OpenSSL (14).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349749/949c748f-e686-1dbd-0fb7-588b06392f35.jpeg)


##暗号化に必要なもの
- **暗号化したいファイル**
- **秘密鍵**
- **証明書署名要求**
- **自己署名証明書**



##やり方、実際のコマンド（つまづいたところ）
OpenSSLコマンドで秘密鍵を作成するために`openssl genrsa`コマンドを使用した

###秘密鍵の作成
**秘密鍵**とは
　・・・相手に渡したり一般公開せず、自分だけが持っている鍵

##### コマンド例

```
openssl genrsa [-aes256] {ビット数} > {出力したい秘密鍵の名前}
```

`-aes256` を使うことにより作成する鍵にパスフレーズをつけることができる。（今回は使用しない）

ビット数は2024bit以上が推奨されているため、下記のコマンドで作成する

##### 実際に使用したコマンド

```
openssl genrsa 2024 > private_key.pem
```

###証明書署名要求の作成
**証明書署名要求**とは
　・・・認証局へ送るメッセージのこと

##### コマンド例

```
openssl req -new -key {作成した秘密鍵名} > {出力したい証明書署名要求名}
```

##### 実際に使用したコマンド

```
openssl req -new -key private_key.pem > certificate.csr
```


###自己署名証明書の作成

##### コマンド例

```
openssl x509 -req -days {有効日数} -signkey {作成した秘密鍵名} <  {証明書署名要求名}　> {出力したい証明書名}
```

有効期限を10年間に設定

##### 実際に使用したコマンド

```
openssl x509 -req -days 3650 -signkey private_key.pem < certificate.csr > server.crt
```

### 暗号化

##### コマンド例
```
openssl smime -encrypt -in {暗号化したいファイル}
                          [-out {暗号化出力ファイル名}]
                          [-outform (smime or pem or der)] 
                          {受信者の証明書ファイル(PEM)}
```

`-outform`オプションを付けることにより暗号化した際のフォーマットが変更する

##### 実際に使用したコマンド
```
openssl smime -encrypt -in datafile.txt -out datafile_encrypted.txt -outform pem server.crt
```

# 復号化方法

### 復号化イメージ
![OpenSSL (15).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349749/6d4db938-a78b-c07e-078b-44a88619d0cc.jpeg)


###復号化

***1. 秘密鍵を使い復号化する***

##### コマンド例
```
openssl smime -decrypt -in {暗号化ファイル} 
                          [-inform (smime or pem or der)] 
                          -inkey {受信者の秘密鍵ファイル(PEM形式)} 
                          [-out {復号したデータ出力先}]
```

暗号化の際に`-outform`オプションを付けた場合は`-inform`オプションを使用する


##### 実際に使用したコマンド

```
openssl smime -decrypt -in datafile_encrypted.txt -inform pem -inkey private_key.pem -out datafile_decrypted.txt
```



# 参考文献
[OpenSSL で RSA の秘密鍵を作成する方法](https://weblabo.oscasierra.net/openssl-genrsa-secret-1/)
[OpenSSLとは - IT用語辞典 e-Words](https://e-words.jp/w/OpenSSL.html)
[メールのセキュリティ対策「S/MIME」とは？証明書の仕組みもご紹介](https://www.fenet.jp/infla/column/%e3%82%bb%e3%82%ad%e3%83%a5%e3%83%aa%e3%83%86%e3%82%a3/201/)
[S/MIMEメールのsmime.p7mをOpenSSLで開く](https://zv-louis.hatenablog.com/entry/2018/04/16/231437)