CentOS6などで俺俺CAとSHA2証明書を作るときのメモ


参考 - Redhatのガイド：https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Virtualization/3.3/html/Developer_Guide/appe-Certificates.html

ここよりも参考になりそうなQiitaの記事がありました： http://qiita.com/mako10z/items/ef15372d4cf4621a674e

## Motivation

普通はオフィシャルな文書を見ればいいのだけど、RHEL6互換のOSでは署名のアルゴリズムがSHA1がデフォルトとして/etc/pki/tls/openssl.cnfに記載されているため、明示的に指定する必要があるので、備忘としてメモ。

CentOS7へ移行してもいいのかもしれませんが、まだ試していません。

## CAから作り直すケース

自己署名タイプのサーバー証明書のケースについては、
http://vogel.at.webry.info/201411/article_9.html
が参考になりましたが、ここではCAの証明書作成からやってみました。

### CAの作成

/etc/pki/tls/openssl.cnf のdafault_mdの指定がCentOS6まではsha1なので、
-sha256のオプションを明示します。

```{sh}
# cd /etc/pki/CA/certs
# openssl req -new -x509 -keyout ca.key -out ca.crt -days 3650 -sha256
Generating a 2048 bit RSA private key
..............+++
....................................................................................................................................................+++
writing new private key to 'ca.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) [XX]:JP
State or Province Name (full name) []:TOKYO
Locality Name (eg, city) [Default City]:CHIYODA-KU
Organization Name (eg, company) [Default Company Ltd]:My company
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:CA of mine
Email Address []:
```

### 秘密鍵の作成

httpdを自動起動させるために暗号化を無効にしています。bashの脆弱性などでこれを抜かれていると、商用サーバーでは本当にまずいので、セキュリティパッチは無精せずに当てましょう（汗

```{sh}
# cd /etc/pki/tls/private
# openssl genrsa -out site.key  2048
Generating RSA private key, 2048 bit long modulus
............+++
..........+++
e is 65537 (0x10001)
```


### CSRの作成

```
# cd /etc/pki/tls/certs
# openssl req -new -sha256 -key /etc/pki/tls/private/site.key -out oreore.csr
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) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:CHIYODA-KU
Organization Name (eg, company) [Default Company Ltd]:MyCOMPANY
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:www.ore.jp
Email Address []:

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

### CAで署名して証明書のできあがり

初めて作る場合は、これらのファイルが初期化されていないこともある。
ファイルがすでにあるならいじらない。

```
# touch /etc/pki/CA/index.txt
# echo '1000' > /etc/pki/CA/serial
```
証明書作成は以下で実施

ここでも、/etc/pki/tls/openssl.cnf のdafault_mdの指定がCentOS6まではsha1なので、
-md sha256のオプションを明示します。

```
# cd /etc/pki/tls/certs
# openssl ca -md sha256 -cert /etc/pki/CA/certs/ca.crt -keyfile /etc/pki/CA/certs/ca.key -out oreore.crt -infiles oreore.csr
```

シリアルとかが変化していることも確認

```
# cat /etc/pki/CA/serial
1001
# cat /etc/pki/CA/index.txt
V	151130205343Z		1000	unknown	/C=JP/ST=Tokyo/O=OreOre/CN=oreore.jp
```

### Apache httpdに組み込む

#### ssl.conf修正

以下の項目を更新します。

+ SSLCertificateFile: 作成した証明書
+ SSLCertificateKeyFile: 作成した秘密鍵

#### typoなどないか事前にチェック

Virtualhostの指定や設定ファイルの記述エラーが無いかなどが確認できます。

```
# /usr/sbin/httpd -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server oreore.jp (/etc/httpd/conf.d/vhost.conf:14)

*:443                  is a NameVirtualHost
         default server oreore.jp (/etc/httpd/conf.d/ssl.conf:76)
         port 443 namevhost oreore.jp (/etc/httpd/conf.d/ssl.conf:76)
Syntax OK
```
#### サーバ再起動してログを確認

RHEL互換OSだと次のようにします。

```
# /sbin/service httpd restart
```

### ブラウザでチェック

俺俺なのでエラーは出るのですが、証明書の署名アルゴリズムは確認できるかと思います。

以下追記

# せっかくCA立てたんだから、仲間内では共有してブラウザのエラーを止めたい

そうすれば、警告を無視する、というbad habitを駆逐できます。
その場合はQiita上の次の記事が参考になるかと思います。
<a href="http://qiita.com/mako10z/items/ef15372d4cf4621a674e">独自SSLサーバ認証局(CA)作成とサーバ証明書発行</a>の「ブラウザにCA証明書を組み込む 」の節です。

## Mac OSXでの認証局証明書のインポート

.derファイルをダブルクリックすれば、あとはよしなに。

## Windows7での認証局証明書のインポート

どうも、.derファイルを直接開いて登録しても、格納先を自動で指定するとブラウザで認識してくれないような感じでしたので、ブラウザ毎の対応となるようです（あやふや）

### Firefox 33

1. .derの拡張子のファイルをダウンロードしておきます
1. 「オプション」＞「詳細」で表示される画面の「証明書」のタブを選択し
1. 「証明書を表示」のボタンをクリック
2. 「認証局証明書」のタブを選択した状態で「インポート」をクリック
3.  先ほどダウンロードしておいた.derファイルを開きます。


### Chrome 39

Windows7のChromeは、そもそも .crtの拡張子のファイルを認識するようです。
そこで以下の手順となります。

1. .crtの形式のファイルをダウンロード
2. Chromeの「設定」メニューを表示し、下端までスクロールしたところにある「詳細設定を表示」のリンクをクリック
3. 「HTTPS/SSL」[証明書の管理] というボタンが表示されるので、クリック
4. 証明書のインポートのダイアログが表示されるので、 「信頼されたルート証明機関」のタブを選択した状態で「インポート」のボタンをクリック
5. 証明書のインポートウィザードが起動される
6. ファイルを選択できるようになるので、 そこで、先ほどダウンロードした ca.crtのファイルを開く
7. 「証明書をすべて次のストアに配置する」を選択して、証明書ストアが[信頼されたルート証明機関]であることを確認して、次へすすみ、インポートします。