Opensslでオレオレ証明書を作る【備忘録】

>学校の授業の備忘録シリーズ
>参考になるかわからないため鵜吞みにしないこと
>手っ取り早く証明書作成の内容が見たければ2にどうぞ
>この内容はCentOS7用なのでCentOS6で行うとSHA-1の問題が発生する。(SHA-2で作成すれば行けると思われる)


#1. CA by openssl（座学）
##1-1. opensslの基本
###・opensslとは
暗号機能を一手に引き受けるライブラリ。
この機能をインストールすれば下記の能力を手に入れることができる。

 - ca
 - sslサーバ
 - sslクライアント
 - 暗号
 - ハッシュ
 - 電子証明書

オープンソースであり、ほとんどのUnix,Windowsなどに対応している。
その他のプラットフォームでも移植されて稼働している。

###・FIPS 140-2承認済み
暗号モジュールに関するセキュリティ要件の使用を規定する米国連邦標準規格

##1-2. Linuxの場合
最小インストールでもインストールされる

opensslで暗号してみる

```vim:書式.linux
openssl コマンド オプション パラメータ
```

```vim:sample.linux
openssl speed rsa des

openssl genrsa -out key.pem 1024
```

##1-3. opensslで暗号してみる

###ファイルを作成

```vim:
vi plain.txt
```

###AESで暗号
```vim:asf.linux
openssl aes-256-cbc -e -in plain.txt -out enc.bin
```

##1-4. 復号ファイルの確認
```vim:
cat dec.txt
```

####Option
- e 暗号
- d 復号
- in 入力
- out 出力



##1-5. RSA公開鍵で暗号してみる
鍵ペアを作る
公開鍵の書き出し
暗号
確認
復号

準備：空のディレクトリを作る

###1-5-1. 鍵ペアを作る
```vim:
openssl genrsa -out key.pem 1024
```

genrsa RSA公開鍵の発生（Generation）
-out　鍵ペアを書き出すコマンド
1024 鍵長
-des 秘密鍵の暗号化(今回は使用していない)

###1-5-2. 公開鍵の書き出し
```vim:
openssl rsa -in key.pem -pubout -out public.pem
```


###1-5-3. rsa関連コマンド

####・暗号

```asf.linux
openssl rsautl -pubin -encrypt -inkey public.pem -in plain.txt -out enc.bin
```
####・binaryを開く
```vim:open_binary
hexdump enc.bin -C
```


####・復号
```vim:
openssl rsautl -decrypt -inkey key.pem -in enc.bin -out ttt.txt
cat ttt.txt
```


#2. OpenSSLでオレオレ証明書を作る（実習）
##2-0. CA構築順序
- CA鍵ペア作成
- CA証明書作成
- index.txtの作成
- シリアル番号の設定

####・openssl設定ファイル場所
```vim:
/etc/pki/tls/openssl.cnf
```
→confではないことに注意

```vim:
/etc/pki/CA
```
CA関連ファイルが格納される

##2-1. root CAの作成
###ここで行うこと
- 2-1-1. 鍵ペアの作成（秘密鍵の生成）
- 2-1-1. CSR(公開鍵＋証明書署名要求)の作成
- 2-1-2. 自己署名証明書の生成

### 鍵ペアの作成
####・秘密鍵生成

```vim:create_cakey.pem
cd /etc/pki/CA/private/

openssl genrsa -out cakey.pem 2048
```

>genrsa RSAキーペアの発生
>aes128　秘密鍵保護用暗号の指定
>out ファイル　秘密鍵書き出しファイル

####・CSR(証明書署名要求:Certificate Signing Request)を作成する
>CSRとは, **申請書** のようなもの
>証明書署名要求は認証曲に対してサーバ管理者が自分の公開鍵に電子署名（すなわち認証曲の秘密鍵で署名）してもらうように依頼するメッセージである。
>秘密鍵から公開鍵を生成する必要があるが、opensslのreqコマンドで秘密鍵を指定することで公開鍵を取り出してくれるので、明示的にファイルとして作る必要はない。

#####注意
>**証明書署名要求に自己署名する前に、発行した証明書の履歴を格納する index.txt ファイルと、次に発行する証明書のシリアル番号を格納する serial ファイルを作成しておきます。これらのファイルを正しく作成しておかないと、証明書に署名しようとした時にエラーが発生します。**

```vim:create_ca.csr
cd /etc/pki/CA/private 

openssl req -new -key cakey.pem -out ca.csr


Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:TOKYO(ExampleState)
Locality Name (eg, city) [Default City]:SHINJUKU(ExampleLocality)
Organization Name (eg, company) [Default Company Ltd]:GOOGLE(ExampleOrganization)
Organizational Unit Name (eg, section) []:省略可(ExampleOrganizationalUnit)
Common Name (eg, your name or your server's hostname) []:SAMPLE CA(認証局の名前)
Email Address []:省略可

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:省略可
An optional company name []:省略可
```

