ADFS用にオレオレ証明書作った 〜OpenSSL編


# はじめに
kintoneでSAML認証を使用したSSOを実現するのオレオレ証明書を発行する設定です。

ここまでのWindows Server構築のところは別記事を参考してほしいな！
<a href="https://qiita.com/rocca0504/items/fa1197d1f046bf8676c4" target=_blank rel="noopener noreferrer">LightSailでWindows Server立ち上げて日本語化してみた</a>

1記事にまとめると長くなるから小出しにしてるよ！
Tips的にわけとくほうがあとからまた同じ作業をしたくなった時に備忘録的に見返しやすいので ~~(自分のため~~

今回せっかくWindows Serverがあって、認証局もインスコしてですよ。
せっかくだから認証局使って証明書発行しろよとも思ったんですが、ラクなほうに逃げてしまいました。どうもすいません。

自PCがMacでopensslが入っているので、これを最新版にして自己証明書を作ります(結局それ

・・・openssl手軽で使いやすいの(
あと改めてopensslについて復習も兼ねてオプション再考してみたかったんだごめん。

# Windowsでも使えるOpenSSL
Windowsでもopensslのパッケージインストーラーがあります。
インストールしたらあとはパス通してPowerShellなりコマンドプロンプトなりで実行すれば、基本的な使い方は一緒。
<a href="https://slproweb.com/products/Win32OpenSSL.html" target=_blank rel="noopener noreferrer">Shining Light Productions</a>
 

> opensslで証明書を作成するといってもコマンドの入力パターンはいくつもあります。
> ここで挙げているのはあくまで一例。
> docやman、helpなどを良く読んで適宜オプションなどは読み替えてね！


# OpenSSLアップデート
自分のMacではHomebrewでパッケージを入れてるので、とりあえずパッケージを最新の状態にします。
自分の環境の場合、依存関係など特に問題ないので全パッケージに対してアップデートかけてます。

```
-> % brew update && brew upgrade
```

# OpenSSLでオレオレ証明書作成 〜 CSR＋秘密鍵作成
## CSRと秘密鍵をセットで生成
まずCSRと秘密鍵を作成。
以下のようにするとセットで生成できる。
秘密鍵はパスフレーズ付きで生成。[^1]

[^1]: 今回に関してはPEM形式では利用しないのでどっちでも良い。PEM形式で利用する時は一般的には暗号化しておくほうが安全。秘密鍵自体は原則見られてはいけないものなのでファイルパーミッションなども注意

> Subjectを指定しない場合：ウィザード形式で聞かれる
> SHA-2指定(-sha256)：基本指定する必要はないが、環境によっては明示的に指定する必要がある場合も

```
-> % openssl req -new -sha256 -newkey rsa:2048 -keyout key_file_name.key 
-out csr_file_name.csr
Generating a 2048 bit RSA private key
........................................+++
...................+++
writing new private key to 'key_file_name.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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) []:JP
State or Province Name (full name) []:Osaka Pref.
Locality Name (eg, city) []:Osaka City.
Organization Name (eg, company) []:KINTONE SSO TEST Corp.
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []:fqdn.example.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
```
<dl>
  <dt>-newkey rsa:2048</dt>
  <dd>CSRで使う秘密鍵の生成を同時に行う。<strong>暗号方式はRSA、鍵長は<font color="#ff0000";>2048bit</font></strong>を指定。</dd>
  <dt>-keyout key_file_name.key</dt>
  <dd>key_file_name.keyという名前で秘密鍵を生成する</dd>
  <dt>-out csr_file_name.csr</dt>
  <dd>csr_file_name.csrという名前でCSRを生成する</dd>
  <dt>-sha256</dt>
  <dd>署名アルゴリズムで<strong><font color="#ff0000";>SHA-2</font></strong>を指定
</dl>


## CSRの中身を確認

```
-> % openssl req -noout -text -in csr_file_name.csr 
```

## CSRの中身を確認 〜 署名アルゴリズムがSHA-2になっているか
```
-> % openssl req -noout -text -in csr_file_name.csr | grep sha256
    Signature Algorithm: sha256WithRSAEncryption
```
## (補足)あとから秘密鍵を暗号化する(AES256)
秘密鍵を-nodesなどを付けて暗号化せずに生成している場合も、後からパスフレーズ付きにすることが可能。

```
-> % openssl rsa -aes256 -in key_file_name.key  -out key_file_name.key 
writing RSA key
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
```


## 秘密鍵の中身を確認
```
-> % openssl rsa -noout -text -in key_file_name.key
Enter pass phrase for key_file_name.key:
Private-Key: (2048 bit)
```


# OpenSSLでオレオレ証明書作成 〜 生成した秘密鍵で署名したオレオレ証明書を作成
## 生成した秘密鍵を使用して証明書を作成
本来はここで作成したCSRを証明書発行機関などに送って証明書を発行してもらうのだが、今回は自己署名なので自分で作成した秘密鍵を使用して署名を行う。
> SHA-2指定(-sha256)：CSR作成時と異なり、ここでは明示的に指定しないと署名アルゴリズムがSHA-1になった。[^2]

[^2]: GSやシマンテックなどの証明書発行機関で証明書を発行してもらう時には昨今基本的にはSHA-2証明書しか出してないかと思うので、そこまでシビアに捉えなくて良いかもしれない。しかし自己署名でオレオレ証明書を作成する、オレオレ認証局立てる時などは環境設定なども含め注意が必要


```
-> % openssl x509 -in csr_file_name.csr -days 3650 -req -signkey key_file_name.key
-out crt_file_name.crt -sha256
Signature ok
subject=/C=JP/ST=Osaka Pref./L=Osaka City./O=KINTONE SSO TEST Corp./CN=fqdn.example.com
Getting Private key
Enter pass phrase for key_file_name.key:
```

## 完成した証明書の確認
```
-> % openssl x509 -noout -text -in crt_file_name.crt           
```


## 完成した証明書の確認 〜 署名アルゴリズムがSHA-2になっているか
```
-> % openssl x509 -noout -text -in crt_file_name.crt | grep sha256
    Signature Algorithm: sha256WithRSAEncryption
    Signature Algorithm: sha256WithRSAEncryption
```

# OpenSSLでオレオレ証明書作成 〜 PEM形式からPKCS#12(.pfx)形式への変換
ADFSに組み込む時には、PKCS#12(.pfx)形式で組み込む必要がある。
ということでPEM形式からPKCS#12への変換をかける。

> PKCS#12形式：秘密鍵と証明書をひとつのファイルに格納する方式

```
-> % openssl pkcs12 -export -inkey key_file_name.key -in crt_file_name.crt 
-out pfx_file_name.pfx
Enter pass phrase for key_file_name.key:
Enter Export Password:
Verifying - Enter Export Password:
```