SSL証明書の発行方法・手順まとめ(旧来の手作業で発行)

# SSLの発行について

## まず
・[Aws Certificate Manager](https://aws.amazon.com/jp/certificate-manager/)
など最近は**セキュリティシール自体も自動化！というのが出てきてるので、僕としてはこういうのに乗り換えた方がいい**と思います。

そうすればこんな古き方法を持ち出さなくて良いわけです。

## んで

古き手法に関しては、正直磨くべくもないわけで、とっととマニュアル化して、
・ミスらないように
・脳要らずで黙々と手作業できるように
に集約して、手順化してしまおうということです。

SSLの具体的な設定方法を知らなかった人や、既存サーバ引き継いだりして手作業設置が必要みたいな場合には是非参考にしてもらえればと。

## SSL発行および設置までの主な手順

1. keyファイルを発行
2. csrを発行
3. なんかしらのサービス(VerisignやRapidSSLなど)の管理画面にログイン
4. 証明書を発行
5. 中間証明書も確保
6. それぞれ間違っていないかチェック
7. 本番サーバに設置

こんな感じです。

### 1. keyファイルを発行

ターミナル起動してもいいし、サーバに接続してもいいです。
僕としてはこの手の作業はローカルPCでやるのがいいと思います。

``` sh
openssl genrsa -out www.****.key 2048
# openssl genrsa -out www.favy.co.jp.key 2048
```
こんな感じのコマンドをターミナルから打ちましょう。
opensslが入ってないよ！とか怒られたらbrewなどでインストールしましょう。
CentOSなどで動いているサーバで実施する場合は大体opensslは入ってるはずです。

2048のところは省略したり1024とかにしちゃうとダメです。
セキュリティレベル的に低いから1024ダメ、2048以上だぜ！と怒られます。

```
$ openssl genrsa -out www.****.key 2048
Generating RSA private key, 2048 bit long modulus
.........................+++
.................................+++
e is 65537 (0x10001)
```
こんなログが流れて.keyファイルが出来上がります。
(生成物： www.favy.co.jp.key)

### 2. csrを発行

SSL用のCertificateファイルを発行するためにはcsrというファイルが必要です。

```
openssl req -new -key www.****.key -out www.****.csr
# openssl req -new -key www.favy.co.jp.key -out www.favy.co.jp.csr
```
先程発行したkeyファイルを使ってCSRを作ります。
ぶっちゃけファイル名なので何の名前で出しても良いんですが、わからなくなるので上記テンプレだと思ってコピペでドンでOKです(ドメイン部分だけ変えてね)。

```
$ openssl req -new -key www.****.key -out www.****.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) [AU]:
```

上記コマンドをうつとこんな感じで急に対話形式で何かが始まります。
国名や都市名などを聞かれるの**このSSLを誰名義とするのか**を入れていきます。

聞かれることは、

| 聞かれる質問原文 | 意味 | 具体的な記入例 |
|:-----------|:------------|:------------|
| Country Name (2 letter code) [AU]: | 国名 | JP |
| State or Province Name (full name) [Some-State]: | 都道府県 | Tokyo |
| Locality Name (eg, city) []: | 市区町村 | Shinjuku-ku |
| Organization Name (eg, company) [Internet Widgits Pty Ltd]: | 会社名 | favy, inc. |
| Organizational Unit Name (eg, section) []: | 組織名 | (無記入でもOK) |
| Common Name (e.g. server FQDN or YOUR name) []: | コモンネーム | www.favy.co.jp |
| Email Address []: | メールアドレス | admin@favy.co.jp |
| A challenge password []: | パスワード | (基本かけない。無記入でOK。Enterを押すだけ) |
| An optional company name [] | オプションの会社名 | (無記入でOK。Enterを押すだけ) |

コモンネームというところが非常に重要です。これ間違うと暗号化かからない。

RapidSSLでは「www.favy.co.jp」のようにwwwをつけて申請することで、「www.favy.co.jp」、「favy.co.jp」の2つにSSLを適用できるようになります。

SSLは、基本サブドメインを含んだ1ドメインのみに適用されるものです。
つまり上記の**wwwを含んだ申請だとRapidSSLはお得**って話です。

逆にコモンネームを**ネイキッドドメイン(=favy.co.jpというwwwが無い状態)で、申請するとwww.favy.co.jp では適用されなく**なります。気をつけてください。

※あくまでRapidSSLの話ですんで、他のだと違うかもしれません。
※1シール1ドメインのルール例外として、ワイルドカード用SSLというのがあって、ちょっとお高いですが、*.favy.co.jpで申請することでサブドメインが何であろうと適用できるSSLを発行することもできます。
※メールアドレスは規定ホスト名があって、admin@ administrator@ hostmaster@ webmaster@ postmaster@ などで無いといけませぬ。

```
$ openssl req -new -key www.****.key -out www.****.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) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Shinjuku-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:favy, inc.
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.favy.co.jp
Email Address []:admin@favy.co.jp

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
```
こんな感じのログになるはずです。

catコマンドなどで開けばCSRが見られるかと思います。
(生成物： www.favy.co.jp.csr)

```
$ cat www.favy.co.jp.csr
-----BEGIN CERTIFICATE REQUEST-----
MIICyDCCAbACAQAwgYIxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIEwVUb2t5bzEUMBIG
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
+BOuea/7pRJNO3ad6i/ox8ViuGSs2FMyl7nhpq3AlRJj9MF4WT748Hl3iNYdszsF
t1qjWrqTjmbH+zj3mLd4pFiEIO0ieoJVOROI4BhMQshYGMMEjesV4FhSv7KS5ThN
****************************************************************
****************************************************************
oKo8JAXzvU6TVlWzcl9dP4S1ZDnUe2wlsWliJxovRIn50fujIQaJo7i+KK2TRQxa
****************************************************************
4VzzXZtUuUMXrs5wFvdv2ldmQSDeQGmMKQ/xIfl9WhCsTslRG+xOAAyCNMqstro9
tnWw9KWSC3nwH902zI24udMMnHnnrojJz+yUul5yQdsyCDxl+KS6hfovjnc=
-----END CERTIFICATE REQUEST-----
```
※一部伏せてます

この
-----BEGIN CERTIFICATE REQUEST-----
から全部をコピって、然るべき申請画面にペーストします。
コメントっぽいけど関係なし。-----まで全部必要。考えなく全選択コピーでOKです。

### 3. なんかしらのサービス(VerisignやRapidSSLなど)の管理画面にログイン

各種サービスによって画面や申請手順が違ったりしますが、基本的な情報以外に、
2で作ったCSRが絶対必要なはずです。

ファイル添付の場合もあれば、フォームに直接ペーストするものもあります。
とにかく必要なCSRは作ってあるのでそれを貼り付けましょう。

### 4. 証明書を発行

3で貼り付けたあと注文します。
その際承認要請メールが来ますので疎通確認できているメールアドレスを入れておくこと。

本当に本人？みたいなメールが来ます(いわゆるconfirmaton mail)。
承認URLや承認ボタンを押しましょう。

そうすると管理画面やメールなどで「Certificate File」を取得することができます。

```
-----BEGIN CERTIFICATE-----
MIIErjCCA5agAwIBAgIDAzVOMA0GCSqGSIb3DQEBCwUAMEcxCzAJBgNVBAYTAlVT
****************************************************************
****************************************************************
****************************************************************
bS9yZXNvdXJjZXMvY3BzIChjKTE1MS8wLQYDVQQLEyZEb21haW4gQ29udHJvbCBW
YWxpZGF0ZWQgLSBSYXBpZFNTTChSKTEYMBYGA1UEAxMPd3d3LnNha2Vsb2cuY29t
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ayTospPJi9YDc5y0JXt
****************************************************************
****************************************************************
****************************************************************
****************************************************************
8VAlkH2FuOiRH2eszVx2zVLQFmTX1K6nf1yV3jKHXKhC4GFRllUMvzm+ZwbZhnin
7wIDAQABo4IBVDCCAVAwHwYDVR0jBBgwFoAUw5zz/NNGCDS7zkZ/oHxb8+IIy1kw
VwYIKwYBBQUHAQEESzBJMB8GCCsGAQUFBzABhhNodHRwOi8vZ3Yuc3ltY2QuY29t
****************************************************************
Af8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMCcGA1UdEQQg
****************************************************************
HIYaaHR0cDovL2d2LnN5bWNiLmNvbS9ndi5jcmwwDAYDVR0TAQH/BAIwADBBBgNV
HSAEOjA4MDYGBmeBDAECATAsMCoGCCsGAQUFBwIBFh5odHRwczovL3d3dy5yYXBp
ZHNzbC5jb20vbGVnYWwwDQYJKoZIhvcNAQELBQADggEBACd1lEMesqp8Psdx+0IY
AoT5RXilBFZUAp1da2Hs0Os5vV4PPmM/hlPs1JBHMabIo4irG7HrMY4Kfd0y38nZ
vLQ1IVY+hVypPKExVyGimH6E214d9xAqOXn+N0s+/+xpOQRJaHmtFQdiD9I1g5/v
YC9ptZbcn0VqQQSQz/FgkExdd4e1hDHFNtQG9OfH69wsyUDPfiEJm/0DhceOleZv
mSYaFAKEPkryVdCiAEq1w0PD2wqppP9/rJNzSynom7G0nY41mkuUjcgb+rI/Z7/g
WSsOmL/vfjwiSbTY5EBNn2QeCoMhk7Td3pkHUk7VuH4UU7fqZTc+uDiDtmH6R5pZ
cHw=
-----END CERTIFICATE-----
```
こんな感じのファイルです。すごくCSRと似てます。
このファイルですが「 www.favy.co.jp.crt 」という名前で保存しましょう。
(生成物： www.favy.co.jp.crt)

### 5. 中間証明書も確保

3にある管理画面などに中間証明書というのがあります。
ハッシュアルゴリズム: Signature Algorithm: sha256WithRSAEncryption
こんなルールで発行されてるはず。

```
-----BEGIN CERTIFICATE-----
MIIEJTCCAw2gAwIBAgIDAjp3MA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT
****************************************************************
****************************************************************
****************************************************************
U0hBMjU2IENBIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCv
VJvZWF0eLFbG1eh/9H0WA//Qi1rkjqfdVC7UBMBdmJyNkA+8EGVf2prWRHzAn7Xp
****************************************************************
1p1kD8mD5xvEcKyU58Okaiy9uJ5p2L4KjxZjWmhxgHsw3hUEv8zTvz5IBVV6s9cQ
DAP8m/0Ip4yM26eO8R5j3LMBL3+vV8M8SKeDaCGnL+enP/C1DPz1hNFTvA5yT2AM
****************************************************************
****************************************************************
****************************************************************
VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwNQYDVR0fBC4wLDAqoCig
JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMC4GCCsGAQUF
BwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDovL2cuc3ltY2QuY29tMEwGA1UdIARF
****************************************************************
****************************************************************
rC+TeLfqrlRARy1+eI1Q9vhmrNZPc9ZE768LzFvB9E+aj0l+YK/CJ8cW8fuTgZCp
fO9vfm5FlBaEvexJ8cQO9K8EWYOHDyw7l8NaEpt7BDV7o5UzCHuTcSJCs6nZb0+B
****************************************************************
****************************************************************
ZI3NjGFVkP46yl0lD/gdo0p0Vk8aVUBwdSWmMy66S6VdU5oNMOGNX2Esr8zvsJmh
gP8L8mJMcCaY
-----END CERTIFICATE-----
```
これもそっくりです。しかもCertificateファイルとコメント部分まで一緒という意地悪さ。
このファイルですが「 www.favy.co.jp.ca.crt 」という名前で保存しましょう。
(生成物： www.favy.co.jp.ca.crt)

### 6. それぞれ間違っていないかチェック

この段階で4ファイルあるはずです。

* www.favy.co.jp.key
* www.favy.co.jp.csr
* www.favy.co.jp.crt
* www.favy.co.jp.ca.crt

全て必要なファイルですんで、ちゃんと4つあるか確認してください。

そして、以下のコマンドでチェックしましょう

```
openssl rsa -in www.favy.co.jp.key -modulus -noout | openssl md5
```
```
openssl req -in www.favy.co.jp.csr -modulus -noout | openssl md5
```
```
openssl x509 -in www.favy.co.jp.crt -modulus -noout | openssl md5
```
この3つをそれぞれ打ってください。
それぞれMD5の文字列が返ってきます。全て同じ文字列であることを確認してください。

```
$ openssl rsa -in www.favy.co.jp.key -modulus -noout | openssl md5
fecb818dbdf6dcdf193e55025bb65522
$ openssl req -in www.favy.co.jp.csr -modulus -noout | openssl md5
fecb818dbdf6dcdf193e55025bb65522
$ openssl x509 -in www.favy.co.jp.crt -modulus -noout | openssl md5
fecb818dbdf6dcdf193e55025bb65522
```
みたいな感じでどれを打っても同じ文字列がバックしてくれればOKです。
ちょっとでも違ったら何か間違ってます。**作り直しましょう**。
(多分間違ったkeyでCSR作っちゃってたり、申請したCSRに対したcertificateじゃないものになってます)

### 7. 本番サーバに設置

sshなどでログインします(あーやりたくねー)。
そのあとvhosts.confやhttpd.confにかかれている、

```
SSLCertificateFile /etc/httpd/conf/ssl/www.domain.jp.crt
SSLCertificateChainFile /etc/httpd/conf/ssl/www.domain.jp.ca.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl/www.domain.jp.key
```
のような設定箇所を確認してファイルを置き換えます(vimで上書きしてもいいしscpなどでぶっこんでもいいですね)。

置き換える時ですが、既存のフォルダ(ここでいう/etc/httpd/conf/ssl/)をcpコマンドなどで_bkとか付けてバックアップしときましょう。危ないので。

各ファイルを設置したらapacheをrestartです。
コピペミスやファイル設置ミスがあったらウェブサーバが止まりますんで、apacheのconfigtestを打って問題無さそう確認しておくと良いです。

```
$ service httpd configtest
Syntax OK
$ service httpd restart
```

以上です。