SSLの学習

#1.環境構築

##1-1.Apache

以下のページにあるApacheHausのリンクをクリック
https://httpd.apache.org/docs/current/platform/windows.html#down

Apache 2.4.39 x64をダウンロードした。

httpd.confの「Define SRVROOT」の値をインストールフォルダに修正し、「httpd -k install」でインストール。(コマンドプロンプトは管理者として実行する)
「net start apache2.4」で起動。

##1-2.サーバ証明書

1-1でインストールしたApacheはOpenSSLが入っており、初期状態で80と443でlistenしている状態。
サーバ証明書を自分で作成し、入れ替える。

```console:CA秘密鍵作成
openssl genrsa > cakey.key
```

```console:CAリクエストファイル作成
openssl req -new -key cakey.key -out cacert.csr
```
【Country (国名)】JP
【State(都道府県名)】Tokyo
【Locality(市区町村名)】Chuo-Ku
【Organizational Name(組織名)】Hoge
【Organizational Unit(部門名)】Web
【Common Name(コモンネーム)】www.hoge.jp

```console:自分自身で署名
openssl x509 -days 365 -in cacert.csr -req -signkey cakey.key -out cacert.crt
```

```console:WEBサーバ用秘密鍵作成
openssl genrsa > private.key
```

```console:WEBサーバ用リクエストファイル作成
openssl req -new -key private.key -out webcert.csr
```

```console:証明書発行
openssl ca -in webcert.csr -out webcert.crt -days 365
```
Apacheに入っているOpenSSLだとdemoCAが無いのでエラーになった。
以下を参考にApacheのbinフォルダの下にdemoCAを作成。
https://tech.sanwasystem.com/entry/2015/08/31/234131

## 2.SSLへのアクセス

### OpenSSLを使ったコマンド

「openssl s_client -connect XXXXX.ml:443 -quiet」で接続し、
「GET / HTTP/1.0」でデータの取得が可能。

```text

C:\OpenSSL-Win32\bin>openssl s_client -connect XXXXX.ml:443 -quiet
depth=0 CN = XXXXX.ml
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = XXXXX.ml
verify error:num=21:unable to verify the first certificate
verify return:1
GET / HTTP/1.0

HTTP/1.1 200 OK
Date: Mon, 15 Jul 2019 06:13:09 GMT
Content-Type: text/html
Content-Length: 36
Connection: close
Server: nginx/1.12.2
Last-Modified: Mon, 15 Jul 2019 06:05:52 GMT
ETag: "5d2c17c0-24"
Accept-Ranges: bytes

<html>
<body>
TEST
</body>
</html>
```

### パケットキャプチャ
Wiresharkでキャプチャ

### stunnel

## 無料でSSL
freenomでドメイン登録
https://www.freenom.com/ja/index.html

Let’s Encryptで無料で証明書を取得
https://letsencrypt.org/

#3, JavaでSSL(keytools)

## サンプルプログラム
OkHttpで簡単なサンプルプログラムを作成

```java
    public static void main( String[] args ) throws IOException
    {
    	String url = "https://******/";
    	OkHttpClient client = new OkHttpClient();

    	Request request = new Request.Builder().url(url).build();
    	Call call = client.newCall(request);
    	Response response = call.execute();
    	ResponseBody body = response.body();
    	System.out.println(body);
    }
```

オレオレ証明書だと以下のエラーが出た。

```tex
Exception in thread "main" javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131)
```

# 4.証明書関連

## 4-1.用語
### CSR(証明書署名要求)、PKCS#10
RFC 2986 参照。公開鍵の認証を要求するために認証局へ送信されるメッセージのフォーマット。証明書署名要求を参照。

### DER encoded binary X.509(.CER)
個人メモ：バイナリ形式の公開鍵

### Base64 encodes X.509(.CER)
個人メモ：テキスト形式の公開鍵
「-----BEGIN CERTIFICATE-----」と「-----END CERTIFICATE-----」で囲われている。

### Cryptographic Message Syntax Standard PKCS#7(.P7B)
名前：暗号メッセージ構文標準
説明：RFC 2315 参照。PKI の下でメッセージを署名や暗号化するのに使用される。証明書の配布のためにも用いられる（例えば、PKCS #10メッセージの応答として）。現在、RFC 3852 に基づいている S/MIME の基礎を構成し、暗号メッセージ構文標準 (CMS) として更新されている。

### Personal Information Exchange PKCS#12(.PFX)
名前：	個人情報交換構文の標準
説明：RFC 7292 参照。パスワードに基づく鍵（暗号）により保護された秘密鍵と、それに関連する公開鍵証明書を保管するために一般に利用されるファイルフォーマットの定義。PFXは PKCS#12 の旧称である。
これは、複数の組み込みオブジェクト、例えば複数の証明書を格納できるコンテナフォーマットである。通常、パスワードにより保護/暗号化される。

Java の鍵ストアのフォーマットとして利用できる。Tomcat では利用できるが Apache では利用できない。

個人メモ：公開キーと秘密キーがセットになって、パスワードが付けられたファイル。MSのCertImでエクスポート可能。バイナリ形式。

## 参考URL
https://blog.putise.com/windows%E3%81%A7%E8%87%AA%E5%B7%B1%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E4%BD%9C%E6%88%90%E6%96%B9%E6%B3%95%E3%80%82%E6%9C%89%E5%8A%B9%E6%9C%9F%E9%96%93%E3%82%921%E5%B9%B4%E4%BB%A5/

https://docs.microsoft.com/ja-jp/dotnet/framework/wcf/feature-details/how-to-create-temporary-certificates-for-use-during-development#to-create-a-new-certificate-signed-by-a-root-authority-certificate