webサーバーへSSL証明書の設置方法

最近のSSL証明書は用途種類があるものの、無料で発行してくれたりとかあるのですが、やり方をすぐに忘れるのではっておきます。

SSL証明書の発行手順

webサーバーでの作業

標準的な作業は以下のとおりです

  1. 秘密鍵の作成
    • 外部に公開指定はいけない鍵
  2. CSR(Certificate Signing Request) 生成
    • 証明書署名要求で認証局へ証明書の署名要求するためののも、秘密鍵を利用して出力する
  3. CSRを認証局へ送信して、サーバー証明書を取得
    • CRT(Certificate)を取得する、クライアントへ提示する証明書

秘密鍵の作成

TLS・SSLの仕組みは 公開鍵基盤 という仕組みを利用しているので、暗号化通信を始めるに当たって、秘密鍵とSSL証明書を作成する必要があります。 そして秘密鍵は外部に漏らすことないよう管理されます。

秘密鍵の生成には、 openssl コマンドを利用します、秘密鍵についても安全のために、共通鍵暗号アルゴリズムによって暗号化します。

# openssl genrsa -aes256 2048 > key_pri.pem
Generating RSA private key, 2048 bit long modulus
............+++
.+++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:

パスワード入力後、PEM形式のファイルで、秘密鍵のファイル key_pri.pem が作成されます。

  • パスワード付き秘密鍵を確認する方法
# openssl rsa -text < key_pri.pem
Enter pass phrase:
Private-Key: (2048 bit)
RSA Private-Key: (2048 bit, 2 primes)
modulus:
    00:c9:90:76:e3:f8:e4:ff:4a:10:95:c7:9f:e2:08:
    8a:2f:94:e5:6c:0c:64:be:28:4b:18:b4:64:ab:61:
・・・つづく..

作成時に入力したパスワードで確認することが可能です。

秘密鍵からパスフレーズを除去する方法

秘密鍵にパスワードを設定したままだと、webサーバーの再起動の途中でパスワード入力を求められるので、そうならないようにパスワードを外します。

# openssl rsa -in key_pri.pem -out nokey_pri.pem
Enter pass phrase for key_pri.pem:
writing RSA key

ここで入力するパスワードは秘密鍵の生成で入力したものを利用します、PEM形式の nokey_pri.pem ファイルが作成されます。

CSRを作成

認証局に提出するためのCSRを作成します、作成には秘密鍵を利用して生成します、ドメインや所在情報等は本物の証明書の 場合は、しっかりしたものを入力してください、開発などで利用する場合は以下のように適当でもかまいません。

# openssl req -new -key nokey_pri.pem -out server.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) []:Shizuoka
Locality Name (eg, city) [Default City]:Mishima
Organization Name (eg, company) [Default Company Ltd]:Comp Ltd
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:blog.exam-houbou.com
Email Address []:examuser@exam-houbou.com

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

完了するとCSRが server.csr として出力されます、通常は個のファイルを認証局へ送信することによって、SSL証明書が認証局から発行されます。

開発環境でSSL証明書を発行したい場合

開発などのでSSLを利用したい場合は、発行したCSRから自前でSSL証明書を発行します。

# openssl x509 -in server.csr -days 365000 -req -signkey nokey_pri.pem > server.crt
Signature ok
subject=C = JP, ST = Shizuoka, L = Mishima, O = Comp Ltd, CN = blog.exam-houbou.com, emailAddress = examuser@exam-houbou.com
Getting Private key

server.crt がSSL証明書となります、もちろん認証局で署名された証明書ではないので、ブラウザで最初にアクセスした場合、以下の警告画面が出力されます。

開発ようなので、ブラウザに読み込ませます。

アドレスバーの鍵マークは 安全ではない接続 として閲覧できるようになります。

普通にブラウジングしていて、このようなサイトを訪問した場合は、アクセスしないようにしてください、暗号化通信が担保されません。

最終的に作成されるファイルは4つです。

