SSL/TLSや公開鍵暗号や証明書周りのメモ

## はじめに

間違ってる可能性が(ry
質問やマサカリがあれば、コメントか[@miyagaw61](https://twitter.com/miyagaw61)までお願いします。

## SSL/TLSの概念

秘/公: Webサーバーの秘密鍵/公開鍵
CA秘/CA公: 中間CAの秘密鍵/公開鍵
ルート公: ルートCAの公開鍵
共: Webサーバーとクライアントの共通鍵

を意味してます。

「情報」というのは「Webサーバーの情報」です。
その情報を認証局（CA）が実在するか確認し、認められた場合に証明書が発行される仕組みになっています。

共通鍵の生成方法は他にもあるらしい...？

![E7BEC692-598B-4985-8ED8-2285E684DA12.jpeg](https://qiita-image-store.s3.amazonaws.com/0/132486/bd8aba6b-87ed-e096-cbf7-71f3c3fe5f2b.jpeg)


## sshで使用する鍵の作成方法

### 公開鍵・秘密鍵の作成

```
ssh-keygen -t rsa -b 4096 -C [メールアドレス]
```

パスを聞かれるので絶対値で指定しましょう。
この方法では、公開鍵がssh専用になります。

## sshで使用しない鍵の作成方法

### 秘密鍵作成

```
openssl genrsa 2048 > [秘密鍵]
```

### 秘密鍵のDER化

PEMは内部にDERがある説？（http://bearmini.hatenablog.com/entry/2014/02/05/143510）

・パスワード無し

```
openssl rsa -inform PEM -outform DER -in [秘密鍵] -out [秘密鍵.der]
```

・パスワードあり

```
openssl rsa -inform PEM -outform DER -in [秘密鍵] -out [秘密鍵.der] -passin pass:[パスワード]
```

・失敗パターン

なぜかわかりませんが失敗しました。

```
openssl x509 -outform DER -in [秘密鍵] -out [秘密鍵.der]
openssl x509 -outform DER -in [秘密鍵] -out [秘密鍵.der] -passin pass:[パスワード]

TIPS:
x509とは、pemを表します。
他にも、pkcs[n]サブコマンドもあります。
```

### 公開鍵の作成

・シンプル（PEM）

```
openssl rsa -in [秘密鍵] -pubout -out [公開鍵]
```

・形式指定

```
openssl rsa -in [秘密鍵] -pubout -out [公開鍵] -outform [DER/NET/PEM(DEFAULT)]
```

・パスワード設定

```
openssl rsa -in [秘密鍵] -pubout -out [公開鍵] -passin pass:[パスワード]
```

## SSL証明書（crtファイル）作成

CSRを作成するときに色々聞かれますが、何も入力せずにエンターを押すとデフォルト値が使われます。
が、Common Name（FQDN）くらいはちゃんと入力しとけという記述が多く見受けられました。

```
openssl req -new -key [秘密鍵] > [CSR].csr
openssl x509 -days 3650 -req -signkey [秘密鍵] < [CSR].csr > [SSL証明書].crt
```

## p12ファイル作成

p12（pkcs12）とは、公開鍵（証明書）や秘密鍵をまとめるためのフォーマットの一つです。

```
openssl pkcs12 -export -in [sslサーバ証明書] -inkey [秘密鍵] -certfile [中間CA証明書] -out [p12ファイル]
```

-certfileオプションは付けなくてもできました（というかオプション無しでしか確認できてません）。

```
openssl pkcs12 -export -in [sslサーバ証明書] -inkey [秘密鍵] -out [p12ファイル]
```

秘密鍵だけをまとめる場合はこちら

```
openssl pkcs12 -export -nocerts -inkey [秘密鍵] -out [p12ファイル]
```

## p12ファイルをDERエンコード

という記述は見つけたがサイトによってはDERではなくCERといっているところもあったり、そもそもオプション名的にderじゃなくてdesなのでは？という感じなので、信憑性は低いです。

```
openssl pkcs12 -in [p12ファイル]  -des -out [DER形式のp12ファイル]
```

## 参考

・[お前らのSSH Keysの作り方は間違っている - Qiita](https://qiita.com/suthio/items/2760e4cff0e185fe2db9) ( [archive](http://archive.is/BwF9X) )
・[PKCS #12 個人情報交換ファイルフォーマットについて - Qiita](https://qiita.com/kunichiko/items/3e2ec27928a95630a73a) ( [archive](http://archive.is/eMxzp) )
・[RSA鍵、証明書のファイルフォーマットについて - Qiita](https://qiita.com/kunichiko/items/12cbccaadcbf41c72735) ( [archive](http://archive.is/pvSKH) )
・[OpenSSLコマンドによる公開鍵暗号、電子署名の方法 - Qiita](https://qiita.com/kunichiko/items/3c0b1a2915e9dacbd4c1) ( [archive](http://archive.is/otdJ0) )
・[SSLサーバー証明書 : 証明書ファイルの種類とopensslでの変換方法 | DigiCert](https://rms-digicert.ne.jp/howto/basis/file_types.html) ( [archive](http://archive.is/X8rGW) )
・[OpenSSL で RSA の秘密鍵を作成する方法 | WEB ARCH LABO](https://weblabo.oscasierra.net/openssl-genrsa-secret-1/) ( [archive](http://archive.is/dNpuU) )
・[opensslコマンドtips — ありえるえりあ](http://dev.ariel-networks.com/column/tech/openssl/) ( [archive](http://archive.is/pzpGT) )
・[OpenSSLコマンドの備忘録 - Qiita](https://qiita.com/takech9203/items/5206f8e2572e95209bbc) ( [archive](http://archive.is/v4zTd) )
・[無料でHTTPS化できる「Let&#39;s Encrypt」をやってみた ※install.sh付き - Qiita](https://qiita.com/daiki_44/items/a3616390f277722b97e0) ( [archive](http://archive.is/FswZs) )
・[クライアント証明書の作り方 | 日々雑記](http://y-yagi.tumblr.com/post/18179788088/%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9) ( [archive](http://archive.is/l8HAs) )
・[OpenSSLコマンドでオレオレ証明書を作り、ルート認証局としてサーバー証明書を発行する - Sanwa Systems Tech Blog](http://tech.sanwasystem.com/entry/2015/08/31/234131) ( [archive](http://archive.is/amHot) )
・[サーバー証明書のつくりかたと、その原理 - kirinwikiblog](http://kirinwiki.hatenablog.com/entry/2014/07/03/220315) ( [archive](http://archive.is/od1BQ) )
・[SSL/TLSの仕組みを知っていますか？](https://www.jstage.jst.go.jp/article/itej/69/3/69_228/_pdf) ( [archive](https://drive.google.com/open?id=1W4GWd_b9fMyhieOw2_PUlRap7IHYJ_id) )
・[【図解】よく分かるデジタル(SSL/TLS)証明書の仕組み 〜CSR、自己署名(オレオレ)証明書、ルート証明書、中間証明書の必要性や扱いについて〜  |  SEの道標](http://milestone-of-se.nesuke.com/sv-advanced/digicert/digital-certification-summary/) ( [archive](http://archive.is/8JECs) )
・[デジタル証明書とデジタル署名について - bambinya&#39;s blog](http://bambinya.hateblo.jp/entry/2015/03/20/130843) ( [archive](http://archive.is/ymY1O) )
・[SSLサーバ証明書の中身 - Q&A - SSLOFF](https://www.ssloff.com/members/knowledgebase.php?action=displayarticle&id=88) ( [archive](http://archive.is/LbEeu) )
・[SSLサーバ証明書の身分証明機能の信頼性 - Q&A - SSLOFF](https://www.ssloff.com/members/knowledgebase.php?action=displayarticle&id=91) ( [archive](http://archive.is/LbEeu) )
・[理解してるつもりの SSL/TLS でも、もっと理解したら面白かった話 &middot; けんごのお屋敷](http://tkengo.github.io/blog/2015/12/01/https-details/) ( [archive](http://archive.is/Pmd0T) )
・[SSL/TLSの解説と選び方まとめ｜ジオトラスト](https://www.geotrust.co.jp/ssl_guideline/ssl_beginners/) ( [archive](http://archive.is/DAh5h) )
・[SSL／TLS（Part.3）：不正アクセスを防止するSSL/TLS（4） - ＠IT ](http://www.atmarkit.co.jp/ait/articles/0101/16/news002_3.html) ( [archive](http://archive.is/Suhjl) )
・[SSL／TLS（Part.4）：不正アクセスを防止するSSL/TLS（5） - ＠IT ](http://www.atmarkit.co.jp/ait/articles/0106/16/news001_2.html) ( [archive](http://archive.is/GIg7m) )
・[サーバー証明書のつくりかたと、その原理 - kirinwikiblog](http://kirinwiki.hatenablog.com/entry/2014/07/03/220315) ( [archive](http://archive.is/od1BQ) )
・[中間証明書 - f5](https://f5.com/jp/education/glossary/glossary136-21619) ( [archive](http://archive.is/YmdTR) )
・[今なぜHTTPS化なのか？インターネットの信頼性のために、技術者が知っておきたいTLSの歴史と技術背景 - エンジニアHub｜若手Webエンジニアのキャリアを考える！](https://employment.en-japan.com/engineerhub/entry/2018/02/14/110000) ( [archive](http://archive.is/tQYrm) )
・[電子証明書あれこれ - Qiita](https://qiita.com/irohamaru/items/cfbb5aa4ff0dae56e360) ( [archive](http://archive.is/ufwnn) )
・[証明書や秘密鍵のフォーマットを変換することだけを書いた | Divide et impera](https://glorificatio.org/archives/2914) ( [archive](http://archive.is/UVvNq) )
・[RSA 秘密鍵/公開鍵ファイルのフォーマット - bearmini&#39;s blog](http://bearmini.hatenablog.com/entry/2014/02/05/143510) ( [archive](http://archive.is/kyQcM) )
・[Abstract Syntax Notation One - Wikipedia](https://ja.wikipedia.org/wiki/Abstract_Syntax_Notation_One) ( [archive](http://archive.is/X3uPv) )
・[X.690 - Wikipedia](https://en.wikipedia.org/wiki/X.690#DER_encoding) ( [archive](http://archive.is/Avurx) )
・[オレオレ証明書をopensslで作る（詳細版） - ろば電子が詰まっている](http://d.hatena.ne.jp/ozuma/20130511/1368284304) ( [archive](http://archive.is/E6mTc) )