Common Name(以下CN)までのものはサーバーのCSR作成で使うので
記述した内容はしっかり覚えておく。

###2-1-2. 自己署名証明書の作成

```vim:cd,touch_index.txt
cd /etc/pki/CA
touch index.txt
```
上記のコマンドを打ってから下記のコマンドで証明書を作成

```vim:create_ca.csr
openssl ca -create_serial -out ca.crt -days 365 -batch -keyfile cakey.pem -selfsign -extensions v3_ca -infiles ca.csr
```

###2-2. crtファイル（CAを証明したファイル）の移動
・CAの証明書をopenssl.cnfに設定されたCAの証明書ファイル名に一致させる 

```vim:mv_ca.crt
cd /etc/pki/CA/private
mv ca.crt ../cacert.pem
```
・CAの鍵をopenssl.cnfに設定されたCAの鍵ファイル名に一致させる
→privateの鍵名は同じcakey.pemのはず

```vim:touch_index,serial
cd /etc/pki/CA
touch index.txt（ない場合に行う）
vi serial (ない場合に行う)
```

###2-3. openssl　設定変更
 /etc/pki/tls/openssl.cnfのバックアップ
 openssl.cnfの修正
 [usr_cert]セクションの下記を変更・確認する
 
```vim:openssl.cnf
basicCnstraints = CA:FALSE
ncCertType = server
```

##2-4. サーバの証明書作成手順
###ここで行うこと
- 2-4-1. 鍵ペアの作成（秘密鍵の生成）
- 2-4-1. CSR(公開鍵＋証明書署名要求)の作成
- 2-4-2. サーバ証明書の生成

###2-4-1. 鍵ペアの作成
####・秘密鍵作成

```vim:create_server.key
openssl genrsa -out server.key 4096
```
####・CSRの作成
 
```vim:create_server.csr
openssl req -key server.key -out server.csr -new 

Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:TOKYO(ExampleState)
Locality Name (eg, city) [Default City]:SHINJUKU(ExampleLocality)
Organization Name (eg, company) [Default Company Ltd]:GOOGLE(ExampleOrganization)
Organizational Unit Name (eg, section) []:省略可(ExampleOrganizationalUnit)
Common Name (eg, your name or your server's hostname) []:www.sample.com(サーバー名orドメイン名)
Email Address []:省略可

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:省略可
An optional company name []:省略可
```

CN以外は上で記述した内容と同じ名前に設定する。
ここでのCNはサーバ名やドメインを記述する
 
###2-4-2. 証明書の作成

```vim:
openssl ca -infiles server.csr
```
/CA/newcerts直下にpemファイルで証明書が生成される
生成された証明書ファイルは後にcpでssl.confの中に記述されている場所にコピーする（後述）
 
database error が失敗する場合
index.txtを作成しなおすといけるとのこと
http://www.goofoo.jp/2012/06/2026
 
 
###2-6. firewallの設定
####iptablesの変更

```vim:iptables
vim /etc/sysconfig/iptables
```
80
443

###2-7. mod_sslのインストール

```vim:yum
yum install httpd
yum install mod_ssl
yum install lynx
```

もちろんローカルのディスクからインストールしてもよい

```vim:yum2
mkdir /media/cdrom
mount /dev/sr0 /media/cdrom

yum --disablerepo=\* --enablerepo=c6-media install httpd
yum --disablerepo=\* --enablerepo=c6-media install mod_ssl
yum --disablerepo=\* --enablerepo=c6-media install lynx
```

###2-8. ssl.conf設定

```vim:ssl.conf
vim /etc/httpd/conf.d/ssl.confを確認・編集
```

```vim:ssl.conf
SSLCertificateFile　/etc/pki/tls/certs/localhost.crt 
SSLCertificateKeyFile　/etc/pki/tls/private/localhost.key
```

###2-9. httpdを再起動

###2-10. ホスト側に証明書ファイルを保存
cat cacert.pem | less 等で
-----Bigin certificate-----
-----End certificate-----部分をコピーしてcacert.crt（名前はなんでも可）として保存。インストール

or 

①SCPコマンドでMAC側に渡す
**(注)ホスト側はもちろんだがLinux側にもSCPが必要**

```vim:install_scp
yum install openssh-clients
```
注意：scpではインストールできない。openssh-clientsにすること

②証明書部分をテキストにしてcrtに拡張子に変更する

```console:scp
scp -P 22 root@?.?.?.?:/etc/pki/CA/cacert.pem .
```

###2-11. 保存した証明書ファイルをインストール
* Windows

インストール→証明書ストアの選択→信頼されたルート証明〜

* Mac

保存したcacert.crt（名前は各自つけたもの）をクリック。
キーチェーンに証明書として保存される。
キーチェーンで信頼するに設定を変更する。


###2-12. ホスト側(Mac,Windows側)のhostsファイルの変更

```vim:hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost

192.168.182.55    www.example.com
```

###2-END. https://www.example.com(各自のCN)にアクセスできればOK！