-rw-r--r-- 1 root root 1766 11月 22 04:32 key_pri.pem
-rw------- 1 root root 1675 11月 22 04:38 nokey_pri.pem
-rw-r--r-- 1 root root 1326 11月 22 04:49 server.crt
-rw-r--r-- 1 root root 1058 11月 22 04:41 server.csr

webサーバーへの設置

作成した各種ファイルのうち、サーバーへ秘密鍵と証明書を設定します。

nginxの場合

...
server {
    listen 192.168.253.205:443 ssl;
    server_name blog.exam-houbou.com;

    ssl_ciphers 'HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA';
    ssl_certificate  ssl/server.crt;
    ssl_certificate_key ssl/nokey_pri.pem;
...
...
}

serverセクションで、TLS・SSL通信のための443ポートでLISTENするよう設定し

  • ssl_certificateへ証明書を指定
    • server.crt;
  • ssl_certificate_keyへ秘密鍵を指定
    • nokey_pri.pem

を設定することでTLS・SSL通信が可能になります。

apacheの場合

やったことはあるのですが、忘れたので、すいません。

Let’s Encryptの場合

Let’s Encryptを利用するとコマンド一つで、証明書の取得まですべて行えます、nginx用のcertbotパッケージを利用します。

CentOS8の場合(CentOS7でも同じようなものです)

# yum install certbot python3-certbot-nginx

証明書を発行する場合、certbotコマンドで発行します

# certbot certonly --standalone -d blog.exam-houbou.com -m examuser@sxam-houbou.com

成功すると、 /etc/letsencrypt/live/[SSL証明書取得ドメイン]/ ディレクトリへファイルが作成されます。

# ls -l /etc/letsencrypt/live/[SSL証明書取得ドメイン]/
lrwxrwxrwx. 1 root root  38 10月  7 07:11 cert.pem -> ../../archive/[SSL証明書取得ドメイン]/cert1.pem
lrwxrwxrwx. 1 root root  39 10月  7 07:11 chain.pem -> ../../archive/[SSL証明書取得ドメイン]/chain1.pem
lrwxrwxrwx. 1 root root  43 10月  7 07:11 fullchain.pem -> ../../archive/[SSL証明書取得ドメイン]/fullchain1.pem
lrwxrwxrwx. 1 root root  41 10月  7 07:11 privkey.pem -> ../../archive/[SSL証明書取得ドメイン]/privkey1.pem

保存されたファイルの、以下のファイルをnginxの設定ファイルで指定します。

...
    ssl_certificate        /etc/letsencrypt/live/[SSL証明書取得ドメイン]/fullchain.pem;
    ssl_certificate_key    /etc/letsencrypt/live/[SSL証明書取得ドメイン]/privkey.pem;
...

Let’s Encryptのコマンド実行時に、ドメインの存在確認のため、SSL取得ドメインに対するアクセスが80番ポートで発生しますのでアクセスできるように適切な設定を行ってください、DNSへの設定も必要です。

証明書の更新作業を定期的に行うため、cronなどで定期的にチェックするようにします。

# certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/domain1.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/domain2.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/domain1/fullchain.pem expires on 2021-01-01 (skipped)
  /etc/letsencrypt/live/domain2/fullchain.pem expires on 2021-01-04 (skipped)
No renewals were attempted.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

certbot renew コマンドですべての証明書が必要であれば、更新されます、不要なら (skipped) されます。

証明書エンコード方式

3文字の専門用語がですぎて頭が痛くなるので以下メモです

  • DER(Distinguished Encoding Rules)
    • ANS.1で規定されるバイナリ形式のファイル
  • PEM(Privacy Enhanced Mail )
    • DERをテキストのBase64形式に変換したもの

Posted on 2020-11-22 10:49:21

はじめまして

お茶の国静岡で、焼酎のお茶割なんか罰当たりで飲んだことはありません、常に一番搾りを嗜む静岡極東のBBQerです、最近まわりのエンジニアの方々がお料理を上手にやっている姿を恨めしそうに横目に見ながら、軟骨ピリ辛チクワを食べています、みなさんよろしく。

Posted

Amazon

tags