【AWS】【RedHat8】Apache で「自己署名証明書(オレオレ証明書)」を作成して HTTPS でアクセスできるように構築する手順

今回は「RedHat8」「自己証明書(オレオレ証明書)」を作成し、HTTPS アクセスできるように Web サーバー(Apache)を構築する手順を解説します。

※自己署名証明書(オレオレ証明書)とは、ベリサインやセコムなどのパブリック認証局(CA)が発行した証明書ではなく、自分で発行した証明書のことを言います。

今回は新しく「RedHat8」を利用して構築します。

 

 

【Linux】【CentOS6】Apache で「自己証明書(オレオレ証明書)」を作成して HTTPS でアクセスできるようにする手順

 

 

 

 

 

目次

今回やりたいこと

今回は以下の環境を構築して実際に TLS 1.2 で暗号化されて通信されているか検証します。

 

【Linux】【CentOS6】Apache で<span style=

 

 

 

 

HTTPS サーバー構築の環境&設計

最初に設計をします。

バージョンは RedHat 8 の最新版(8.0)とします。

 

■ディストリビューション

[root@ip-172-31-32-20 ~]# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.0 (Ootpa)
[root@ip-172-31-32-20 ~]#

 

 

■カーネルバージョン

[root@ip-172-31-32-20 ~]# uname -a
Linux ip-172-31-32-20.ap-northeast-1.compute.internal 4.18.0-80.11.2.el8_0.x86_64 #1 SMP Sun Sep 15 11:24:21 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@ip-172-31-32-20 ~]#

 

 

■httpd(Apache)バージョン

[root@RedHat8SV ~]# httpd -version
Server version: Apache/2.4.37 (Red Hat Enterprise Linux)
Server built: Aug 29 2019 15:17:13
[root@RedHat8SV ~]#

 

 

 

 

 

selinux の設定

この selinux の作業は必須でもなく、selinux を「disabled」にしなければ動かないわけではないので任意になります。

selinux はデフォルトで「enforcing」の設定なので変更しなければ有効になっています。

今回は作業時に邪魔にならないように、「disable」にしておきます。

 

■selinux の設定

[root@RedHat8SV conf.d]# vi /etc/selinux/config ← config ファイルを開いて編集します。

 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
#SELINUX=enforcing ← デフォルトの設定をコメントアウトします。
SELINUX=disable ← SELINUX=disable の設定を追加します。
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

 

 

設定を反映させるために再起動します。

[root@RedHat8SV .ssh]# reboot

 

 

 

 

HTTPS 化にするために導入するパッケージ一覧

Web サーバーを構築して https 通信をするために以下のパッケージを導入します。

※すでに導入している場合はアップデートをして最新の状態にします。(古い状態のままだと脆弱性が出る可能性があります)

 

httpd(Apache)のインストール

yum コマンドで httpd をインストールします。

[root@RedHat8SV ~]# yum install httpd

 

 

httpd のバージョン確認とアップデート

現環境のチェックからします。

httpd のバージョンをチェックします。

[root@RedHat8SV ~]# rpm -qa | grep httpd
httpd-filesystem-2.4.37-12.module+el8.0.0+4096+eb40e6da.noarch
httpd-tools-2.4.37-12.module+el8.0.0+4096+eb40e6da.x86_64
redhat-logos-httpd-80.7-1.el8.noarch
httpd-2.4.37-12.module+el8.0.0+4096+eb40e6da.x86_64 ← Apache 2.4.37-12 です。
[root@RedHat8SV ~]#

 

 

パッケージをアップデートできるか確認します。

[root@RedHat8SV ~]# yum update httpd 
メタデータの期限切れの最終確認: 0:23:09 時間前の 2019年11月02日 13時03分27秒 に実施しました。 
依存関係が解決しました。 
行うべきことはありません。 
完了しました! 
[root@RedHat8SV ~]#

 

 

 

 

 

mod_ssl のインストールとバージョン確認

mod_ssl のインストール確認と、インストールされていたらバージョンアップ確認をします。

「mod_ssl」「OpenSSL」を利用することで「Apache」「SSL 機能」が追加されます。

 

mod_ssl がインストールされているか確認します。

[root@RedHat8SV ~]# rpm -qa | grep mod_ssl
[root@RedHat8SV ~]#   ← 何も表示されないので mod_ssl はインストールされていません。

 

 

mod_ssl をインストールします。

[root@RedHat8SV ~]# yum install mod_ssl  ← mod_ssl をインストールします。

 

 

バージョンを確認します。

[root@RedHat8SV ~]# rpm -qa | grep mod_ssl
mod_ssl-2.4.37-12.module+el8.0.0+4096+eb40e6da.x86_64
[root@RedHat8SV ~]#

 

 

 

mod_ssl とは一体何か?

簡潔にまとめると

です。

 

■デフォルト

デフォルトでは以下のように「SSLv3」以下が無効になっています。

[root@RedHat8SV ~]# cat /etc/httpd/conf.d/ssl.conf

 

~ 省略 ~

 

#   List the protocol versions which clients are allowed to connect with. 
#   The OpenSSL system profile is used by default.  See 
#   update-crypto-policies(8) for more details. 
#SSLProtocol all -SSLv3 
#SSLProxyProtocol all -SSLv3

 

~ 省略 ~

 

参考

https://httpd.apache.org/docs/2.4/mod/mod_ssl.html

 

 

 

OpenSSLのバージョンとアップデート確認

今回は「自己証明書(オレオレ証明書)」を作成するため、OpenSSL も利用するので OpenSSL のバージョンとアップデート確認をします。

OpenSSL のバージョンを確認します。

 

■OpenSSL のバージョン確認

[root@RedHat8SV ~]# rpm -qa | grep openssl ← すでにインストールされているか確認します。
openssl-pkcs11-0.4.8-2.el8.x86_64
openssl-1.1.1-8.el8.x86_64  
apr-util-openssl-1.6.1-6.el8.x86_64
openssl-libs-1.1.1-8.el8.x86_64
[root@RedHat8SV ~]#

 

 

 

■OpenSSL のバージョン確認

[root@RedHat8SV ~]# openssl version
OpenSSL 1.1.1 FIPS 11 Sep 2018
[root@RedHat8SV ~]#

 

 

OpenSSL がアップデート可能か確認します。

[root@RedHat8SV ~]# yum update openssl

 

 

なぜ rpm コマンドの OpenSSL のバージョンと openssl コマンドのバージョンが異なるのか?

以下のように rpm コマンドでの確認と openssl コマンドでのバージョンが異なります。

 

 

 

■OpenSSL のバージョン確認

[root@RedHat8SV ~]# rpm -qa | grep openssl ← すでにインストールされているか確認します。
openssl-pkcs11-0.4.8-2.el8.x86_64
openssl-1.1.1-8.el8.x86_64  
apr-util-openssl-1.6.1-6.el8.x86_64
openssl-libs-1.1.1-8.el8.x86_64
[root@RedHat8SV ~]#

 

 

■OpenSSL のバージョン確認

[root@RedHat8SV ~]# yum info openssl 
メタデータの期限切れの最終確認: 0:18:38 時間前の 2019年11月10日 13時04分01秒 に実施しました。 
インストール済みパッケージ 
名前         : openssl 
エポック     : 1 
バージョン   : 1.1.1 
リリース     : 8.el8 
アーキテクチ : x86_64 
サイズ       : 1.1 M 
ソース       : openssl-1.1.1-8.el8.src.rpm 
Repo         : @System 
repo から    : anaconda 
概要         : Utilities from the general purpose cryptography library with TLS implementation 
URL          : http://www.openssl.org/ 
ライセンス   : OpenSSL 
説明         : The OpenSSL toolkit provides support for secure communications between 
             : machines. OpenSSL includes a certificate management tool and shared 
             : libraries which provide various cryptographic algorithms and 
             : protocols. 
 
利用可能なパッケージ 
名前         : openssl 
エポック     : 1 
バージョン   : 1.1.1c 
リリース     : 2.el8 
アーキテクチ : x86_64 
サイズ       : 686 k 
ソース       : openssl-1.1.1c-2.el8.src.rpm 
Repo         : rhel-8-baseos-rhui-rpms 
概要         : Utilities from the general purpose cryptography library with TLS implementation 
URL          : http://www.openssl.org/ 
ライセンス   : OpenSSL 
説明         : The OpenSSL toolkit provides support for secure communications between 
             : machines. OpenSSL includes a certificate management tool and shared 
             : libraries which provide various cryptographic algorithms and 
             : protocols. 
 
[root@RedHat8SV ~]#

 

 

■OpenSSL のバージョン確認

[root@RedHat8SV ~]# openssl version
OpenSSL 1.1.1 FIPS 11 Sep 2018
[root@RedHat8SV ~]#

 

 

理由は、rpm コマンドや yum コマンドが返すパッケージのバージョンは、ソフトウェアが返す(openssl コマンドが返す)バージョンと同じとは限らないからです。

また、FIPS の数字はバージョンとは関係ありません。

つまり、「openssl コマンドは FIPS のセキュリティ要件を満たして認証を受けた」ということを表わしています。

 

 

■openssl コマンドのバグ修正や変更点を確認する

[root@RedHat8SV ~]# rpm -q -changelog openssl 
* 金 12月 14 2018 Toma? Mraz <tmraz@redhat.com> 1.1.1-8 
- make openssl ts default to using SHA256 digest 
 
* 水 11月 14 2018 Toma? Mraz <tmraz@redhat.com> 1.1.1-7 
- use /dev/urandom for seeding the RNG in FIPS POST 
 
* 月 10月 15 2018 Toma? Mraz <tmraz@redhat.com> 1.1.1-6 
- make SECLEVEL=3 work 
 
* 火 10月 09 2018 Toma? Mraz <tmraz@redhat.com> 1.1.1-5 
- fix defects found in Coverity scan 
 
* 月 10月 01 2018 Toma? Mraz <tmraz@redhat.com> 1.1.1-4 
- drop SSLv3 support 
 
* 火  9月 25 2018 Toma? Mraz <tmraz@redhat.com> 1.1.1-3 
- drop the TLS-1.3 version revert 
 
* 月  9月 17 2018 Toma? Mraz <tmraz@redhat.com> 1.1.1-2 
- disable RC4-MD5 ciphersuites completely 
 
* 金  9月 14 2018 Toma? Mraz <tmraz@redhat.com> 1.1.1-1 
- update to the final 1.1.1 version 
- for consistent support of security policies we build 
  RC4 support in TLS (not default) and allow SHA1 in SECLEVEL 2 
- use only /dev/urandom if getrandom() is not available 
- disable SM4

 

 

 

 

 

OpenSSLで何ができるのか?

ここで「OpenSSL」ついて解説します。

「OpenSSL」はフリーの暗号化モジュールです。

SSL/TLS での通信の暗号化を実装します。

※"実装する"とは SSL/TLS などの規格(概念)を実現化することを言います。この場合は SLL/TLS の規格を OpenSSL で実装することによりSSL での通信暗号化が実現します。

 

 

今回 OpenSSL を利用してプロトコル「TSL 1.2」での暗号化通信を検証しようとしていますが、プロトコル「TSL 1.2」と言っても1種類のアルゴリズムだけで実現しているわけではありません。

「コンピュータA」から「コンピュータB」「データ」を送信するために、暗号化通信を達成するための多数のアルゴリズムが混在しています。

例えば現在 RedHat 8 にインストールされている OpenSSL 1.1.1 で利用できる多数のアルゴリズムの組み合わせを確認するとこんな感じになっています。

[root@RedHat8SV ~]# openssl ciphers -v 
TLS_AES_256_GCM_SHA384  TLSv1.3 Kx=any      Au=any  Enc=AESGCM(256) Mac=AEAD 
TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any      Au=any  Enc=CHACHA20/POLY1305(256) Mac=AEAD 
TLS_AES_128_GCM_SHA256  TLSv1.3 Kx=any      Au=any  Enc=AESGCM(128) Mac=AEAD 
TLS_AES_128_CCM_SHA256  TLSv1.3 Kx=any      Au=any  Enc=AESCCM(128) Mac=AEAD 
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD 
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD 
ECDHE-ECDSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=CHACHA20/POLY1305(256) Mac=AEAD 
ECDHE-RSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH     Au=RSA  Enc=CHACHA20/POLY1305(256) Mac=AEAD 
ECDHE-ECDSA-AES256-CCM  TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESCCM(256) Mac=AEAD 
ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128) Mac=AEAD 
ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD 
ECDHE-ECDSA-AES128-CCM  TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESCCM(128) Mac=AEAD 
ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA256 
ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA256 
ECDHE-ECDSA-AES256-SHA  TLSv1 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA1 
ECDHE-RSA-AES256-SHA    TLSv1 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA1 
ECDHE-ECDSA-AES128-SHA  TLSv1 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA1 
ECDHE-RSA-AES128-SHA    TLSv1 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA1 
AES256-GCM-SHA384       TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(256) Mac=AEAD 
AES256-CCM              TLSv1.2 Kx=RSA      Au=RSA  Enc=AESCCM(256) Mac=AEAD 
AES128-GCM-SHA256       TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(128) Mac=AEAD 
AES128-CCM              TLSv1.2 Kx=RSA      Au=RSA  Enc=AESCCM(128) Mac=AEAD 
AES256-SHA256           TLSv1.2 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA256 
AES128-SHA256           TLSv1.2 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA256 
AES256-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA1 
AES128-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA1 
DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(256) Mac=AEAD 
DHE-RSA-CHACHA20-POLY1305 TLSv1.2 Kx=DH       Au=RSA  Enc=CHACHA20/POLY1305(256) Mac=AEAD 
DHE-RSA-AES256-CCM      TLSv1.2 Kx=DH       Au=RSA  Enc=AESCCM(256) Mac=AEAD 
DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(128) Mac=AEAD 
DHE-RSA-AES128-CCM      TLSv1.2 Kx=DH       Au=RSA  Enc=AESCCM(128) Mac=AEAD 
DHE-RSA-AES256-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA256 
DHE-RSA-AES128-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA256 
DHE-RSA-AES256-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA1 
DHE-RSA-AES128-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA1 
PSK-AES256-GCM-SHA384   TLSv1.2 Kx=PSK      Au=PSK  Enc=AESGCM(256) Mac=AEAD 
PSK-CHACHA20-POLY1305   TLSv1.2 Kx=PSK      Au=PSK  Enc=CHACHA20/POLY1305(256) Mac=AEAD 
PSK-AES256-CCM          TLSv1.2 Kx=PSK      Au=PSK  Enc=AESCCM(256) Mac=AEAD 
PSK-AES128-GCM-SHA256   TLSv1.2 Kx=PSK      Au=PSK  Enc=AESGCM(128) Mac=AEAD 
PSK-AES128-CCM          TLSv1.2 Kx=PSK      Au=PSK  Enc=AESCCM(128) Mac=AEAD 
PSK-AES256-CBC-SHA      SSLv3 Kx=PSK      Au=PSK  Enc=AES(256)  Mac=SHA1 
PSK-AES128-CBC-SHA256   TLSv1 Kx=PSK      Au=PSK  Enc=AES(128)  Mac=SHA256 
PSK-AES128-CBC-SHA      SSLv3 Kx=PSK      Au=PSK  Enc=AES(128)  Mac=SHA1 
DHE-PSK-AES256-GCM-SHA384 TLSv1.2 Kx=DHEPSK   Au=PSK  Enc=AESGCM(256) Mac=AEAD 
DHE-PSK-CHACHA20-POLY1305 TLSv1.2 Kx=DHEPSK   Au=PSK  Enc=CHACHA20/POLY1305(256) Mac=AEAD 
DHE-PSK-AES256-CCM      TLSv1.2 Kx=DHEPSK   Au=PSK  Enc=AESCCM(256) Mac=AEAD 
DHE-PSK-AES128-GCM-SHA256 TLSv1.2 Kx=DHEPSK   Au=PSK  Enc=AESGCM(128) Mac=AEAD 
DHE-PSK-AES128-CCM      TLSv1.2 Kx=DHEPSK   Au=PSK  Enc=AESCCM(128) Mac=AEAD 
DHE-PSK-AES256-CBC-SHA  SSLv3 Kx=DHEPSK   Au=PSK  Enc=AES(256)  Mac=SHA1 
DHE-PSK-AES128-CBC-SHA256 TLSv1 Kx=DHEPSK   Au=PSK  Enc=AES(128)  Mac=SHA256 
DHE-PSK-AES128-CBC-SHA  SSLv3 Kx=DHEPSK   Au=PSK  Enc=AES(128)  Mac=SHA1 
ECDHE-PSK-CHACHA20-POLY1305 TLSv1.2 Kx=ECDHEPSK Au=PSK  Enc=CHACHA20/POLY1305(256) Mac=AEAD 
ECDHE-PSK-AES256-CBC-SHA TLSv1 Kx=ECDHEPSK Au=PSK  Enc=AES(256)  Mac=SHA1 
ECDHE-PSK-AES128-CBC-SHA256 TLSv1 Kx=ECDHEPSK Au=PSK  Enc=AES(128)  Mac=SHA256 
ECDHE-PSK-AES128-CBC-SHA TLSv1 Kx=ECDHEPSK Au=PSK  Enc=AES(128)  Mac=SHA1 
[root@RedHat8SV ~]#

 

数多くの組み合わせですが、実際に利用するのは(利用できるのは)標準的なごく一部のみですのですべてを覚える必要はありません。

 

 

OpenSSLがサポートしているプロトコル

OpenSSLは以下のプロトコルバージョンをサポートしています。

 

※2019年現在、TLS 1.3 もサポートされています。

 

※今回は httpd(Apache)を利用しますが、上でも説明しましたように httpd 2.4 では TLSv1.3 はまだサポートされていません。

 

■TLS 1.3 がサポートされているか確認する

[root@RedHat8SV ~]# openssl ciphers -v | grep TLSv1.3 
TLS_AES_256_GCM_SHA384     TLSv1.3 Kx=any      Au=any  Enc=AESGCM(256) Mac=AEAD 
TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any      Au=any  Enc=CHACHA20/POLY1305(256) Mac=AEAD 
TLS_AES_128_GCM_SHA256     TLSv1.3 Kx=any      Au=any  Enc=AESGCM(128) Mac=AEAD 
TLS_AES_128_CCM_SHA256     TLSv1.3 Kx=any      Au=any  Enc=AESCCM(128) Mac=AEAD 
[root@RedHat8SV ~]#

 

 

 

OpenSSL がサポートしている通信の暗号方式

「コンピュータA」「コンピュータB」が通信する場合、OpenSSL は以下の暗号方式で「データ」を暗号化することができます。

こんがらがってしまうかもしれませんが、以下は「データ」を暗号化する方式です。

 

 

 

OpenSSL がサポートしているハッシュ方式(ハッシュ関数)

これらのハッシュ方式(ハッシュ関数)は「MAC」の部分で利用されます。

 

 

OpenSSLがサポートしている公開鍵暗号方式(暗号化アルゴリズム)

 

 

 

証明書を作成する流れ

RedHat 8  上で環境を構築しますが、以下の手順で「鍵」「CSR」「自己署名証明書(オレオレ証明書)」を作成します。

  1. 秘密鍵(server.key)の作成
  2. CSR(server.csr)の作成
  3. 自己証明書(オレオレ証明書)(server.cert)の作成

 

※便宜上分かりやすくするために server.private_key(秘密鍵)、server.csr(CSR ファイル)、server.crt(サーバー証明書)で作成していますが、ファイル名は何でも構いません。自身の環境で分かりやすくするために host名.key のような形式でも問題ありません。

 

※気を付ける部分としては、秘密鍵は重要なファイルなので(外部に漏れたらクラッキングされる危険性があるので)、漏れないようにrootしかアクセスできないディレクトリに入れるなどのセキュリティ対策をしましょう。

 

 

 

 

鍵の設計

これから証明書を作成しますが、最初にどの鍵をどのアルゴリズムで作成するのか設計をします。

 

■サーバー側

 

■CA 側

 

 

秘密鍵の作成

以下の手順で openssl コマンドを使用して秘密鍵を作成します。

 

■鍵を保存するディレクトリ作成

[root@RedHat8SV ~]# mkdir KEY

 

■パスの確認

[root@RedHat8SV ~]# cd KEY/
[root@RedHat8SV KEY]# pwd
/root/KEY
[root@RedHat8SV KEY]#

 

 

 

■サーバー側

■CA 側

 

 

■2048 bit の秘密鍵を作成する(パスフレーズなし)

※秘密鍵にはパスフレーズを設定しません。

コマンドのオプションの解説

[root@RedHat8SV KEY]# openssl genrsa -out /root/KEY/server.private_key 2048 
Generating RSA private key, 2048 bit long modulus (2 primes)
....................+++++
........+++++
e is 65537 (0x010001)
[root@RedHat8SV CA]#

 

 

秘密鍵は cat コマンドで内容を確認できます。

[root@RedHat8SV KEY]# ls -l 
合計 4 
-rw-------. 1 root root 887 11月  2 14:12 server.private_key 

 

[root@RedHat8SV KEY]# cat server.private_key 
-----BEGIN RSA PRIVATE KEY----- 
MIICXQIBAAKBgQC+h2HdBeb65mtisKjszNuOqi6yQXy6hwiFLawedyp9M10wCgeY 
SbLYZXuDfLGYuGHvKQgvm8qEQk0REi5UZfNLhZtI3Gm0sWggi6Oq3NpAL/TkKVXJ 
AVw4YC3t7RtgsisesihGHAq8sbeuXZbt5UW0GTy+m3hU1E7Amxthg0mzNQIDAQAB 
AoGAD+t3/ePUXPqL1n80XjTv04fcxwA5z8wgpiAe1ZzXbAayrqTn5Y2i5/nyzBXL 
MRuW80jWakP2M/7mOZrvTBYIsg28ufoUMd+s7b0zie6Qg6XaCmx8SkAADeusGQbJ 
r1hamOE4Q/zXV2g6ZgZKhMmGZeIq7PWFB9ttlapqTxDWwwECQQDvbsRSoMsdonjF 
Rrjti6ckvrpsleDDjt88X8gHfWe0COwJ7eHhxfRCTzP1g8KLCk5ggBT8LBDi2Ejg 
CR3LuvnFAkEAy7ZZNeiEauAklv4tfR++tO04lDsypylC5mApIMTEuZoBfDrlZDAD 
u85JYYEqyhhE+Hcj5ePbM/dx7w7UTmEasQJBAMPiWknDdQlkr+ut5YOqWm9sfvZx 
VDaJv8cUEYFXLq2TExE4hjGBE0ngpIC7cEDyiJbYktKQdqwwCMcJjk/sQ4UCQQCI 
7RmLva179QtDHrhOuU7DaAw2vo+ugnKATTR33SrqIlVLPn8/13I7A06ZpmuviZ6a 
b+KGPKDzjihb6ljUEjsRAkAyDe0HDMPohAUcpIh2HQoa/LvZF4bfR/FDGLbiKcKF 
Gj6kQS/LKTuT5KrVcNf3Zac8t4KYr5Fav6ezEhGxglTS 
-----END RSA PRIVATE KEY----- 
[root@RedHat8SV KEY]#

 

 

 

 

■2048 bit の秘密鍵を作成する(パスフレーズあり)

※秘密鍵にパスフレーズを設定する場合コマンドです。

オプション

-des3 は、秘密鍵にトリプル DES の暗号を設定することを意味します。

[root@RedHat8SV KEY]# openssl genrsa -des3 -out test-server.private_key 2048 
Generating RSA private key, 2048 bit long modulus (2 primes)
..+++++
.........................................+++++
e is 65537 (0x010001)
Enter pass phrase for test-server.private_key: ← パスフレーズを設定します。
Verifying - Enter pass phrase for test-server.private_key: ← パスフレーズを設定します。
[root@RedHat8SV CA]#

 

 

 

 

■パスフレーズ付きの秘密鍵を cat コマンドで開く

パスフレーズが付いていても cat コマンドでファイルは開けます。

ただし、「Proc-Type: 4,ENCRYPTED」の記述にあるように、この秘密鍵(test-server.private_key)は暗号化(ENCRYPTED)されているので、復号化しないとプログラム上からは読み込めません。

[root@RedHat8SV KEY]# cat test-server.private_key 
-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED ← この秘密鍵(test-server.private_key)は暗号化(ENCRYPTED)されていることが分かります。
DEK-Info: DES-EDE3-CBC,73A5627E80343C15 ← この暗号鍵の暗号化はトリプル DES であることが分かります。 
 
GpMWNKzrFizZsdsZPGFqIuK6lDVJttu0xzcKAhtwL4mj548C/0vwdgzcvgUZ/TOn 
ToWO0fLMPi/jLimhvtMNYfqUQJHtO69JNVSsDsKNbFu6ueMi1INZU952zh0Bve5U 
eQwYE55ikZRrk1vK8m37FBXNHewG7XYcQhKF+ymHpppRPhNMMyjV3Rnzqrqztu+x 
3y96ETq7hfpjSbijUFkLCefA+pYhL+sjM/x/I8PBVcKXeVP3EE243am0JPeeruHG 
jWol1fQGG/Fsn2Ft0YV77g70oWC2g+ZvUAjh67Bi4YdAdzr4H8lq/82Zchzg+bsR 
0pv44kUmElkxPNRXGe+X5XfcNYi5frZ2hptrK7VzASs363G4DcRXx8Cnrujg9/1J 
0WZouaCgrPdCBoZv3/imVOMMg5j41S8KYAjKhfpA0xY4ZGX0TYG/S7Oh7OkF4WEo 
nReZGeFS6ZwuNl9js2LmPdfD9ErzQh9svrVtlx+tgX2y/aZIjsv1dlIJlVMp+665 
ygh5K4GNjDwnjSrxCWZ22umDwGR9yjtb6qZkDubRwMh5UtdHp8PTIvdbJW7atXfA 
fuhk7Wmj+4r4YlzxqUcAeou4nYZRcvKu4eQil1bYLU1iNzg6hLoCLo2uq7jDpFGV 
CGqh8PFlJAQUlyZoXFcsJCN+vv1+kj98VAhS60hIPGnEP3k4uqnHwmBDeHciTyMf 
W0moXTyypuOyeaNWBtccp4zCMPthIzp8gYXeugH5M271Ghmd1SW/3TvhRC5j1tyk 
UZxXYObJR/65bsCyA3dw1RBxByIxnlbG3JZmo9vclXbLAwnnSgsStw== 
-----END RSA PRIVATE KEY----- 
[root@RedHat8SV KEY]#

 

 

 

 

■パスフレーズ付きの秘密鍵を openssl コマンドで開く

[root@RedHat8SV KEY]# openssl rsa -text < test-server.private_key 
Enter pass phrase:  ← パスフレーズを入力します。
RSA Private-Key: (1024 bit, 2 primes) 
modulus: 
    00:e1:23:a0:df:d2:1c:da:12:de:a4:e5:5d:76:b2: 
    7e:73:e8:cd:b1:31:7b:3c:25:ca:f6:a6:71:1a:10: 
    22:ee:34:06:b4:86:67:0e:77:15:d3:a5:5e:1d:90: 
    6a:0f:c0:2e:80:cd:73:bd:13:e2:57:c2:b0:03:5c: 
    d1:da:fe:51:13:3a:34:8d:1e:d6:03:f0:21:cf:96: 
    65:42:a0:9b:c1:cc:13:e3:a4:7c:f7:64:ce:49:fc: 
    9b:d2:c3:76:de:6a:f5:48:85:2b:84:3a:4e:32:63: 
    83:f6:f2:24:d4:3a:18:57:39:e7:6b:dd:19:24:fa: 
    9a:84:ca:73:1c:a5:39:84:cb 
publicExponent: 65537 (0x10001) 
privateExponent: 
    00:9f:56:05:cf:21:f7:05:67:81:67:16:65:35:52: 
    52:28:5a:44:e8:f8:ea:0c:c1:7a:89:61:76:7e:49: 
    99:4f:18:46:fe:90:78:73:46:58:8e:37:65:0a:6b: 
    60:84:d1:30:98:3b:cf:83:ab:84:ef:33:7c:3a:85: 
    00:88:8a:a0:79:34:d9:f3:d5:2b:ef:71:56:16:44: 
    ae:48:4a:ee:e3:d5:9a:36:c8:66:ca:30:3c:67:4c: 
    ee:cd:a3:7d:59:57:3a:bd:e9:58:37:a6:80:0e:30: 
    7d:03:63:91:fd:da:bc:ce:fc:db:6e:10:2e:a8:2f: 
    2c:4b:52:3d:ba:3c:42:fb:f1 
prime1: 
    00:fc:fb:40:88:ed:34:ac:7a:d7:e5:90:89:8e:35: 
    3d:23:73:cb:99:c8:11:57:da:5d:7f:e6:61:59:2c: 
    19:c8:58:dd:b3:ac:32:fe:9a:ef:ea:2f:77:2b:26: 
    b6:c5:2e:f0:d1:60:4b:11:4a:44:df:ec:c7:b8:db: 
    95:98:ee:a0:2d 
prime2: 
    00:e3:d3:54:8f:76:cc:41:34:46:e6:93:5e:3a:27: 
    d3:27:12:fb:b6:84:2e:6a:42:9f:27:39:57:92:63: 
    f4:38:59:f5:25:06:e6:a6:64:3a:b5:ef:f2:9c:41: 
    03:5e:39:30:92:f8:37:15:e5:75:6d:30:d7:de:2d: 
    b7:e5:05:5b:d7 
exponent1: 
    00:a6:fd:42:b0:1f:c3:f1:46:75:54:b7:7f:d5:3b: 
    17:4c:5b:97:3d:bf:6e:93:4b:35:04:c4:11:e6:46: 
    d2:0e:09:7a:ee:aa:f0:4e:57:ff:9d:da:0f:13:90: 
    ce:7c:82:6b:bc:09:90:03:ad:be:a1:01:2f:24:ba: 
    ed:98:b1:8b:51 
exponent2: 
    02:22:6a:ba:65:5c:88:87:da:da:32:2b:41:d4:39: 
    b0:36:07:51:b0:6f:56:e3:84:e6:33:2d:54:db:c6: 
    df:f8:47:c9:af:04:de:2e:36:36:9a:26:e5:bb:de: 
    32:35:ca:f4:b5:8a:9e:93:e5:c3:be:1f:67:9f:7a: 
    07:95:43:45 
coefficient: 
    65:45:af:c3:60:21:f3:f1:83:34:a5:48:80:19:0f: 
    94:ac:21:64:9d:6a:51:be:63:1f:cc:49:96:d8:ad: 
    1b:30:64:e3:0d:23:04:3d:e3:ca:20:35:4b:8f:ee: 
    83:74:95:d7:61:b4:cc:1e:cd:bf:83:4c:d6:d8:bd: 
    69:97:96:bc 
writing RSA key 
-----BEGIN RSA PRIVATE KEY----- 
MIICXQIBAAKBgQDhI6Df0hzaEt6k5V12sn5z6M2xMXs8Jcr2pnEaECLuNAa0hmcO 
dxXTpV4dkGoPwC6AzXO9E+JXwrADXNHa/lETOjSNHtYD8CHPlmVCoJvBzBPjpHz3 
ZM5J/JvSw3beavVIhSuEOk4yY4P28iTUOhhXOedr3Rkk+pqEynMcpTmEywIDAQAB 
AoGBAJ9WBc8h9wVngWcWZTVSUihaROj46gzBeolhdn5JmU8YRv6QeHNGWI43ZQpr 
YITRMJg7z4OrhO8zfDqFAIiKoHk02fPVK+9xVhZErkhK7uPVmjbIZsowPGdM7s2j 
fVlXOr3pWDemgA4wfQNjkf3avM78224QLqgvLEtSPbo8QvvxAkEA/PtAiO00rHrX 
5ZCJjjU9I3PLmcgRV9pdf+ZhWSwZyFjds6wy/prv6i93Kya2xS7w0WBLEUpE3+zH 
uNuVmO6gLQJBAOPTVI92zEE0RuaTXjon0ycS+7aELmpCnyc5V5Jj9DhZ9SUG5qZk 
OrXv8pxBA145MJL4NxXldW0w194tt+UFW9cCQQCm/UKwH8PxRnVUt3/VOxdMW5c9 
v26TSzUExBHmRtIOCXruqvBOV/+d2g8TkM58gmu8CZADrb6hAS8kuu2YsYtRAkAC 
Imq6ZVyIh9raMitB1DmwNgdRsG9W44TmMy1U28bf+EfJrwTeLjY2miblu94yNcr0 
tYqek+XDvh9nn3oHlUNFAkBlRa/DYCHz8YM0pUiAGQ+UrCFknWpRvmMfzEmW2K0b 
MGTjDSMEPePKIDVLj+6DdJXXYbTMHs2/g0zW2L1pl5a8 
-----END RSA PRIVATE KEY----- 
[root@RedHat8SV KEY]#

 

 

 

 

 

■パスフレーズを間違えた場合

パスフレーズを間違えると、当然のことながら秘密鍵を確認することができません。

[root@RedHat8SV KEY]# openssl rsa -text < test-server.private_key 
Enter pass phrase: 
140457904592704:error:28078065:UI routines:UI_set_result_ex:result too small:crypto/ui/ui_lib.c:903:You must type in 4 to 1023 characters 
Enter pass phrase: 
140457904592704:error:2807106B:UI routines:UI_process:processing error:crypto/ui/ui_lib.c:543:while reading strings 
Enter pass phrase: 
140457904592704:error:28078065:UI routines:UI_set_result_ex:result too small:crypto/ui/ui_lib.c:903:You must type in 4 to 1023 characters 
Enter pass phrase: 
140457904592704:error:2807106B:UI routines:UI_process:processing error:crypto/ui/ui_lib.c:543:while reading strings 
Enter pass phrase: 
140457904592704:error:28078065:UI routines:UI_set_result_ex:result too small:crypto/ui/ui_lib.c:903:You must type in 4 to 1023 characters 
Enter pass phrase: 
unable to load Private Key 
140457904592704:error:2807106B:UI routines:UI_process:processing error:crypto/ui/ui_lib.c:543:while reading strings 
140457904592704:error:28078065:UI routines:UI_set_result_ex:result too small:crypto/ui/ui_lib.c:903:You must type in 4 to 1023 characters 
140457904592704:error:2807106B:UI routines:UI_process:processing error:crypto/ui/ui_lib.c:543:while reading strings 
140457904592704:error:28078065:UI routines:UI_set_result_ex:result too small:crypto/ui/ui_lib.c:903:You must type in 4 to 1023 characters 
140457904592704:error:2807106B:UI routines:UI_process:processing error:crypto/ui/ui_lib.c:543:while reading strings 
140457904592704:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:crypto/evp/evp_enc.c:575: 
140457904592704:error:0906A065:PEM routines:PEM_do_header:bad decrypt:crypto/pem/pem_lib.c:461: 
[root@RedHat8SV KEY]#

 

 

 

 

 

 

【補足】openssl コマンドで秘密鍵を作成する際に指定できる暗号化一覧

RSA 暗号方式の秘密鍵を作成するにはopenssl genrsa」コマンドを実行します。

秘密鍵は作成する時に「暗号化」が可能です。

何を「暗号化」しているのか混乱してしまうかもしれませんが

です。

 

暗号化された秘密鍵を読むためには「復号化」しなければいけません。

秘密鍵を「復号化」するために「パスフレーズ」が必要になります。

 

ただし、毎回秘密鍵を読む際に「パスフレーズ」を入力するのが面倒な時があります。

その場合は「パスフレーズ」なしで秘密鍵を作成することもできます。

その代りセキュリティが甘くなります。

 

 

■パスフレーズなしで秘密鍵を作成するコマンド例

[root@RedHat8SV test]# openssl genrsa 2048 > server_no_pass.key
Generating RSA private key, 2048 bit long modulus
.....................................+++
.........................................................................................................+++
e is 65537 (0x10001)
[root@RedHat8SV test]#

 

 

 

■パスフレーズありのコマンド例

DES、DES3、AES128、AES192、AES256 が指定できます。 

[root@RedHat8SV test]# openssl genrsa -des3 -out server_des3.key 2048 ← トリプル DES で暗号化しています。
Generating RSA private key, 2048 bit long modulus
.....................+++
...+++
e is 65537 (0x10001)
Enter pass phrase for server_des3.key:
Verifying - Enter pass phrase for server_des3.key:
[root@RedHat8SV test]#

[root@RedHat8SV test]# openssl genrsa -des -out server_des.key 2048 ← DES で暗号化しています。
Generating RSA private key, 2048 bit long modulus
............................................................................................................................................+++
.......................................+++
e is 65537 (0x10001)
Enter pass phrase for server_des.key:
Verifying - Enter pass phrase for server_des.key:
[root@RedHat8SV test]#

[root@RedHat8SV test]# openssl genrsa -aes128 -out server_aes128.key 2048 ← AES 128 bit で暗号化しています。

 

[root@RedHat8SV test]# openssl genrsa -aes192 -out server_aes192.key 2048 ← AES 192 bit で暗号化しています。

 

[root@RedHat8SV test]# openssl genrsa -aes256 -out server_aes256.key 2048 ← AES 256 bit で暗号化しています。

 

 

 

CSR(証明書署名要求)(server.csr)の作成

秘密鍵を作成したら、その秘密鍵を基に CSR を作成します。

CSR とは認証局に提出する証明書署名要求(Certificate Signing Request)のことを言います。

 

CSR(証明書署名要求、Certificate Signing Request)とは、ベリサインやジオトラストなどのパブリックな認証局に対して「公開鍵」「電子署名」をしてもらうように依頼するためのメッセージです。

 

「電子署名」とは具体的には認証局だけが持つ認証局の「秘密鍵」で署名してもらうことです。

その結果、認証局が認証したことの証明になります。

【Linux】【CentOS6】Apache で<span style=

 

「公開鍵」は作成していませんが、「openssl req」コマンドで秘密鍵を指定することで内部的に「公開鍵」が取り出されて、その「公開鍵」を基に「CSR」ファイルが生成されるので問題ありません。

 

 

■サーバー側

■CA 側

 

 

 

オプションを解説します。

 

■秘密鍵(server.private_key)を使って CSR ファイルを作成する

[root@RedHat8SV KEY]# openssl req -new -key /root/KEY/server.private_key -out /root/KEY/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  ← 2文字の国名コードを指定します。
State or Province Name (full name) []:TOKYO  ← 都道府県名を指定します。
Locality Name (eg, city) [Default City]:NAKANO-KU  ← 都市名を指定します。
Organization Name (eg, company) [Default Company Ltd]:Test Company Ltd.  ← 企業名を指定します。
Organizational Unit Name (eg, section) []:IT Section 01  ← 部署名を指定します。
Common Name (eg, your name or your server's hostname) []:RedHat8SV.xxxxx.com  ← Web サーバーの FQDN を指定します。
Email Address []: 
 
Please enter the following 'extra' attributes 
to be sent with your certificate request 
A challenge password []: 
An optional company name []: 
[root@RedHat8SV KEY]#

 

 

 

■CSR ファイルを確認

[root@RedHat8SV KEY]# ls -l /root/KEY
合計 12 
-rw-r--r--. 1 root root 688 11月  2 14:43 server.csr 
-rw-------. 1 root root 887 11月  2 14:12 server.private_key 

 

[root@RedHat8SV KEY]#

 

 

■CSR ファイルの内容

[root@RedHat8SV KEY]# cat /root/KEY/server.csr 
-----BEGIN CERTIFICATE REQUEST----- 
MIIBwjCCASsCAQAwgYExCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVUT0tZTzEPMA0G 
A1UEBwwGTkFLQU5PMRowGAYDVQQKDBFUZXN0IENvbXBhbnkgTHRkLjEWMBQGA1UE 
CwwNSVQgU2VjdGlvbiAwMTEdMBsGA1UEAwwUUmVkSGF0OFNWLmJveC1jbS5jb20w 
gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAL6HYd0F5vrma2KwqOzM246qLrJB 
fLqHCIUtrB53Kn0zXTAKB5hJsthle4N8sZi4Ye8pCC+byoRCTRESLlRl80uFm0jc 
abSxaCCLo6rc2kAv9OQpVckBXDhgLe3tG2CyKx6yKEYcCryxt65dlu3lRbQZPL6b 
eFTUTsCbG2GDSbM1AgMBAAGgADANBgkqhkiG9w0BAQsFAAOBgQB17ZiyKOnJDGSc 
EuKXNYaf4mRtIfgmRV2CGjABHCPD6sGfdi7zwv8vVa9WC7F8493TV3EomkilPGev 
sx398KvnBiPXYzF0+NGHPOJGRw+wr6wSLSETb9SzIlD8s4pF8axbIPRcfYyJlqNQ 
Hn8HHdPIlpDj6E5TDpHmcMkjjpfhvA== 
-----END CERTIFICATE REQUEST----- 
[root@RedHat8SV KEY]#

 

 

 

 

 

■openssl コマンドで CSR ファイルの内容を確認する

[root@RedHat8SV KEY]# openssl req -text < /root/KEY/server.csr 
Certificate Request: 
    Data: 
        Version: 1 (0x0) 
        Subject: C = JP, ST = TOKYO, L = NAKANO-KU, O = Test Company Ltd., OU = IT Section 01, CN = RedHat8SV.xxxxx.com ← Subject には、CSRファイル作成時に入力した情報が表示されます。
        Subject Public Key Info: 
            Public Key Algorithm: rsaEncryption 
                RSA Public-Key: (1024 bit) 
                Modulus: 
                    00:be:87:61:dd:05:e6:fa:e6:6b:62:b0:a8:ec:cc: 
                    db:8e:aa:2e:b2:41:7c:ba:87:08:85:2d:ac:1e:77: 
                    2a:7d:33:5d:30:0a:07:98:49:b2:d8:65:7b:83:7c: 
                    b1:98:b8:61:ef:29:08:2f:9b:ca:84:42:4d:11:12: 
                    2e:54:65:f3:4b:85:9b:48:dc:69:b4:b1:68:20:8b: 
                    a3:aa:dc:da:40:2f:f4:e4:29:55:c9:01:5c:38:60: 
                    2d:ed:ed:1b:60:b2:2b:1e:b2:28:46:1c:0a:bc:b1: 
                    b7:ae:5d:96:ed:e5:45:b4:19:3c:be:9b:78:54:d4: 
                    4e:c0:9b:1b:61:83:49:b3:35 
                Exponent: 65537 (0x10001) 
        Attributes: 
            a0:00 
    Signature Algorithm: sha256WithRSAEncryption  ← Signature Algorithm にはどのようにして暗号化したのかの情報が表示されます。sha256WithRSAEncryption は、公開鍵暗号方式は RSA を採用しているということと、ハッシュ関数は SHA-2 を利用しているということが分かります。
         75:ed:98:b2:28:e9:c9:0c:64:9c:12:e2:97:35:86:9f:e2:64: 
         6d:21:f8:26:45:5d:82:1a:30:01:1c:23:c3:ea:c1:9f:76:2e: 
         f3:c2:ff:2f:55:af:56:0b:b1:7c:e3:dd:d3:57:71:28:9a:48: 
         a5:3c:67:af:b3:1d:fd:f0:ab:e7:06:23:d7:63:31:74:f8:d1: 
         87:3c:e2:46:47:0f:b0:af:ac:12:2d:21:13:6f:d4:b3:22:50: 
         fc:b3:8a:45:f1:ac:5b:20:f4:5c:7d:8c:89:96:a3:50:1e:7f: 
         07:1d:d3:c8:96:90:e3:e8:4e:53:0e:91:e6:70:c9:23:8e:97: 
         e1:bc 
-----BEGIN CERTIFICATE REQUEST----- 
MIIBwjCCASsCAQAwgYExCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVUT0tZTzEPMA0G 
A1UEBwwGTkFLQU5PMRowGAYDVQQKDBFUZXN0IENvbXBhbnkgTHRkLjEWMBQGA1UE 
CwwNSVQgU2VjdGlvbiAwMTEdMBsGA1UEAwwUUmVkSGF0OFNWLmJveC1jbS5jb20w 
gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAL6HYd0F5vrma2KwqOzM246qLrJB 
fLqHCIUtrB53Kn0zXTAKB5hJsthle4N8sZi4Ye8pCC+byoRCTRESLlRl80uFm0jc 
abSxaCCLo6rc2kAv9OQpVckBXDhgLe3tG2CyKx6yKEYcCryxt65dlu3lRbQZPL6b 
eFTUTsCbG2GDSbM1AgMBAAGgADANBgkqhkiG9w0BAQsFAAOBgQB17ZiyKOnJDGSc 
EuKXNYaf4mRtIfgmRV2CGjABHCPD6sGfdi7zwv8vVa9WC7F8493TV3EomkilPGev 
sx398KvnBiPXYzF0+NGHPOJGRw+wr6wSLSETb9SzIlD8s4pF8axbIPRcfYyJlqNQ 
Hn8HHdPIlpDj6E5TDpHmcMkjjpfhvA== 
-----END CERTIFICATE REQUEST----- 
[root@RedHat8SV KEY]#

 

 

 

 

【補足】Signature Algorithm: sha256WithRSAEncryption の意味について

Signature Algorithm: sha256WithRSAEncryption の意味について解説します。

先ほども解説しましたが、「Signature Algorithm」にはどのようにして暗号化したのかの情報が表示されます。

 

sha256WithRSAEncryption から以下のことが分かります。

 

 

 

 

自己署名用認証局(CA)(オレオレ認証局)の構築

次に自己署名用の認証局(CA)を作成します。

 

 

■サーバー側

■CA 側

 

 

 

■CA 用のディレクトリ(/etc/ssl/CA)を作成する

[root@RedHat8SV ssl]# pwd
/etc/ssl

[root@RedHat8SV ssl]# mkdir CA

[root@RedHat8SV ssl]#

 

 

 

■CA 用の秘密鍵を作成する

[root@RedHat8SV CA]# openssl genrsa 2048 > /etc/ssl/CA/ca.private_key 
Generating RSA private key, 2048 bit long modulus (2 primes)
.....................................................+++++
......................................................+++++
e is 65537 (0x010001)
[root@RedHat8SV CA]#

 

 

 

ファイルを確認します。

[root@RedHat8SV CA]# ls -l /etc/ssl/CA
合計 4 
-rw-r--r--. 1 root root 887 11月  2 16:43 ca.private_key 
[root@RedHat8SV CA]#

 

 

ファイルの内容を確認します。

[root@RedHat8SV CA]# cat /etc/ssl/CA/ca.private_key 
-----BEGIN RSA PRIVATE KEY----- 
MIICXAIBAAKBgQDM3P2N0V+InHFTFQHAYGsHjVSwEbgRWJJ6GNVTkNHRQ7ucf0bt 
48yt1sdf8f/1zT3BuBZZroaMheTsrWH0iHjyvU/EDZUVGqdWDO6KLkKdtZB4h+7X 
0kcxECnDJYoOsPyrBAvvELcOCx+h4pimCE86NgORY0cqWH2rt5qa4+/c3wIDAQAB 
AoGBAMjqSzmVB86hL3s99PPJG+7SKyZqmk1Ywn9Ab6d/Nme3t/3pzZRtf0VWiT6N 
xmw5F8IvWqwlwAt9HWEJQjJizcnveBIiR9sts+olfJEuz8d2Sx+XGzYe9Z5RSms7 
LuUpm8nVOBoU0zXsQwOs0ZOpQq0OkCuDrFy6NA6v6dyG0gjxAkEA/PjmmVmqEyfU 
H7soMfpGodqEJ2TD1OUCKhpQRsvqm5cgvuVNFlAVraHsOiMdzOFBLL/cZx8lQt9z 
TWOnARBQ2wJBAM9Qr2LHY5U7HOnWFWFDLVnxmIFpU01ShGSckgjFMoYUEztSPabm 
B/0JR8LeeRPisiB22QPueP5zOZHwOs3LEU0CQBVtQ6LzjEtJEVeKs7HgAAGPj6gC 
ie/LYe6NAgWtGfcJyvVAWNIuAFgPogGendSPs8SFj7aQVcifQpXofenCJwcCQGLI 
04mB8NWfATv7Itzhoa6GDGE9ys/BTgyS/pLnRBfXYQKXQYFRguTzkxor4A21q6ME 
fov9CfJU/U2o5pxA8tECQBp35AIUTM6+PVrh/zLg5iamMD3XfZwwr3pAdMx6XpUj 
TvP8JOPYTshhMlbBSxXqSz5PDDupvPLunD42yiuxlJc= 
-----END RSA PRIVATE KEY----- 
[root@RedHat8SV CA]#

 

 

 

 

 

■CA 用の秘密鍵を使って CSR ファイルを作成する

[root@RedHat8SV CA]# openssl req -new -key /etc/ssl/CA/ca.private_key -out /etc/ssl/CA/ca.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 ← サーバー証明書用の CSR ファイル作成時と合せます。 
State or Province Name (full name) []:TOKYO ← サーバー証明書用の CSR ファイル作成時と合せます。 
Locality Name (eg, city) [Default City]:NAKANO-KU ← サーバー証明書用の CSR ファイル作成時と合せます。
Organization Name (eg, company) [Default Company Ltd]:Test Company Ltd. ← サーバー証明書用の CSR ファイル作成時と合せます。 
Organizational Unit Name (eg, section) []:IT Section 01 ← サーバー証明書用の CSR ファイル作成時と合せます。 
Common Name (eg, your name or your server's hostname) []:RedHat8SV.xxxxxx.com ← サーバー証明書用の CSR ファイル作成時と合せます。
Email Address []: 
 
Please enter the following 'extra' attributes 
to be sent with your certificate request 
A challenge password []: 
An optional company name []: 
[root@RedHat8SV CA]#

 

 

 

通常はここから更に上位の認証局に SSL 証明書を作成してもらいますが、今回はオレオレ認証局なので CA が自分自身で電子署名を行ない、CA 用のオレオレ証明書(自己署名証明書)を作成します。

[root@RedHat8SV CA]# openssl x509 -in /etc/ssl/CA/ca.csr -days 3650 -req -signkey /etc/ssl/CA/ca.private_key -out /etc/ssl/CA/ca.cert 
Signature ok 
subject=C = JP, ST = TOKYO, L = NAKANO-KU, O = Test Company Ltd., OU = IT Section 01, CN = RedHat8SV.xxxxxx.com 
Getting Private key 
[root@RedHat8SV CA]#

 

 

 

ファイルを確認します。

[root@RedHat8SV CA]# ls -l /etc/ssl/CA
合計 12 
-rw-r--r--. 1 root root 908 11月  2 16:59 ca.cert 
-rw-r--r--. 1 root root 672 11月  2 16:53 ca.csr 
-rw-r--r--. 1 root root 887 11月  2 16:43 ca.private_key 
[root@RedHat8SV CA]#

 

 

 

 

■CA 用サーバー証明書の中身

[root@RedHat8SV CA]# cat ca.cert 
-----BEGIN CERTIFICATE----- 
MIICcjCCAdsCFHXAh0YvDoWGTAM1XoCNWNmDMzYUMA0GCSqGSIb3DQEBCwUAMHgx 
CzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVUT0tZTzEUMBIGA1UEBwwLU0hJTkpVS1Ut 
S1UxGDAWBgNVBAoMD0NBIFRFU1QgQ29tcGFueTETMBEGA1UECwwKQ0EgU2VjdGlv 
bjEUMBIGA1UEAwwLQ0EudGVzdC5jb20wHhcNMTkxMTAyMDc1OTA2WhcNMjkxMDMw 
MDc1OTA2WjB4MQswCQYDVQQGEwJKUDEOMAwGA1UECAwFVE9LWU8xFDASBgNVBAcM 
C1NISU5KVUtVLUtVMRgwFgYDVQQKDA9DQSBURVNUIENvbXBhbnkxEzARBgNVBAsM 
CkNBIFNlY3Rpb24xFDASBgNVBAMMC0NBLnRlc3QuY29tMIGfMA0GCSqGSIb3DQEB 
AQUAA4GNADCBiQKBgQDM3P2N0V+InHFTFQHAYGsHjVSwEbgRWJJ6GNVTkNHRQ7uc 
f0bt48yt1sdf8f/1zT3BuBZZroaMheTsrWH0iHjyvU/EDZUVGqdWDO6KLkKdtZB4 
h+7X0kcxECnDJYoOsPyrBAvvELcOCx+h4pimCE86NgORY0cqWH2rt5qa4+/c3wID 
AQABMA0GCSqGSIb3DQEBCwUAA4GBACCxoQTyfNsSk9PVy9+Aq4tj5/p/5tkwCD2G 
d60ElX99c4WkQ4cUoG71gLI22mqD1Gb21FA9l/PEiuTvojQMUmI40SG96qIUJENt 
A5s0IxugVs2wDfrZDSFO+zpbBQ8KTj9zOmx/htm6YAXGRBpPmmu7kG8V/WPH/fSZ 
2TutDPCb 
-----END CERTIFICATE----- 
[root@RedHat8SV CA]#

 

 

 

 

■openssl コマンドでオレオレ認証局(CA)の SSL 証明書の中身を確認する 

[root@RedHat8SV ~]# openssl x509 -text -noout -in /etc/ssl/CA/ca.cert 
Certificate: 
    Data: 
        Version: 1 (0x0) 
        Serial Number: 
            4b:ba:6a:f3:a8:ef:f8:ef:52:7b:6a:95:c7:f2:4e:f8:d6:0c:82:0e 
        Signature Algorithm: sha256WithRSAEncryption 
        Issuer: C = JP, ST = TOKYO, L = NAKANO-KU, O = Test Company Ltd., OU = IT Section 01, CN = RedHat8SV.xxxxx.com 
        Validity 
            Not Before: Nov  4 11:44:39 2019 GMT 
            Not After : Nov  1 11:44:39 2029 GMT 
        Subject: C = JP, ST = TOKYO, L = NAKANO-KU, O = Test Company Ltd., OU = IT Section 01, CN = RedHat8SV.xxxxx.com 
        Subject Public Key Info: 
            Public Key Algorithm: rsaEncryption 
                RSA Public-Key: (2048 bit) 
                Modulus: 
                    00:b8:94:7e:87:95:3a:d3:14:38:17:7d:3b:02:f3: 
                    4e:6c:38:ce:ac:7d:88:24:67:76:e6:b8:b8:ea:9f: 
                    ad:fe:f4:b3:bd:2a:e0:ec:8d:db:33:6b:22:e3:6d: 
                    79:92:6f:fe:4c:ec:32:b0:a9:4f:60:78:31:00:88: 
                    c6:81:bc:c8:05:7c:6c:60:79:86:9f:67:99:7a:ad: 
                    4b:3c:c2:ef:9e:ad:82:e3:99:87:87:f1:13:dd:0d: 
                    0c:86:b9:64:87:3e:78:e3:24:27:eb:c8:c7:6d:05: 
                    69:79:80:12:a9:2e:4b:06:04:49:f6:d8:dd:48:39: 
                    c6:08:f1:ac:25:fa:f6:46:d4:25:a7:b0:f6:e0:4f: 
                    9c:a1:17:1b:18:ef:8d:e1:39:80:30:5f:2c:6f:83: 
                    ff:0f:b1:44:8d:6b:77:03:3b:15:b5:18:db:ee:91: 
                    93:ad:9e:fe:21:32:92:f9:8e:52:43:15:ea:58:3e: 
                    1e:5a:6a:a7:01:13:5b:46:32:fa:86:9e:b3:c1:9d: 
                    dd:d2:ff:9f:40:52:ce:f7:f6:8b:dc:17:c3:36:26: 
                    f9:1c:6d:73:5e:0b:15:1c:3e:ec:02:03:9e:04:73: 
                    b0:5d:f0:55:d9:51:a5:6f:44:fe:49:2c:d6:76:5d: 
                    35:30:94:d0:cf:6e:16:e6:0c:3b:0e:83:6e:f9:85: 
                    70:51 
                Exponent: 65537 (0x10001) 
    Signature Algorithm: sha256WithRSAEncryption 
         1c:9c:03:62:31:ec:51:89:9d:5a:ed:44:ed:cb:63:a8:b9:b8: 
         28:41:1b:c4:2d:99:35:b5:bb:a2:46:b8:25:e4:1d:61:b1:7e: 
         af:96:66:dd:5b:c8:86:1d:d9:68:1c:69:b2:95:dd:c0:46:0b: 
         8c:06:6a:b9:b3:66:9a:cc:66:cc:21:3f:d2:7c:53:f4:f8:64: 
         ee:6e:24:08:41:3f:91:99:66:19:dc:7c:cb:1d:af:9d:30:5d: 
         4a:57:bf:cd:41:e6:e4:1c:f9:0e:65:f8:38:54:01:4a:89:46: 
         e6:33:c3:24:bc:70:0b:03:4c:df:6a:11:ee:e6:1b:b3:7c:4f: 
         b6:35:18:73:fc:2e:58:c4:2b:64:e3:25:fc:c6:82:78:3b:cb: 
         8a:2a:dd:6f:d5:fb:70:7a:63:3c:7c:e3:b4:47:1c:6c:0d:ba: 
         8e:41:3b:da:e8:97:8b:3a:31:4c:df:92:59:72:b8:45:f5:b5: 
         19:0e:0b:03:f8:73:dc:f8:52:a2:d0:59:05:de:fd:f4:41:08: 
         f9:fa:a2:67:f4:40:47:c5:ee:b1:6c:47:6b:e2:4a:e6:f6:41: 
         85:59:1e:c9:db:be:1d:52:0f:b8:f8:fb:ad:94:5a:2c:3b:ad: 
         a8:7b:6f:e4:01:91:b7:3c:ae:f3:28:84:2b:5d:56:4d:b0:21: 
         19:70:ec:d4 
[root@RedHat8SV ~]#

 

 

 

 

インデックスファイル(index.txt)を作成する

CA の各種ファイルを保存するディレクトリ(/etc/ssl/CA)にインデックスファイルを作成します。

■index.txtファイルを作成する

[root@RedHat8SV ~]# touch /etc/ssl/CA/index.txt
[root@RedHat8SV ~]#

 

 

■index.txt ファイルの中身

[root@RedHat8SV CA]# cat index.txt 
V       201101114642Z           00      unknown /C=JP/ST=TOKYO/O=Test Company Ltd./OU=IT Section 01/CN=RedHat8SV.xxxxxx.com 
[root@RedHat8SV CA]#

 

 

 

 

index.txt.attr ファイルを作成する

■index.txt.attr ファイルを作成する

[root@RedHat8SV CA]# touch /etc/ssl/CA/index.txt.attr
[root@RedHat8SV CA]#

 

 

■index.txt.attr ファイルの中身

[root@RedHat8SV CA]# cat index.txt.attr
unique_subject = yes
[root@RedHat8SV CA]#

 

 

serial ファイルを作成する

■serial ファイルを作成する

[root@RedHat8SV ~]# echo 00 > /etc/ssl/CA/serial

 

 

■serial ファイルの中身

[root@RedHat8SV CA]# cat serial
01
[root@RedHat8SV CA]#

 

 

 

 

自己署名証明書(オレオレ証明書)の作成

最後に CA にて「CA の秘密鍵」「CSR」より「サーバー証明書」を作成します。

※サーバー証明書は通常パブリックなCA機関(ベリサイン、ジオトラスト等)が発行していますが、ここでは先ほど作成した CA でサーバー証明書を発行しています。

 

下図ではパブリックなCA(認証局)の「秘密鍵」「サーバー証明書」を作成して送り返していますが、今回は自分で作った CA より「CA の秘密鍵」「サーバー証明書」を作成するので「自己署名証明書(オレオレ証明書)」になります。

※厳密に言うと、自己署名証明書は自分で署名するという意味なので、今回の場合だと CA が自己署名証明書(オレオレ証明書)になります。

【Linux】【CentOS6】Apache で<span style=

 

 

CA 用のコンフィグファイルの設定

CA 用のコンフィグファイル(openssl.cnf)を編集します。

※下記でも解説しますが、特に Subject Alternative Name 用の設定が必要になります。

 

最初にデフォルトの openssl.cnf を CA 用のディレクトリ(/etc/ssl/CA)にコピーします。

■openssl.cnf ファイルのコピー

[root@RedHat8SV ~]# cp -ip /etc/pki/tls/openssl.cnf /etc/ssl/CA/openssl.cnf

 

 

■/etc/ssl/CA/openssl.cnf

[root@RedHat8SV ~]# vi /etc/ssl/CA/openssl.cnf 

# OpenSSL example configuration file. 
# This is mostly being used for generation of certificate requests. 

 
# Note that you can include other files from the main configuration 
# file using the .include directive. 
#.include filename 
 
# This definition stops the following lines choking if HOME isn't 
# defined. 
HOME                    = . 
#RANDFILE               = $ENV::HOME/.rnd 
 
# Extra OBJECT IDENTIFIER info: 
#oid_file               = $ENV::HOME/.oid 
oid_section             = new_oids 
 
# To use this configuration file with the "-extfile" option of the 
# "openssl x509" utility, name here the section containing the 
# X.509v3 extensions to use: 
# extensions            = 
# (Alternatively, use a configuration file that has only 
# X.509v3 extensions in its main [= default] section.) 
 
# Load default TLS policy configuration 
 
openssl_conf = default_modules 
 
[ default_modules ] 
 
ssl_conf = ssl_module 
 
[ ssl_module ] 
 
system_default = crypto_policy 
 
[ crypto_policy ] 
 
.include /etc/crypto-policies/back-ends/opensslcnf.config 
 
[ new_oids ] 
 
# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. 
# Add a simple OID like this: 
# testoid1=1.2.3.4 
# Or use config file substitution like this: 
# testoid2=${testoid1}.5.6 
 
# Policies used by the TSA examples. 
tsa_policy1 = 1.2.3.4.1 
tsa_policy2 = 1.2.3.4.5.6 
tsa_policy3 = 1.2.3.4.5.7 
 
#################################################################### 
[ ca ] 
default_ca      = CA_default            # The default ca section 
 
#################################################################### 
[ CA_default ] 
 
#dir            = /etc/pki/CA           # Where everything is kept 
dir             = /etc/ssl/CA           # Where everything is kept ← 新規の CA のデフォルトディレクトリを設定します。 
certs           = $dir/certs            # Where the issued certs are kept 
crl_dir         = $dir/crl              # Where the issued crl are kept 
database        = $dir/index.txt        # database index file. 
#unique_subject = no                    # Set to 'no' to allow creation of 
                                        # several certs with same subject. 
new_certs_dir   = $dir/newcerts         # default place for new certs. 
 
certificate     = $dir/cacert.pem       # The CA certificate 
serial          = $dir/serial           # The current serial number 
crlnumber       = $dir/crlnumber        # the current crl number 
                                        # must be commented out to leave a V1 CRL 
crl             = $dir/crl.pem          # The current CRL 
private_key     = $dir/private/cakey.pem# The private key 
RANDFILE        = $dir/private/.rand    # private random number file 
 
x509_extensions = usr_cert              # The extensions to add to the cert 
 
# Comment out the following two lines for the "traditional" 
# (and highly broken) format. 
name_opt        = ca_default            # Subject Name options 
cert_opt        = ca_default            # Certificate field options 
 
# Extension copying option: use with caution. 
# copy_extensions = copy 
 
# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs 
# so this is commented out by default to leave a V1 CRL. 
# crlnumber must also be commented out to leave a V1 CRL. 
# crl_extensions        = crl_ext 
 
default_days    = 365                   # how long to certify for 
default_crl_days= 30                    # how long before next CRL 
default_md      = sha256                # use SHA-256 by default 
preserve        = no                    # keep passed DN ordering 
 
# A few difference way of specifying how similar the request should look 
# For type CA, the listed attributes must be the same, and the optional 
# and supplied fields are just that 🙂 
policy          = policy_match 
 
# For the CA policy 
[ policy_match ] 
countryName             = match 
stateOrProvinceName     = match 
organizationName        = match 
organizationalUnitName  = optional 
commonName              = supplied 
emailAddress            = optional 
 
# For the 'anything' policy 
# At this point in time, you must list all acceptable 'object' 
# types. 
[ policy_anything ] 
countryName             = optional 
stateOrProvinceName     = optional 
localityName            = optional 
organizationName        = optional 
organizationalUnitName  = optional 
commonName              = supplied 
emailAddress            = optional 
 
#################################################################### 
[ req ] 
default_bits            = 2048 
default_md              = sha256 
default_keyfile         = privkey.pem 
distinguished_name      = req_distinguished_name 
attributes              = req_attributes 
x509_extensions = v3_ca # The extensions to add to the self signed cert 
 
# Passwords for private keys if not present they will be prompted for 
# input_password = secret 
# output_password = secret 
 
# This sets a mask for permitted string types. There are several options. 
# default: PrintableString, T61String, BMPString. 
# pkix   : PrintableString, BMPString (PKIX recommendation before 2004) 
# utf8only: only UTF8Strings (PKIX recommendation after 2004). 
# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). 
# MASK:XXXX a literal mask value. 
# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. 
string_mask = utf8only 
 
# req_extensions = v3_req # The extensions to add to a certificate request 
 
[ req_distinguished_name ] 
countryName                     = Country Name (2 letter code) 
countryName_default             = XX 
countryName_min                 = 2 
countryName_max                 = 2 
 
stateOrProvinceName             = State or Province Name (full name) 
#stateOrProvinceName_default    = Default Province 
 
localityName                    = Locality Name (eg, city) 
localityName_default            = Default City 
 
0.organizationName              = Organization Name (eg, company) 
0.organizationName_default      = Default Company Ltd 
 
# we can do this but it is not needed normally 🙂 
#1.organizationName             = Second Organization Name (eg, company) 
#1.organizationName_default     = World Wide Web Pty Ltd 
 
organizationalUnitName          = Organizational Unit Name (eg, section) 
#organizationalUnitName_default = 
 
commonName                      = Common Name (eg, your name or your server\'s hostname) 
commonName_max                  = 64 
 
emailAddress                    = Email Address 
emailAddress_max                = 64 
 
# SET-ex3                       = SET extension number 3 
 
[ req_attributes ] 
challengePassword               = A challenge password 
challengePassword_min           = 4 
challengePassword_max           = 20 
 
unstructuredName                = An optional company name 
 
[ usr_cert ] 
 
# These extensions are added when 'ca' signs a request. 
 
# This goes against PKIX guidelines but some CAs do it and some software 
# requires this to avoid interpreting an end user certificate as a CA. 
 
basicConstraints=CA:FALSE 
 
# Here are some examples of the usage of nsCertType. If it is omitted 
# the certificate can be used for anything *except* object signing. 
 
# This is OK for an SSL server. 
# nsCertType                    = server 
 
# For an object signing certificate this would be used. 
# nsCertType = objsign 
 
# For normal client use this is typical 
# nsCertType = client, email 
 
# and for everything including object signing: 
# nsCertType = client, email, objsign 
 
# This is typical in keyUsage for a client certificate. 
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment 
 
# This will be displayed in Netscape's comment listbox. 
nsComment                       = "OpenSSL Generated Certificate" 
 
# PKIX recommendations harmless if included in all certificates. 
subjectKeyIdentifier=hash 
authorityKeyIdentifier=keyid,issuer 
 
# This stuff is for subjectAltName and issuerAltname. 
# Import the email address. 
# subjectAltName=email:copy 
# An alternative to produce certificates that aren't 
# deprecated according to PKIX. 
# subjectAltName=email:move 
 
# Copy subject details 
# issuerAltName=issuer:copy 
 
#nsCaRevocationUrl              = http://www.domain.dom/ca-crl.pem 
#nsBaseUrl 
#nsRevocationUrl 
#nsRenewalUrl 
#nsCaPolicyUrl 
#nsSslServerName 
 
# This is required for TSA certificates. 
# extendedKeyUsage = critical,timeStamping 
 
[ v3_req ] 
 
# Extensions to add to a certificate request 
 
basicConstraints = CA:FALSE 
keyUsage = nonRepudiation, digitalSignature, keyEncipherment 
 
subjectAltName = @alt_names 
 
[ v3_ca ] 
 
 
# Extensions for a typical CA 
 
 
# PKIX recommendation. 
 
subjectKeyIdentifier=hash 
 
authorityKeyIdentifier=keyid:always,issuer 
 
basicConstraints = critical,CA:true 
 
# Key usage: this is typical for a CA certificate. However since it will 
# prevent it being used as an test self-signed certificate it is best 
# left out by default. 
# keyUsage = cRLSign, keyCertSign 
 
# Some might want this also 
# nsCertType = sslCA, emailCA 
 
# Include email address in subject alt name: another PKIX recommendation 
# subjectAltName=email:copy 
# Copy issuer details 
# issuerAltName=issuer:copy 
 
# DER hex encoding of an extension: beware experts only! 
# obj=DER:02:03 
# Where 'obj' is a standard or added object 
# You can even override a supported extension: 
# basicConstraints= critical, DER:30:03:01:01:FF 
 
[ crl_ext ] 
 
# CRL extensions. 
# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. 
 
# issuerAltName=issuer:copy 
authorityKeyIdentifier=keyid:always 
 
[ proxy_cert_ext ] 
# These extensions should be added when creating a proxy certificate 
 
# This goes against PKIX guidelines but some CAs do it and some software 
# requires this to avoid interpreting an end user certificate as a CA. 
 
basicConstraints=CA:FALSE 
 
# Here are some examples of the usage of nsCertType. If it is omitted 
# the certificate can be used for anything *except* object signing. 
 
# This is OK for an SSL server. 
# nsCertType                    = server 
 
# For an object signing certificate this would be used. 
# nsCertType = objsign 
 
# For normal client use this is typical 
# nsCertType = client, email 
 
# and for everything including object signing: 
# nsCertType = client, email, objsign 
 
# This is typical in keyUsage for a client certificate. 
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment 
 
# This will be displayed in Netscape's comment listbox. 
nsComment                       = "OpenSSL Generated Certificate" 
 
# PKIX recommendations harmless if included in all certificates. 
subjectKeyIdentifier=hash 
authorityKeyIdentifier=keyid,issuer 
 
# This stuff is for subjectAltName and issuerAltname. 
# Import the email address. 
# subjectAltName=email:copy 
# An alternative to produce certificates that aren't 
# deprecated according to PKIX. 
# subjectAltName=email:move 
 
# Copy subject details 
# issuerAltName=issuer:copy 
 
#nsCaRevocationUrl              = http://www.domain.dom/ca-crl.pem 
#nsBaseUrl 
#nsRevocationUrl 
#nsRenewalUrl 
#nsCaPolicyUrl 
#nsSslServerName 
 
# This really needs to be in place for it to be a proxy certificate. 
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo 
 
#################################################################### 
[ tsa ] 
 
default_tsa = tsa_config1       # the default TSA section 
 
[ tsa_config1 ] 
 
# These are used by the TSA reply generation only. 
dir             = /etc/pki/CA           # TSA root directory 
serial          = $dir/tsaserial        # The current serial number (mandatory) 
crypto_device   = builtin               # OpenSSL engine to use for signing 
signer_cert     = $dir/tsacert.pem      # The TSA signing certificate 
                                        # (optional) 
certs           = $dir/cacert.pem       # Certificate chain to include in reply 
                                        # (optional) 
signer_key      = $dir/private/tsakey.pem # The TSA private key (optional) 
signer_digest  = sha256                 # Signing digest to use. (Optional) 
default_policy  = tsa_policy1           # Policy if request did not specify it 
                                        # (optional) 
other_policies  = tsa_policy2, tsa_policy3      # acceptable policies (optional) 
digests     = sha1, sha256, sha384, sha512  # Acceptable message digests (mandatory) 
accuracy        = secs:1, millisecs:500, microsecs:100  # (optional) 
clock_precision_digits  = 0     # number of digits after dot. (optional) 
ordering                = yes   # Is ordering defined for timestamps? 
                                # (optional, default: no) 
tsa_name                = yes   # Must the TSA name be included in the reply? 
                                # (optional, default: no) 
ess_cert_id_chain       = no    # Must the ESS cert id chain be included? 
                                # (optional, default: no) 
ess_cert_id_alg         = sha1  # algorithm to compute certificate 
                                # identifier (optional, default: sha1) 
[root@RedHat8SV ~]#

 

 

 

■サーバー側

 

■CA 側

 

■CA 側の設定ファイル等

 

■オプション

※本来ならこのサーバー証明書の作成はベリサインジオトラスト等のパブリックな認証局が行います。その際にベリサインジオトラストが保有している秘密鍵(server.key)を利用して server.crt を作成するので、お金を出して買う価値があります。今回の場合は自分で作った server.key を使ってサーバー証明書を作成しているので自己署名証明書(オレオレ証明書)になります。

 

■CA(RootCA)よりコンフィグ(/etc/ssl/CA/openssl.cnf)を読み込んで証明書署名要求に応じサーバー証明書を発行する

[root@RedHat8SV CA]# openssl ca -config /etc/ssl/CA/openssl.cnf -in /root/KEY/server.csr -keyfile /etc/ssl/CA/ca.private_key -cert /etc/ssl/CA/ca.cert -out /root/KEY/server.cert -extfile /etc/ssl/CA/san.ext 
Using configuration from /etc/ssl/CA/openssl.cnf 
Check that the request matches the signature 
Signature ok 
Certificate Details: 
        Serial Number: 0 (0x0) 
        Validity 
            Not Before: Nov  2 11:46:42 2019 GMT 
            Not After : Nov  1 11:46:42 2020 GMT 
        Subject: 
            countryName               = JP 
            stateOrProvinceName       = TOKYO 
            organizationName          = Test Company Ltd. 
            organizationalUnitName    = IT Section 01 
            commonName                = RedHat8SV.xxxxxx.com 
        X509v3 extensions:
            X509v3 Subject Alternative Name:
                 DNS:RedHat8SV.xxxxxx.com ← Subject Alternative Name が登録されます。

 
Certificate is to be certified until Nov  1 11:46:42 2020 GMT (365 days) 
Sign the certificate? [y/n]:
 
 
1 out of 1 certificate requests certified, commit? [y/n]y 
Write out database with 1 new entries 
Data Base Updated 
[root@RedHat8SV CA]#

 

 

 

■openssl ca コマンドの man コマンドの結果

CA(1)                                  OpenSSL                                                    CA(1) 
 
NAME 
openssl-ca, ca - sample minimal CA application 
 
SYNOPSIS 
openssl ca [-help] [-verbose] [-config filename] [-name section] [-gencrl] [-revoke file] [-valid file] [-status serial] [-updatedb] [-crl_reason reason] [-crl_hold instruction] [-crl_compromise time] [-crl_CA_compromise time] [-crldays days] [-crlhours hours] [-crlexts section] [-startdate date] [-enddate date] [-days arg] [-md arg] [-policy arg] [-keyfile arg] [-keyform PEM|DER] [-key arg] [-passin arg] [-cert file] [-selfsign] [-in file] [-out file] [-notext] [-outdir dir] [-infiles] [-spkac file] [-ss_cert file] [-preserveDN] [-noemailDN] [-batch] [-msie_hack] [-extensions section] [-extfile section] [-engine id] [-subj arg] [-utf8] [-create_serial] [-rand_serial] [-multivalue-rdn] [-rand file...]  [-writerand file] 
 
DESCRIPTION 
The ca command is a minimal CA application. It can be used to sign certificate requests in a variety of forms and generate CRLs it also maintains a text database of issued certificates and their status. 
caコマンドは最小限のCAアプリケーションです。 さまざまな形式で証明書要求に署名し、発行された証明書とそのステータスのテキストデータベースを保持するCRLを生成するために使用できます。

The options descriptions will be divided into each purpose.

「オプション」の説明は、それぞれの目的に分割されます。

 

 

 

■SSL 証明書(サーバー証明書)の中身を確認する

cat コマンドで SSL 証明書(サーバー証明書)を確認します。

[root@RedHat8SV ~]# cat /root/KEY/server.cert 
Certificate: 
    Data: 
        Version: 3 (0x2) 
        Serial Number: 4 (0x4) 
        Signature Algorithm: sha256WithRSAEncryption 
        Issuer: C=JP, ST=TOKYO, L=NAKANO-KU, O=Test Company Ltd., OU=IT Section 01, CN=RedHat8SV.xxxxx.com 
        Validity 
            Not Before: Nov 10 13:20:34 2019 GMT 
            Not After : Nov  9 13:20:34 2020 GMT 
        Subject: C=JP, ST=TOKYO, O=Test Company Ltd., OU=IT Section 01, CN=RedHat8SV.xxxxx.com 
        Subject Public Key Info: 
            Public Key Algorithm: rsaEncryption 
                RSA Public-Key: (2048 bit) 
                Modulus: 
                    00:a4:73:69:19:98:fc:13:3f:c7:2c:fb:1d:c8:40: 
                    7d:17:f2:75:22:e2:f8:8f:9b:fd:ff:c6:5b:e9:88: 
                    1c:ab:c7:3d:ff:49:0e:9e:67:c7:0e:e0:68:8c:b1: 
                    9e:56:0f:07:db:e8:50:d4:94:21:d5:6c:78:47:2f: 
                    ab:c3:32:08:83:fd:2d:bb:86:5d:2a:cb:b6:5d:ab: 
                    87:e5:4c:1e:08:09:86:83:22:e9:07:8b:ef:3f:ab: 
                    4a:c3:7a:1a:2b:59:d7:ee:40:95:31:09:0b:4f:63: 
                    bf:aa:0b:1f:0b:32:55:f0:e9:02:b8:95:5c:b3:cf: 
                    3e:3b:ef:8a:b0:9e:41:62:5f:1e:98:47:1c:11:4c: 
                    df:3f:bf:3c:dc:0d:91:f6:74:40:37:b6:4b:d9:ad: 
                    ef:8f:90:93:e3:31:ae:a5:19:83:9e:d7:94:52:37: 
                    c4:6a:ab:dc:6d:a3:c2:b1:41:f6:3c:6e:22:c2:8e: 
                    15:cf:bb:19:a2:b4:81:cf:8f:3f:89:cf:61:65:04: 
                    f5:79:cc:90:ab:af:5a:5f:8e:ee:14:17:99:3f:ad: 
                    9d:09:e9:28:85:3c:16:af:d7:d7:07:a4:1c:2a:07: 
                    79:9e:79:46:de:60:78:97:fb:65:3a:03:56:03:5e: 
                    5a:b9:29:f6:b2:fd:63:bd:13:97:4e:5e:70:4a:23: 
                    2c:b9 
                Exponent: 65537 (0x10001) 
        X509v3 extensions: 
            X509v3 Subject Alternative Name: 
                DNS:RedHat8SV.xxxxx.com 
    Signature Algorithm: sha256WithRSAEncryption 
         57:f4:66:a4:51:07:a7:b9:a4:5c:98:33:ee:3e:46:11:b3:4f: 
         75:91:d1:e8:68:db:cb:69:13:91:0a:8f:6a:b8:30:d2:43:63: 
         c1:3f:55:34:dd:69:1f:30:6d:5e:bd:5e:a5:ce:27:ee:12:d0: 
         96:da:61:b0:e0:df:c1:ef:05:ca:7e:5c:01:5f:11:b1:e3:9c: 
         9d:91:da:6b:5f:51:dd:a3:da:67:55:68:13:10:af:17:7a:d8: 
         ac:b2:35:d9:39:b3:dd:1d:35:b0:d9:7a:d5:34:a8:7d:52:36: 
         11:03:95:e5:1a:7a:a0:bd:dc:b7:db:83:62:92:48:c1:0b:e2: 
         40:4b:8c:4a:7a:64:32:31:f0:cf:38:c0:ca:5b:98:bb:ec:e9: 
         10:6c:ec:d9:b8:f0:d8:d6:95:83:9e:df:0c:a4:24:ea:39:b5: 
         14:23:77:84:b8:23:f5:c7:69:6c:a6:88:98:93:04:19:51:3b: 
         99:86:19:42:3e:1a:ca:14:11:73:d1:e0:a7:b7:76:7c:2a:28: 
         72:ec:08:30:39:a9:74:1d:aa:63:f1:1a:5d:da:ae:e7:0a:22: 
         8b:67:69:e8:14:e0:f5:10:3f:4a:81:6a:ce:14:70:a4:72:1c: 
         51:66:b4:b9:10:31:f0:90:46:70:62:80:39:37:21:90:2b:ae: 
         f9:64:0c:34 
-----BEGIN CERTIFICATE----- 
MIIDkzCCAnugAwIBAgIBBDANBgkqhkiG9w0BAQsFADCBhDELMAkGA1UEBhMCSlAx 
DjAMBgNVBAgMBVRPS1lPMRIwEAYDVQQHDAlOQUtBTk8tS1UxGjAYBgNVBAoMEVRl 
c3QgQ29tcGFueSBMdGQuMRYwFAYDVQQLDA1JVCBTZWN0aW9uIDAxMR0wGwYDVQQD 
DBRSZWRIYXQ4U1YuYm94LWNtLmNvbTAeFw0xOTExMTAxMzIwMzRaFw0yMDExMDkx 
MzIwMzRaMHAxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVUT0tZTzEaMBgGA1UECgwR 
VGVzdCBDb21wYW55IEx0ZC4xFjAUBgNVBAsMDUlUIFNlY3Rpb24gMDExHTAbBgNV 
BAMMFFJlZEhhdDhTVi5ib3gtY20uY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A 
MIIBCgKCAQEApHNpGZj8Ez/HLPsdyEB9F/J1IuL4j5v9/8Zb6Ygcq8c9/0kOnmfH 
DuBojLGeVg8H2+hQ1JQh1Wx4Ry+rwzIIg/0tu4ZdKsu2XauH5UweCAmGgyLpB4vv 
P6tKw3oaK1nX7kCVMQkLT2O/qgsfCzJV8OkCuJVcs88+O++KsJ5BYl8emEccEUzf 
P7883A2R9nRAN7ZL2a3vj5CT4zGupRmDnteUUjfEaqvcbaPCsUH2PG4iwo4Vz7sZ 
orSBz48/ic9hZQT1ecyQq69aX47uFBeZP62dCekohTwWr9fXB6QcKgd5nnlG3mB4 
l/tlOgNWA15auSn2sv1jvROXTl5wSiMsuQIDAQABoyMwITAfBgNVHREEGDAWghRS 
ZWRIYXQ4U1YuYm94LWNtLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAV/RmpFEHp7mk 
XJgz7j5GEbNPdZHR6Gjby2kTkQqPargw0kNjwT9VNN1pHzBtXr1epc4n7hLQltph 
sODfwe8Fyn5cAV8RseOcnZHaa19R3aPaZ1VoExCvF3rYrLI12Tmz3R01sNl61TSo 
fVI2EQOV5Rp6oL3ct9uDYpJIwQviQEuMSnpkMjHwzzjAyluYu+zpEGzs2bjw2NaV 
g57fDKQk6jm1FCN3hLgj9cdpbKaImJMEGVE7mYYZQj4ayhQRc9Hgp7d2fCoocuwI 
MDmpdB2qY/EaXdqu5woii2dp6BTg9RA/SoFqzhRwpHIcUWa0uRAx8JBGcGKAOTch 
kCuu+WQMNA== 
-----END CERTIFICATE----- 
[root@RedHat8SV ~]#

 

 

 

 

■SSL 証明書(サーバー証明書)の中身を確認する

openssl コマンドで SSL 証明書(サーバー証明書)を確認します。

[root@RedHat8SV CA]# openssl x509 -text -noout -in /eroot/KEY/server.cert  
Certificate: 
    Data: 
        Version: 3 (0x2) 
        Serial Number: 2 (0x2) 
        Signature Algorithm: sha256WithRSAEncryption 
        Issuer: C = JP, ST = TOKYO, L = NAKANO-KU, O = Test Company Ltd., OU = IT Section 01, CN = RedHat8SV.xxxxx.com 
        Validity 
            Not Before: Nov  4 12:04:00 2019 GMT 
            Not After : Nov  3 12:04:00 2020 GMT 
        Subject: C = JP, ST = TOKYO, O = Test Company Ltd., OU = IT Section 01, CN = RedHat8SV.xxxxx.com 
        Subject Public Key Info: 
            Public Key Algorithm: rsaEncryption 
                RSA Public-Key: (2048 bit) 
                Modulus: 
                    00:a4:73:69:19:98:fc:13:3f:c7:2c:fb:1d:c8:40: 
                    7d:17:f2:75:22:e2:f8:8f:9b:fd:ff:c6:5b:e9:88: 
                    1c:ab:c7:3d:ff:49:0e:9e:67:c7:0e:e0:68:8c:b1: 
                    9e:56:0f:07:db:e8:50:d4:94:21:d5:6c:78:47:2f: 
                    ab:c3:32:08:83:fd:2d:bb:86:5d:2a:cb:b6:5d:ab: 
                    87:e5:4c:1e:08:09:86:83:22:e9:07:8b:ef:3f:ab: 
                    4a:c3:7a:1a:2b:59:d7:ee:40:95:31:09:0b:4f:63: 
                    bf:aa:0b:1f:0b:32:55:f0:e9:02:b8:95:5c:b3:cf: 
                    3e:3b:ef:8a:b0:9e:41:62:5f:1e:98:47:1c:11:4c: 
                    df:3f:bf:3c:dc:0d:91:f6:74:40:37:b6:4b:d9:ad: 
                    ef:8f:90:93:e3:31:ae:a5:19:83:9e:d7:94:52:37: 
                    c4:6a:ab:dc:6d:a3:c2:b1:41:f6:3c:6e:22:c2:8e: 
                    15:cf:bb:19:a2:b4:81:cf:8f:3f:89:cf:61:65:04: 
                    f5:79:cc:90:ab:af:5a:5f:8e:ee:14:17:99:3f:ad: 
                    9d:09:e9:28:85:3c:16:af:d7:d7:07:a4:1c:2a:07: 
                    79:9e:79:46:de:60:78:97:fb:65:3a:03:56:03:5e: 
                    5a:b9:29:f6:b2:fd:63:bd:13:97:4e:5e:70:4a:23: 
                    2c:b9 
                Exponent: 65537 (0x10001) 
        X509v3 extensions: 
            X509v3 Subject Alternative Name:  
                DNS:RedHat8SV.xxxxx.com 
    Signature Algorithm: sha256WithRSAEncryption 
         8d:79:64:a1:5b:a1:3d:3c:b3:75:b6:2e:f0:c3:0f:bd:00:f2: 
         cd:fc:87:46:45:c1:99:87:45:8b:59:ff:ee:36:e4:c2:b5:5b: 
         f3:71:54:d5:52:a8:73:58:2d:14:9d:4b:1b:f5:3e:22:b7:e5: 
         c3:fa:4c:ff:12:8d:9a:32:ca:35:1e:34:e4:c8:e6:9d:28:dc: 
         1b:22:02:8c:6b:ef:ce:65:04:3a:36:ea:72:42:f0:47:df:02: 
         bc:c6:08:4c:2d:94:b9:b6:56:e7:0f:c9:8f:a8:54:e5:f6:0c: 
         70:5f:52:fd:29:ac:42:6a:21:2a:af:67:ec:90:ad:ad:34:f8: 
         3c:e8:ca:0d:0c:f3:0b:34:92:eb:9a:2b:c1:ac:71:b2:ea:5f: 
         f0:ae:c3:6d:71:dc:ad:16:ca:e1:81:a0:90:45:6e:e3:28:c9: 
         6f:cc:51:bb:70:c4:43:b1:8e:90:f0:6a:df:69:af:f1:89:1d: 
         5b:37:7a:53:33:68:3a:a4:4a:7d:47:b2:38:61:23:c6:15:ba: 
         5e:83:2a:8f:94:5b:06:32:f4:1f:81:e3:32:5f:74:a6:e7:89: 
         5a:86:8e:d5:f5:94:8e:1b:c1:6c:00:a0:58:fb:92:a7:81:59: 
         c9:1e:da:c2:ad:cd:ac:08:d6:a0:74:e6:13:88:ce:cb:ab:ec: 
         43:aa:8b:20 

 

 

 

 

CSR、証明書、秘密鍵が一致しているかを確認する

CSR ファイル、サーバー証明書、秘密鍵が一致していると、「Modules」の値も一致します。

Modulus とは「公開鍵」「秘密鍵」を掛け算したもの(積)です。

2つの素数の積と言えます。

 

■サーバー側

■CA 側

 

 

■サーバー証明書のチェックサム

[root@RedHat8SV CA]# openssl x509 -noout -modulus -in /root/KEY/server.cert | openssl md5
(stdin)= c2695a46995fbde83280da02bcc49f33

 

 

■秘密鍵のチェックサム

[root@RedHat8SV CA]# openssl rsa -noout -modulus -in /root/KEY/server.private_key | openssl md5
(stdin)= c2695a46995fbde83280da02bcc49f33

 

 

■CSR ファイルのチェックサム

[root@RedHat8SV CA]# openssl req -noout -modulus -in /root/KEY/server.csr | openssl md5
(stdin)= c2695a46995fbde83280da02bcc49f33

 

 

■ハッシュを掛けない場合

[root@RedHat8SV CA]# openssl x509 -noout -modulus -in /root/KEY/server.cert 
Modulus=A473691998FC133FC72CFB1DC8407D17F27522E2F88F9BFDFFC65BE9881CABC73DFF490E9E67C70EE0688CB19E560F07DBE850D49421D56C78472FABC3320883FD2DBB865D2ACBB65DAB87E54C1E0809868322E9078BEF3FAB4AC37A1A2B59D7EE409531090B4F63BFAA0B1F0B3255F0E902B8955CB3CF3E3BEF8AB09E41625F1E98471C114CDF3FBF3CDC0D91F6744037B64BD9ADEF8F9093E331AEA519839ED7945237C46AABDC6DA3C2B141F63C6E22C28E15CFBB19A2B481CF8F3F89CF616504F579CC90ABAF5A5F8EEE1417993FAD9D09E928853C16AFD7D707A41C2A07799E7946DE607897FB653A0356035E5AB929F6B2FD63BD13974E5E704A232CB9 
[root@RedHat8SV CA]# openssl rsa -noout -modulus -in /root/KEY/server.private_key 
Modulus=A473691998FC133FC72CFB1DC8407D17F27522E2F88F9BFDFFC65BE9881CABC73DFF490E9E67C70EE0688CB19E560F07DBE850D49421D56C78472FABC3320883FD2DBB865D2ACBB65DAB87E54C1E0809868322E9078BEF3FAB4AC37A1A2B59D7EE409531090B4F63BFAA0B1F0B3255F0E902B8955CB3CF3E3BEF8AB09E41625F1E98471C114CDF3FBF3CDC0D91F6744037B64BD9ADEF8F9093E331AEA519839ED7945237C46AABDC6DA3C2B141F63C6E22C28E15CFBB19A2B481CF8F3F89CF616504F579CC90ABAF5A5F8EEE1417993FAD9D09E928853C16AFD7D707A41C2A07799E7946DE607897FB653A0356035E5AB929F6B2FD63BD13974E5E704A232CB9 
[root@RedHat8SV CA]# openssl req -noout -modulus -in /root/KEY/server.csr 
Modulus=A473691998FC133FC72CFB1DC8407D17F27522E2F88F9BFDFFC65BE9881CABC73DFF490E9E67C70EE0688CB19E560F07DBE850D49421D56C78472FABC3320883FD2DBB865D2ACBB65DAB87E54C1E0809868322E9078BEF3FAB4AC37A1A2B59D7EE409531090B4F63BFAA0B1F0B3255F0E902B8955CB3CF3E3BEF8AB09E41625F1E98471C114CDF3FBF3CDC0D91F6744037B64BD9ADEF8F9093E331AEA519839ED7945237C46AABDC6DA3C2B141F63C6E22C28E15CFBB19A2B481CF8F3F89CF616504F579CC90ABAF5A5F8EEE1417993FAD9D09E928853C16AFD7D707A41C2A07799E7946DE607897FB653A0356035E5AB929F6B2FD63BD13974E5E704A232CB9 
[root@RedHat8SV CA]#

 

 

 

 

 

httpd(Apache)の設定

次に httpd の設定をします。

 

httpd の自動起動、起動

初めに「httpd」の自動起動の設定をします。

 

■httpd の自動起動の設定

[root@RedHat8SV ~]# systemctl enable httpd.service
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RedHat8SV ~]#

 

 

 

■httpd の起動

httpd を起動します。

[root@RedHat8SV ~]# systemctl start httpd.service

 

 

 

■httpd の起動確認

httpd の起動確認をします。

[root@RedHat8SV ~]# systemctl status httpd.service 
 httpd.service - The Apache HTTP Server 
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) 
   Active: active (running) since Sat 2019-11-02 22:53:17 JST; 4s ago 
     Docs: man:httpd.service(8) 
 Main PID: 3289 (httpd) 
   Status: "Started, listening on: port 443, port 80" 
    Tasks: 213 (limit: 4933) 
   Memory: 25.8M 
   CGroup: /system.slice/httpd.service 
           tq3289 /usr/sbin/httpd -DFOREGROUND 
           tq3291 /usr/sbin/httpd -DFOREGROUND 
           tq3292 /usr/sbin/httpd -DFOREGROUND 
           tq3293 /usr/sbin/httpd -DFOREGROUND 
           mq3294 /usr/sbin/httpd -DFOREGROUND 
 
11月 02 22:53:16 RedHat8SV systemd[1]: Starting The Apache HTTP Server... 
11月 02 22:53:17 RedHat8SV httpd[3289]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name,> 
11月 02 22:53:17 RedHat8SV httpd[3289]: Server configured, listening on: port 443, port 80 
11月 02 22:53:17 RedHat8SV systemd[1]: Started The Apache HTTP Server. 
[root@RedHat8SV ~]#

 

 

 

/etc/httpd/conf/httpd.conf ファイルの編集

「/etc/httpd/conf/httpd.conf」ファイルを設定します。

特に以下の項目を設定します。

 

[root@RedHat8SV ~]# vi /etc/httpd/conf/httpd.conf

# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
#
#Listen 12.34.56.78:80
Listen 80 ← デフォルトの80番で問題ありません。

# If your host doesn't have a registered DNS name, enter its IP address here.
# You will have to access it by its address anyway, and this will make
# redirections work in a sensible way.
#
#ServerName www.example.com:80
ServerName redhat8sv.xxxxxx.com:80 ← サーバーの FQDN と合わせます。

# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/html" ← デフォルトの /var/www/html で問題ありません。

 

 

コンフィグファイルを編集したら httpd を再起動します。

 

■httpd の再起動

httpd を再起動します。

[root@RedHat8SV ~]# systemctl restart httpd.service

 

 

 

 

http で動作確認

80/TCP(http)で表示されるか動作確認します。

【AWS】【RedHat8】Apache で<span style=「自己署名証明書(オレオレ証明書)」を作成して HTTPS でアクセスできるように構築する手順" width="1002" height="760" class="alignnone size-full wp-image-13457" />

 

 

 

 

HTTPS通信をするためのコンフィグファイルの設定

HTTPS 通信をするためのコンフィルファイルの設定をします。

 

/etc/httpd/conf.d/ssl.conf ファイルの編集

mod_ssl パッケージをインストールするとデフォルトで「/etc/httpd/conf.d」ディレクトリ配下に「ssl.conf」ファイルが作成されます。

 

■サーバー側

 

■CA 側

 

 

 

■ssl.conf ファイルの場所

[root@RedHat8SV KEY]# cd /etc/httpd/conf.d/ 
[root@RedHat8SV conf.d]# ls 
README  autoindex.conf  ssl.conf  userdir.conf  welcome.conf 
[root@RedHat8SV conf.d]#

 

 

■ssl.conf ファイルの確認

[root@RedHat8SV conf.d]# cat ssl.conf ← デフォルトの ssl.conf の中身を見てみます。

 

~省略~

 

#  Server Certificate:
#  Point SSLCertificateFile at a PEM encoded certificate. If
#  the certificate is encrypted, then you will be prompted for a
#  pass phrase. Note that a kill -HUP will prompt again. A new
#  certificate can be generated using the genkey(1) command.
SSLCertificateFile /etc/pki/tls/certs/localhost.crt

 

#  Server Private Key:
#  If the key is not combined with the certificate, use this
#  directive to point at the key file. Keep in mind that if
#  you've both a RSA and a DSA private key you can configure
#  both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

 

#   Server Certificate Chain: 
#   Point SSLCertificateChainFile at a file containing the 
#   concatenation of PEM encoded CA certificates which form the 
#   certificate chain for the server certificate. Alternatively 
#   the referenced file can be the same as SSLCertificateFile 
#   when the CA certificates are directly appended to the server 
#   certificate for convenience. 
#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt

 

 

~省略~

 

 

[root@RedHat8SV conf.d]#

 

変更する箇所は以下の設定の部分のみです。

 

 

変更する前に、最初にバックアップを取ります。

[root@RedHat8SV conf.d]# cp -ip ssl.conf ~/backup/ssl.conf_20170715
[root@RedHat8SV conf.d]# vi ssl.conf

 

#  Server Certificate:
#  Point SSLCertificateFile at a PEM encoded certificate. If
#  the certificate is encrypted, then you will be prompted for a
#  pass phrase. Note that a kill -HUP will prompt again. A new
#  certificate can be generated using the genkey(1) command.
#SSLCertificateFile /etc/pki/tls/certs/localhost.crt ← デフォルトの行をコメントアウトします。
SSLCertificateFile /etc/httpd/conf/server.csr ← 上のデフォルトの行をコピーして CSR ファイルを指定します。

 

#  Server Private Key:
#  If the key is not combined with the certificate, use this
#  directive to point at the key file. Keep in mind that if
#  you've both a RSA and a DSA private key you can configure
#  both in parallel (to also allow the use of DSA ciphers, etc.)
#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key ← デフォルトの行をコメントアウトします。
SSLCertificateKeyFile /etc/httpd/conf/server.key ← 上のデフォルトの行をコピーして秘密鍵ファイルを指定します。

 

#   Server Certificate Chain: 
#   Point SSLCertificateChainFile at a file containing the 
#   concatenation of PEM encoded CA certificates which form the 
#   certificate chain for the server certificate. Alternatively 
#   the referenced file can be the same as SSLCertificateFile 
#   when the CA certificates are directly appended to the server 
#   certificate for convenience. 
#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt

SSLCertificateChainFile /etc/ssl/CA/ca.cert

 

 

「ssl.conf」の編集が完了したらコンフィグファイルの構文チェックをします。

 

■構文の確認

[root@RedHat8SV CA]# httpd -t
Syntax OK ← 構文的に問題がなければ「Syntax OK」が表示されます。

[root@RedHat8SV CA]#

 

 

問題なさそうです。

 

 

構文が問題ないことを確認後、httpd を再起動します。

■httpd の再起動

[root@RedHat8SV CA]# systemctl restart httpd.service
[root@RedHat8SV CA]#

 

 

■httpd のステータス確認

[root@RedHat8SV CA]# systemctl status httpd.service 
 httpd.service - The Apache HTTP Server 
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) 
   Active: active (running) since Mon 2019-11-04 14:22:39 JST; 6s ago 
     Docs: man:httpd.service(8) 
 Main PID: 2310 (httpd) 
   Status: "Started, listening on: port 443, port 80" 
    Tasks: 213 (limit: 4933) 
   Memory: 25.0M 
   CGroup: /system.slice/httpd.service 
           tq2310 /usr/sbin/httpd -DFOREGROUND 
           tq2312 /usr/sbin/httpd -DFOREGROUND 
           tq2313 /usr/sbin/httpd -DFOREGROUND 
           tq2314 /usr/sbin/httpd -DFOREGROUND 
           mq2315 /usr/sbin/httpd -DFOREGROUND 
 
11月 04 14:22:39 RedHat8SV systemd[1]: Stopped The Apache HTTP Server. 
11月 04 14:22:39 RedHat8SV systemd[1]: Starting The Apache HTTP Server... 
11月 04 14:22:39 RedHat8SV httpd[2310]: Server configured, listening on: port 443, port 80 
11月 04 14:22:39 RedHat8SV systemd[1]: Started The Apache HTTP Server. 
[root@RedHat8SV CA]#

 

※パスフレーズ付きの証明書を作成している場合、httpd を再起動するたびにパスフレーズの入力を求められます。

 

 

 

 

 

Google Chrome バージョン 78 の場合は Subject Alternative Name が必要

2019年11月現在の最新バージョン:Google Chrome バージョン 78

 

 

Subject Alternative Name がないと下図のようなエラーになります。

 

 

■san.ext ファイルを作成

[root@RedHat8SV CA]# vi /etc/ssl/CA/san.ext
subjectAltName=DNS:RedHat8SV.xxxxxx.com
[root@RedHat8SV CA]#

 

 

 

 

■認証局用(CA 用)の openssl.cnf(最終)

[root@RedHat8SV CA]# cat /etc/ssl/CA/openssl.cnf 

# OpenSSL example configuration file. 
# This is mostly being used for generation of certificate requests. 

 
# Note that you can include other files from the main configuration 
# file using the .include directive. 
#.include filename 
 
# This definition stops the following lines choking if HOME isn't 
# defined. 
HOME                    = . 
#RANDFILE               = $ENV::HOME/.rnd 
 
# Extra OBJECT IDENTIFIER info: 
#oid_file               = $ENV::HOME/.oid 
oid_section             = new_oids 
 
# To use this configuration file with the "-extfile" option of the 
# "openssl x509" utility, name here the section containing the 
# X.509v3 extensions to use: 
# extensions            = 
# (Alternatively, use a configuration file that has only 
# X.509v3 extensions in its main [= default] section.) 
 
# Load default TLS policy configuration 
 
openssl_conf = default_modules 
 
[ default_modules ] 
 
ssl_conf = ssl_module 
 
[ ssl_module ] 
 
system_default = crypto_policy 
 
[ crypto_policy ] 
 
.include /etc/crypto-policies/back-ends/opensslcnf.config 
 
[ new_oids ] 
 
# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. 
# Add a simple OID like this: 
# testoid1=1.2.3.4 
# Or use config file substitution like this: 
# testoid2=${testoid1}.5.6 
 
# Policies used by the TSA examples. 
tsa_policy1 = 1.2.3.4.1 
tsa_policy2 = 1.2.3.4.5.6 
tsa_policy3 = 1.2.3.4.5.7 
 
#################################################################### 
[ ca ] 
default_ca      = CA_default            # The default ca section 
 
#################################################################### 
[ CA_default ] 
 
#dir            = /etc/pki/CA           # Where everything is kept 
dir             = /etc/ssl/CA           # Where everything is kept 
certs           = $dir/certs            # Where the issued certs are kept 
crl_dir         = $dir/crl              # Where the issued crl are kept 
database        = $dir/index.txt        # database index file. 
#unique_subject = no                    # Set to 'no' to allow creation of 
                                        # several certs with same subject. 
new_certs_dir   = $dir/newcerts         # default place for new certs. 
 
certificate     = $dir/cacert.pem       # The CA certificate 
serial          = $dir/serial           # The current serial number 
crlnumber       = $dir/crlnumber        # the current crl number 
                                        # must be commented out to leave a V1 CRL 
crl             = $dir/crl.pem          # The current CRL 
private_key     = $dir/private/cakey.pem# The private key 
RANDFILE        = $dir/private/.rand    # private random number file 
 
x509_extensions = usr_cert              # The extensions to add to the cert 
 
# Comment out the following two lines for the "traditional" 
# (and highly broken) format. 
name_opt        = ca_default            # Subject Name options 
cert_opt        = ca_default            # Certificate field options 
 
# Extension copying option: use with caution. 
# copy_extensions = copy 
 
# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs 
# so this is commented out by default to leave a V1 CRL. 
# crlnumber must also be commented out to leave a V1 CRL. 
# crl_extensions        = crl_ext 
 
default_days    = 365                   # how long to certify for 
default_crl_days= 30                    # how long before next CRL 
default_md      = sha256                # use SHA-256 by default 
preserve        = no                    # keep passed DN ordering 
 
# A few difference way of specifying how similar the request should look 
# For type CA, the listed attributes must be the same, and the optional 
# and supplied fields are just that 🙂 
policy          = policy_match 
 
# For the CA policy 
[ policy_match ] 
countryName             = match 
stateOrProvinceName     = match 
organizationName        = match 
organizationalUnitName  = optional 
commonName              = supplied 
emailAddress            = optional 
 
# For the 'anything' policy 
# At this point in time, you must list all acceptable 'object' 
# types. 
[ policy_anything ] 
countryName             = optional 
stateOrProvinceName     = optional 
localityName            = optional 
organizationName        = optional 
organizationalUnitName  = optional 
commonName              = supplied 
emailAddress            = optional 
 
#################################################################### 
[ req ] 
default_bit            = 2048 
default_md              = sha256 
default_keyfile         = privkey.pem 
distinguished_name      = req_distinguished_name 
attributes              = req_attributes 
x509_extensions = v3_ca # The extensions to add to the self signed cert 
 
# Passwords for private keys if not present they will be prompted for 
# input_password = secret 
# output_password = secret 
 
# This sets a mask for permitted string types. There are several options. 
# default: PrintableString, T61String, BMPString. 
# pkix   : PrintableString, BMPString (PKIX recommendation before 2004) 
# utf8only: only UTF8Strings (PKIX recommendation after 2004). 
# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). 
# MASK:XXXX a literal mask value. 
# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. 
string_mask = utf8only 
 
# req_extensions = v3_req # The extensions to add to a certificate request 
 
[ req_distinguished_name ] 
countryName                     = Country Name (2 letter code) 
countryName_default             = XX 
countryName_min                 = 2 
countryName_max                 = 2 
 
stateOrProvinceName             = State or Province Name (full name) 
#stateOrProvinceName_default    = Default Province 
 
localityName                    = Locality Name (eg, city) 
localityName_default            = Default City 
 
0.organizationName              = Organization Name (eg, company) 
0.organizationName_default      = Default Company Ltd 
 
# we can do this but it is not needed normally 🙂 
#1.organizationName             = Second Organization Name (eg, company) 
#1.organizationName_default     = World Wide Web Pty Ltd 
 
organizationalUnitName          = Organizational Unit Name (eg, section) 
#organizationalUnitName_default = 
 
commonName                      = Common Name (eg, your name or your server\'s hostname) 
commonName_max                  = 64 
 
emailAddress                    = Email Address 
emailAddress_max                = 64 
 
# SET-ex3                       = SET extension number 3 
 
[ req_attributes ] 
challengePassword               = A challenge password 
challengePassword_min           = 4 
challengePassword_max           = 20 
 
unstructuredName                = An optional company name 
 
[ usr_cert ] 
 
# These extensions are added when 'ca' signs a request. 
 
# This goes against PKIX guidelines but some CAs do it and some software 
# requires this to avoid interpreting an end user certificate as a CA. 
 
basicConstraints=CA:FALSE 
 
# Here are some examples of the usage of nsCertType. If it is omitted 
# the certificate can be used for anything *except* object signing. 
 
# This is OK for an SSL server. 
# nsCertType                    = server 
 
# For an object signing certificate this would be used. 
# nsCertType = objsign 
 
# For normal client use this is typical 
# nsCertType = client, email 
 
# and for everything including object signing: 
# nsCertType = client, email, objsign 
 
# This is typical in keyUsage for a client certificate. 
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment 
 
# This will be displayed in Netscape's comment listbox. 
nsComment                       = "OpenSSL Generated Certificate" 
 
# PKIX recommendations harmless if included in all certificates. 
subjectKeyIdentifier=hash 
authorityKeyIdentifier=keyid,issuer 
 
# This stuff is for subjectAltName and issuerAltname. 
# Import the email address. 
# subjectAltName=email:copy 
# An alternative to produce certificates that aren't 
# deprecated according to PKIX. 
# subjectAltName=email:move 
 
# Copy subject details 
# issuerAltName=issuer:copy 
 
#nsCaRevocationUrl              = http://www.domain.dom/ca-crl.pem 
#nsBaseUrl 
#nsRevocationUrl 
#nsRenewalUrl 
#nsCaPolicyUrl 
#nsSslServerName 
 
# This is required for TSA certificates. 
# extendedKeyUsage = critical,timeStamping 
 
[ v3_req ] 
 
# Extensions to add to a certificate request 
 
basicConstraints = CA:FALSE 
keyUsage = nonRepudiation, digitalSignature, keyEncipherment 
 
subjectAltName = @alt_names ← 追加します。
 
[ v3_ca ] 
 
 
# Extensions for a typical CA 
 
 
# PKIX recommendation. 
 
subjectKeyIdentifier=hash 
 
authorityKeyIdentifier=keyid:always,issuer 
 
basicConstraints = critical,CA:true 
 
# Key usage: this is typical for a CA certificate. However since it will 
# prevent it being used as an test self-signed certificate it is best 
# left out by default. 
# keyUsage = cRLSign, keyCertSign 
 
# Some might want this also 
# nsCertType = sslCA, emailCA 
 
# Include email address in subject alt name: another PKIX recommendation 
# subjectAltName=email:copy 
# Copy issuer details 
# issuerAltName=issuer:copy 
 
# DER hex encoding of an extension: beware experts only! 
# obj=DER:02:03 
# Where 'obj' is a standard or added object 
# You can even override a supported extension: 
# basicConstraints= critical, DER:30:03:01:01:FF 
 
[ crl_ext ] 
 
# CRL extensions. 
# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. 
 
# issuerAltName=issuer:copy 
authorityKeyIdentifier=keyid:always 
 
[ proxy_cert_ext ] 
# These extensions should be added when creating a proxy certificate 
 
# This goes against PKIX guidelines but some CAs do it and some software 
# requires this to avoid interpreting an end user certificate as a CA. 
 
basicConstraints=CA:FALSE 
 
# Here are some examples of the usage of nsCertType. If it is omitted 
# the certificate can be used for anything *except* object signing. 
 
# This is OK for an SSL server. 
# nsCertType                    = server 
 
# For an object signing certificate this would be used. 
# nsCertType = objsign 
 
# For normal client use this is typical 
# nsCertType = client, email 
 
# and for everything including object signing: 
# nsCertType = client, email, objsign 
 
# This is typical in keyUsage for a client certificate. 
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment 
 
# This will be displayed in Netscape's comment listbox. 
nsComment                       = "OpenSSL Generated Certificate" 
 
# PKIX recommendations harmless if included in all certificates. 
subjectKeyIdentifier=hash 
authorityKeyIdentifier=keyid,issuer 
 
# This stuff is for subjectAltName and issuerAltname. 
# Import the email address. 
# subjectAltName=email:copy 
# An alternative to produce certificates that aren't 
# deprecated according to PKIX. 
# subjectAltName=email:move 
 
# Copy subject details 
# issuerAltName=issuer:copy 
 
#nsCaRevocationUrl              = http://www.domain.dom/ca-crl.pem 
#nsBaseUrl 
#nsRevocationUrl 
#nsRenewalUrl 
#nsCaPolicyUrl 
#nsSslServerName 
 
# This really needs to be in place for it to be a proxy certificate. 
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo 
 
#################################################################### 
[ tsa ] 
 
default_tsa = tsa_config1       # the default TSA section 
 
[ tsa_config1 ] 
 
# These are used by the TSA reply generation only. 
dir             = /etc/pki/CA           # TSA root directory 
serial          = $dir/tsaserial        # The current serial number (mandatory) 
crypto_device   = builtin               # OpenSSL engine to use for signing 
signer_cert     = $dir/tsacert.pem      # The TSA signing certificate 
                                        # (optional) 
certs           = $dir/cacert.pem       # Certificate chain to include in reply 
                                        # (optional) 
signer_key      = $dir/private/tsakey.pem # The TSA private key (optional) 
signer_digest  = sha256                 # Signing digest to use. (Optional) 
default_policy  = tsa_policy1           # Policy if request did not specify it 
                                        # (optional) 
other_policies  = tsa_policy2, tsa_policy3      # acceptable policies (optional) 
digests     = sha1, sha256, sha384, sha512  # Acceptable message digests (mandatory) 
accuracy        = secs:1, millisecs:500, microsecs:100  # (optional) 
clock_precision_digits  = 0     # number of digits after dot. (optional) 
ordering                = yes   # Is ordering defined for timestamps? 
                                # (optional, default: no) 
tsa_name                = yes   # Must the TSA name be included in the reply? 
                                # (optional, default: no) 
ess_cert_id_chain       = no    # Must the ESS cert id chain be included? 
                                # (optional, default: no) 
ess_cert_id_alg         = sha1  # algorithm to compute certificate 
                                # identifier (optional, default: sha1) 
[root@RedHat8SV CA]#

 

 

 

動作確認

最終的に下図のように保護された通信となりました。

 

 

 

 

 

【トラブルシューティング】ERR_CERT_COMMON_NAME_INVALID が表示された場合

下図のようにERR_CERT_COMMON_NAME_INVALIDが表示されてしまう場合です。

 

 

 

この記事でも Subject Alternative Name が原因と説明しています。

 

エラー: 「サブジェクトの代替名がありません」「NET::ERR_CERT_COMMON_NAME_INVALID」「この接続ではプライバシーが保護されません」

https://support.google.com/chrome/a/answer/7391219?hl=ja

 

 

 

 

 

【補足】httpd の再起動に失敗した場合の対応・調査手順

ここでは、SSL通信の設定をする中で起こり得るエラー集とその対応・調査手順を記載します。

エラーが発生しなければ一番いいのですが、どうしても複雑な作業を重ねるとエラーが出ることがあります。

そのエラー集を記載します。

 

httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

「Syntax OK」と表示されているので構文的には問題ないですが、FQDN(fully qualified domain name)で不整合があると言っています。

[root@RedHat8SV conf.d]# httpd -t
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
Syntax OK
[root@RedHat8SV conf.d]#

 

原因が FQDN の不整合ということで、対応方法としては、まず「/etc/hosts」ファイルに「IPアドレス」「ホスト名」を追記します。

[root@RedHat8SV sysconfig]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.11 RedHat8SV RedHat8SV.localdomain ← 追加しました。
[root@RedHat8SV sysconfig]#

 

再度構文のチェックをします。

[root@RedHat8SV sysconfig]# httpd -t
httpd: Could not reliably determine the server's fully qualified domain name, using RedHat8SV.localdomain for ServerName
Syntax OK
[root@RedHat8SV sysconfig]#

 

再度「httpd: Could not reliably determine the server's fully qualified domain name, using RedHat8SV.localdomain for ServerName」のメッセージが表示されましたが、この原因は「/etc/hosts」だけでなく「/etc/httpd/conf/httpd.conf」にも「ServerName」の設定がされていないからでした。

 

「/etc/httpd/conf/httpd.conf」も設定をします。

[root@RedHat8SV conf]# cp -ip httpd.conf ~/backup/httpd.conf_20170716
[root@RedHat8SV conf]# vi httpd.conf

# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If this is not set to valid DNS name for your host, server-generated
# redirections will not work. See also the UseCanonicalName directive.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
# You will have to access it by its address anyway, and this will make
# redirections work in a sensible way.
#
#ServerName www.example.com:80 ← デフォルトの設定はコメントアウトにしておきます。
ServerName RedHat8SV.localdomain:80 ← その下の行に ServerName の設定を追加します。

 

再度、構文チェックをします。

[root@RedHat8SV conf]# httpd -t
Syntax OK

今度は問題なさそうです。

 

 

 

 

Init: Unable to read server certificate from file ~ の場合

httpd の再起動に失敗した際のエラーです。

[root@RedHat8SV conf]# service httpd restart
httpd を停止中: [ OK ]
httpd を起動中: [失敗]

 

 

まずはログを確認してみます。

Apache(httpd)のログは「/var/log/httpd/error_log」に出力されています。

[root@RedHat8SV conf]# less /var/log/httpd/error_log

 

[Sun Jul 16 00:59:48 2017] [notice] caught SIGTERM, shutting down ← httpd を停止しています。
[Sun Jul 16 00:59:48 2017] [notice] SELinux policy enabled; httpd running as context unconfined_u:system_r:httpd_t:s0
[Sun Jul 16 00:59:48 2017] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Sun Jul 16 00:59:48 2017] [error] Init: Unable to read server certificate from file /etc/httpd/conf/server.csr ← server.csr からサーバー証明書が読めないと言っています。
[Sun Jul 16 00:59:48 2017] [error] SSL Library Error: 218529960 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Sun Jul 16 00:59:48 2017] [error] SSL Library Error: 218595386 error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error
[Sun Jul 16 00:59:51 2017] [notice] SELinux policy enabled; httpd running as context unconfined_u:system_r:httpd_t:s0
[Sun Jul 16 00:59:51 2017] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Sun Jul 16 00:59:51 2017] [error] Init: Unable to read server certificate from file /etc/httpd/conf/server.csr
[Sun Jul 16 00:59:51 2017] [error] SSL Library Error: 218529960 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Sun Jul 16 00:59:51 2017] [error] SSL Library Error: 218595386 error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error

 

「Init: Unable to read server certificate from file /etc/httpd/conf/server.csr」を翻訳すると「server.csr から“サーバー証明書”が読めない」と翻訳できます。

よくよくメッセージを確認すると「server.csr」となっています。

しかし本来はサーバー証明書(server.crt)を読み込む必要があります。

エラーの原因は「server.crt」ではなく「server.csr」になっていることでした。

サーバー証明書のファイル名とパスは「ssl.conf」で指定します。

 

「権限」「文字コード」「改行コード」が原因の場合

構文チェックでは問題ないですが、httpd の起動に失敗する場合で、「権限」「文字コード」「改行コード」でエラーになる場合があります。

[root@RedHat8SV conf]# less /var/log/httpd/error_log

[Sun Jul 16 00:59:48 2017] [notice] caught SIGTERM, shutting down 
[Sun Jul 16 00:59:48 2017] [notice] SELinux policy enabled; httpd running as context unconfined_u:system_r:httpd_t:s0
[Sun Jul 16 00:59:48 2017] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Sun Jul 16 00:59:48 2017] [error] Init: Unable to read server certificate from file /etc/httpd/conf/server.crt
[Sun Jul 16 00:59:48 2017] [error] SSL Library Error: 218529960 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Sun Jul 16 00:59:48 2017] [error] SSL Library Error: 218595386 error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error
[Sun Jul 16 00:59:51 2017] [notice] SELinux policy enabled; httpd running as context unconfined_u:system_r:httpd_t:s0
[Sun Jul 16 00:59:51 2017] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Sun Jul 16 00:59:51 2017] [error] Init: Unable to read server certificate from file /etc/httpd/conf/server.crt
[Sun Jul 16 00:59:51 2017] [error] SSL Library Error: 218529960 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Sun Jul 16 00:59:51 2017] [error] SSL Library Error: 218595386 error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error

 

 

権限を確認します。

[root@RedHat8SV conf]# ls -l
合計 64
-rw-r--r--. 1 root root 34452 7月 16 00:56 2017 httpd.conf
-rw-r--r--. 1 root root 13139 7月 12 22:33 2017 magic
-rw-r--r--. 1 root root 1338 7月 16 09:18 2017 server.crt
-rw-r--r--. 1 root root 1074 7月 16 09:15 2017 server.csr
-rw-r--r--. 1 root root 1743 7月 16 09:12 2017 server.key

権限周りは特に問題なさそうです。

※root 以外のアカウントに鍵の中身を見せないために 644 ではなく 600 の方がいいです。 

 

文字コードを確認します。

「file -i」コマンドで文字コードを確認できます。

[root@RedHat8SV conf]# file -i /etc/httpd/conf/server.crt
/etc/httpd/conf/server.crt: text/plain; charset=us-ascii ← us-ascii コードでした。ASCII コードなので間違ってはいません。

 

nkf コマンドがあれば、「文字コードの確認」「文字コードの変換」が可能です。

[root@RedHat8SV conf]# yum install nkf ← nkf コマンドをインストールします。
読み込んだプラグイン:fastestmirror
インストール処理の設定をしています
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package nkf.x86_64 1:2.0.8b-6.2.el6 will be インストール
--> 依存性解決を終了しました。

依存性を解決しました

========================================================================================================
パッケージ アーキテクチャ バージョン リポジトリー 容量
========================================================================================================
インストールしています:
nkf x86_64 1:2.0.8b-6.2.el6 base 110 k

トランザクションの要約
========================================================================================================
インストール 1 パッケージ

総ダウンロード容量: 110 k
インストール済み容量: 241 k
これでいいですか? [y/N]y ← y を入力します。
パッケージをダウンロードしています:
nkf-2.0.8b-6.2.el6.x86_64.rpm | 110 kB 00:00
rpm_check_debug を実行しています
トランザクションのテストを実行しています
トランザクションのテストを成功しました
トランザクションを実行しています
インストールしています : 1:nkf-2.0.8b-6.2.el6.x86_64 1/1
Verifying : 1:nkf-2.0.8b-6.2.el6.x86_64 1/1

インストール:
nkf.x86_64 1:2.0.8b-6.2.el6

完了しました!

 

nkf コマンドで証明書の「文字コード」「改行コード」を確認することができます。

[root@RedHat8SV conf]# nkf --guess /etc/httpd/conf/server.crt
ASCII (LF) ← 文字コードは ASCII で改行コードは LF なので問題ありません。 
[root@RedHat8SV conf]#

 

今回は、文字コードは「ASCII」で改行コードは「LF」だったので問題ないですが、仮に「SJIS(Shift JIS)」など他の文字コードの場合、 文字コードをUTF-8 に変換します。(Apache は UTF-8 を読み込めます。→ そもそもconfファイルに日本語が入ってなければ、「ASCII」として表示されます)

※ファイルをWindowsパソコン上で開いて保存したりすると文字コードが変わることがあります。

[root@RedHat8SV conf]# nkf -w8 --overwrite /etc/httpd/conf/server.crt ← utf-8 に変換します。
[root@RedHat8SV conf]# nkf --guess /etc/httpd/conf/server.crt ← 文字コードを確認します。
UTF-8 (LF)
[root@RedHat8SV conf]#

 

 

 

 

動作確認

設定上は「TLS 1.2」で通信をしていることになっていますが、実際に「TLS 1.2」で通信をしているのか動作確認をします。

 

openssl コマンドで確認

まずは「openssl」コマンドで通信を確認します。

[root@RedHat8SV ~]# openssl s_client -host RedHat8SV.xxxxx.com -port 443 -tls1_2 
CONNECTED(00000004) 
depth=1 C = JP, ST = TOKYO, L = NAKANO-KU, O = Test Company Ltd., OU = IT Section 01, CN = RedHat8SV.xxxxx.com 
verify error:num=19:self signed certificate in certificate chain 
--- 
Certificate chain 
 0 s:C = JP, ST = TOKYO, O = Test Company Ltd., OU = IT Section 01, CN = RedHat8SV.xxxxx.com 
   i:C = JP, ST = TOKYO, L = NAKANO-KU, O = Test Company Ltd., OU = IT Section 01, CN = RedHat8SV.xxxxx.com 
 1 s:C = JP, ST = TOKYO, L = NAKANO-KU, O = Test Company Ltd., OU = IT Section 01, CN = RedHat8SV.xxxxx.com 
   i:C = JP, ST = TOKYO, L = NAKANO-KU, O = Test Company Ltd., OU = IT Section 01, CN = RedHat8SV.xxxxx.com 
--- 
Server certificate 
-----BEGIN CERTIFICATE----- 
MIIDkzCCAnugAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBhDELMAkGA1UEBhMCSlAx 
DjAMBgNVBAgMBVRPS1lPMRIwEAYDVQQHDAlOQUtBTk8tS1UxGjAYBgNVBAoMEVRl 
c3QgQ29tcGFueSBMdGQuMRYwFAYDVQQLDA1JVCBTZWN0aW9uIDAxMR0wGwYDVQQD 
DBRSZWRIYXQ4U1YuYm94LWNtLmNvbTAeFw0xOTExMDQxMjA0MDBaFw0yMDExMDMx 
MjA0MDBaMHAxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVUT0tZTzEaMBgGA1UECgwR 
VGVzdCBDb21wYW55IEx0ZC4xFjAUBgNVBAsMDUlUIFNlY3Rpb24gMDExHTAbBgNV 
BAMMFFJlZEhhdDhTVi5ib3gtY20uY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A 
MIIBCgKCAQEApHNpGZj8Ez/HLPsdyEB9F/J1IuL4j5v9/8Zb6Ygcq8c9/0kOnmfH 
DuBojLGeVg8H2+hQ1JQh1Wx4Ry+rwzIIg/0tu4ZdKsu2XauH5UweCAmGgyLpB4vv 
P6tKw3oaK1nX7kCVMQkLT2O/qgsfCzJV8OkCuJVcs88+O++KsJ5BYl8emEccEUzf 
P7883A2R9nRAN7ZL2a3vj5CT4zGupRmDnteUUjfEaqvcbaPCsUH2PG4iwo4Vz7sZ 
orSBz48/ic9hZQT1ecyQq69aX47uFBeZP62dCekohTwWr9fXB6QcKgd5nnlG3mB4 
l/tlOgNWA15auSn2sv1jvROXTl5wSiMsuQIDAQABoyMwITAfBgNVHREEGDAWghRS 
ZWRIYXQ4U1YuYm94LWNtLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAjXlkoVuhPTyz 
dbYu8MMPvQDyzfyHRkXBmYdFi1n/7jbkwrVb83FU1VKoc1gtFJ1LG/U+Irflw/pM 
/xKNmjLKNR405MjmnSjcGyICjGvvzmUEOjbqckLwR98CvMYITC2UubZW5w/Jj6hU 
5fYMcF9S/SmsQmohKq9n7JCtrTT4POjKDQzzCzSS65orwaxxsupf8K7DbXHcrRbK 
4YGgkEVu4yjJb8xRu3DEQ7GOkPBq32mv8YkdWzd6UzNoOqRKfUeyOGEjxhW6XoMq 
j5RbBjL0H4HjMl90pueJWoaO1fWUjhvBbACgWPuSp4FZyR7awq3NrAjWoHTmE4jO 
y6vsQ6qLIA== 
-----END CERTIFICATE----- 
subject=C = JP, ST = TOKYO, O = Test Company Ltd., OU = IT Section 01, CN = RedHat8SV.xxxxx.com 
 
issuer=C = JP, ST = TOKYO, L = NAKANO-KU, O = Test Company Ltd., OU = IT Section 01, CN = RedHat8SV.xxxxx.com 
 
--- 
No client certificate CA names sent 
Peer signing digest: SHA256 
Peer signature type: RSA-PSS 
Server Temp Key: X25519, 253 bits 
--- 
SSL handshake has read 2532 bytes and written 324 bytes 
Verification error: self signed certificate in certificate chain 
--- 
New, TLSv1.2, Cipher is ECDHE-RSA-AES256-GCM-SHA384 
Server public key is 2048 bit 
Secure Renegotiation IS supported 
Compression: NONE 
Expansion: NONE 
No ALPN negotiated 
SSL-Session: 
    Protocol  : TLSv1.2 ← TLSv1.2 で通信していることが確認できます。 
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384 
    Session-ID: 8B565ABBC555D9AF2F001214CDA02208587D561ECB87B2010B2BF1E5D35E57E5 
    Session-ID-ctx: 
    Master-Key: C2BD970E2AA3FC36A2353C1C19128F422D0DA9C1C0D792AECCC4FF27103C51340966C5D5AEA5F225E23757D2F7062241 
    PSK identity: None 
    PSK identity hint: None 
    SRP username: None 
    TLS session ticket lifetime hint: 300 (seconds) 
    TLS session ticket: 
    0000 - 55 fb 60 50 2f b9 b7 33-a1 0c 12 40 30 e7 f4 8e   U.`P/..3...@0... 
    0010 - a3 3f 1f 22 34 9f d2 8b-18 3d 25 26 88 14 90 a3   .?."4....=%&.... 
    0020 - 80 be 6b 19 c1 84 d5 78-f3 db 9f 32 77 ad 66 ec   ..k....x...2w.f. 
    0030 - 58 0d 9f 43 a4 d7 db 3c-d3 12 89 69 9f 8d f7 e4   X..C...<...i.... 
    0040 - 2d a0 a4 d1 67 8d 1e 5c-8f 0c 9b b7 b2 8e 20 b4   -...g..\...... . 
    0050 - 64 b5 f4 bb 2a cf 91 93-85 5d 54 e9 bd d5 0d 3d   d...*....]T....= 
    0060 - be f8 4b 70 65 5f b2 c2-39 45 5e 05 b2 c2 6e 74   ..Kpe_..9E^...nt 
    0070 - 5e b3 21 5c 8c 25 32 ed-79 35 05 2d e1 6b c3 a1   ^.!\.%2.y5.-.k.. 
    0080 - 58 51 67 14 eb 81 00 0f-0f 9e 70 e7 21 09 b5 a2   XQg.......p.!... 
    0090 - 10 34 aa 51 cc 35 a0 53-8d 1e fc c5 4c b2 04 cc   .4.Q.5.S....L... 
    00a0 - 86 d2 03 e9 aa c9 47 c9-ce 0d de c8 4e fc 59 49   ......G.....N.YI 
    00b0 - 00 21 b7 ca f7 7a bf 60-39 b6 d7 63 4f 8b ec e4   .!...z.`9..cO... 
    00c0 - 47 eb 62 40 46 d7 e0 2c-35 87 a5 5c 11 d4 51 76   G.b@F..,5..\..Qv 
    00d0 - 47 41 da 6b 90 9e f9 1a-2f 22 36 86 df f4 a3 d2   GA.k..../"6..... 
 
    Start Time: 1573393104 
    Timeout   : 7200 (sec) 
    Verify return code: 19 (self signed certificate in certificate chain) 
    Extended master secret: yes 
--- 
 
HTTP/1.1 400 Bad Request 
Date: Sun, 10 Nov 2019 13:38:29 GMT 
Server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1 
Content-Length: 226 
Connection: close 
Content-Type: text/html; charset=iso-8859-1 

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body></html>
closed

[root@RedHat8SV ~]#

 

 

 

 

tcpdump で動作確認

tcpdumpでも「TLS 1.2」で通信していることを確認します。

[root@RedHat8SV ~]# tcpdump -nn port 443 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 
23:03:26.933494 IP 172.31.32.20.42456 > <グローバルIP>.443: Flags [S], seq 4044175662, win 26883, options [mss 8961,sackOK,TS val 3123738470 ecr 0,nop,wscale 7], length 0 
23:03:26.933729 IP <グローバルIP>.42456 > 172.31.32.20.443: Flags [S], seq 4044175662, win 26883, options [mss 1460,sackOK,TS val 3123738470 ecr 0,nop,wscale 7], length 0 
23:03:26.933740 IP 172.31.32.20.443 > <グローバルIP>.42456: Flags [S.], seq 934194410, ack 4044175663, win 26847, options [mss 8961,sackOK,TS val 3123738470 ecr 3123738470,nop,wscale 7], length 0 
23:03:26.933920 IP <グローバルIP>.443 > 172.31.32.20.42456: Flags [S.], seq 934194410, ack 4044175663, win 26847, options [mss 1460,sackOK,TS val 3123738470 ecr 3123738470,nop,wscale 7], length 0 
23:03:26.933931 IP 172.31.32.20.42456 > <グローバルIP>.443: Flags [.], ack 1, win 211, options [nop,nop,TS val 3123738471 ecr 3123738470], length 0 
23:03:26.934087 IP <グローバルIP>.42456 > 172.31.32.20.443: Flags [.], ack 1, win 211, options [nop,nop,TS val 3123738471 ecr 3123738470], length 0 
23:03:26.934125 IP 172.31.32.20.42456 > <グローバルIP>.443: Flags [P.], seq 1:232, ack 1, win 211, options [nop,nop,TS val 3123738471 ecr 3123738470], length 231 
23:03:26.934309 IP <グローバルIP>.42456 > 172.31.32.20.443: Flags [P.], seq 1:232, ack 1, win 211, options [nop,nop,TS val 3123738471 ecr 3123738470], length 231 
23:03:26.934324 IP 172.31.32.20.443 > <グローバルIP>.42456: Flags [.], ack 232, win 219, options [nop,nop,TS val 3123738471 ecr 3123738471], length 0 
23:03:26.934472 IP <グローバルIP>.443 > 172.31.32.20.42456: Flags [.], ack 232, win 219, options [nop,nop,TS val 3123738471 ecr 3123738471], length 0 
23:03:26.935477 IP 172.31.32.20.443 > <グローバルIP>.42456: Flags [P.], seq 1:2243, ack 232, win 219, options [nop,nop,TS val 3123738472 ecr 3123738471], length 2242 
23:03:26.935697 IP <グローバルIP>.443 > 172.31.32.20.42456: Flags [.], seq 1:1449, ack 232, win 219, options [nop,nop,TS val 3123738472 ecr 3123738471], length 1448 
23:03:26.935704 IP 172.31.32.20.42456 > <グローバルIP>.443: Flags [.], ack 1449, win 233, options [nop,nop,TS val 3123738472 ecr 3123738472], length 0 
23:03:26.935722 IP <グローバルIP>.443 > 172.31.32.20.42456: Flags [P.], seq 1449:2243, ack 232, win 219, options [nop,nop,TS val 3123738472 ecr 3123738471], length 794 
23:03:26.935724 IP 172.31.32.20.42456 > <グローバルIP>.443: Flags [.], ack 2243, win 256, options [nop,nop,TS val 3123738472 ecr 3123738472], length 0 
23:03:26.935862 IP <グローバルIP>.42456 > 172.31.32.20.443: Flags [.], ack 1449, win 233, options [nop,nop,TS val 3123738472 ecr 3123738472], length 0 
23:03:26.935885 IP <グローバルIP>.42456 > 172.31.32.20.443: Flags [.], ack 2243, win 256, options [nop,nop,TS val 3123738472 ecr 3123738472], length 0 
23:03:26.936453 IP 172.31.32.20.42456 > <グローバルIP>.443: Flags [P.], seq 232:325, ack 2243, win 256, options [nop,nop,TS val 3123738473 ecr 3123738472], length 93 
23:03:26.936621 IP <グローバルIP>.42456 > 172.31.32.20.443: Flags [P.], seq 232:325, ack 2243, win 256, options [nop,nop,TS val 3123738473 ecr 3123738472], length 93 
23:03:26.936868 IP 172.31.32.20.443 > <グローバルIP>.42456: Flags [P.], seq 2243:2533, ack 325, win 219, options [nop,nop,TS val 3123738473 ecr 3123738473], length 290 
23:03:26.937059 IP <グローバルIP>.443 > 172.31.32.20.42456: Flags [P.], seq 2243:2533, ack 325, win 219, options [nop,nop,TS val 3123738473 ecr 3123738473], length 290 
23:03:26.977652 IP 172.31.32.20.42456 > <グローバルIP>.443: Flags [.], ack 2533, win 278, options [nop,nop,TS val 3123738514 ecr 3123738473], length 0 
23:03:26.977857 IP <グローバルIP>.42456 > 172.31.32.20.443: Flags [.], ack 2533, win 278, options [nop,nop,TS val 3123738514 ecr 3123738473], length 0 
23:03:29.969553 IP 172.31.32.20.42456 > <グローバルIP>.443: Flags [F.], seq 325, ack 2533, win 278, options [nop,nop,TS val 3123741506 ecr 3123738473], length 0 
23:03:29.969717 IP <グローバルIP>.42456 > 172.31.32.20.443: Flags [F.], seq 325, ack 2533, win 278, options [nop,nop,TS val 3123741506 ecr 3123738473], length 0 
23:03:29.970051 IP 172.31.32.20.443 > <グローバルIP>.42456: Flags [P.], seq 2533:2564, ack 326, win 219, options [nop,nop,TS val 3123741507 ecr 3123741506], length 31 
23:03:29.970084 IP 172.31.32.20.443 > <グローバルIP>.42456: Flags [F.], seq 2564, ack 326, win 219, options [nop,nop,TS val 3123741507 ecr 3123741506], length 0 
23:03:29.970222 IP <グローバルIP>.443 > 172.31.32.20.42456: Flags [P.], seq 2533:2564, ack 326, win 219, options [nop,nop,TS val 3123741507 ecr 3123741506], length 31 
23:03:29.970238 IP 172.31.32.20.42456 > <グローバルIP>.443: Flags [R], seq 4044175988, win 0, length 0 
23:03:29.970258 IP <グローバルIP>.443 > 172.31.32.20.42456: Flags [F.], seq 2564, ack 326, win 219, options [nop,nop,TS val 3123741507 ecr 3123741506], length 0 
23:03:29.970264 IP 172.31.32.20.42456 > <グローバルIP>.443: Flags [R], seq 4044175988, win 0, length 0 
23:03:29.970406 IP <グローバルIP>.42456 > 172.31.32.20.443: Flags [R], seq 4044175988, win 0, length 0 
23:03:29.970428 IP <グローバルIP>.42456 > 172.31.32.20.443: Flags [R], seq 4044175988, win 0, length 0

 

コマンドラインだと SSL のバージョンが分からないのでファイルにキャプチャして「WireShark」でパケット解析をすることにします。

 

tcpdump でパケット解析をする方法は以下も参照してください。

 

以下のようにパケットをキャプチャしたデータをファイルに吐き出します。

[root@RedHat8SV ~]# tcpdump -i eth0 -w ssh_test.cap ← キャプチャしたデータを ssh_test.cap ファイルにダンプします。
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C125 packets captured
125 packets received by filter
0 packets dropped by kernel
[root@RedHat8SV ~]# ls -l ← ファイルを確認します。
合計 1784
-rw-------. 1 root root 1099 6月 15 21:07 2017 anaconda-ks.cfg
drwxr-xr-x. 2 root root 4096 7月 16 09:19 2017 backup
-rw-r--r--. 1 tcpdump tcpdump 32433 7月 16 21:36 2017 ssh_test.cap
[root@RedHat8SV ~]#

 

このデータをパソコンに転送して「WireShark」で表示します。

「TLSv1.2」で通信をしているログがあるので「TLS 1.2」で通信をしていることが分かります。

【Linux】【CentOS6】Apache で<span style=「自己

 

 

 

まとめ

Apache をインストールして、httpd の設定をデフォルト状態にして「オレオレ証明書」を作成して https アクセスをして表示させるだけなら簡単ですが、細かく暗号化の規格やどこがどう関連しているのか調べると、まだまだ難しく感じます。

SSL/TLS プロトコルは奥が深いです。というよりいろんな要素が関連しているので複雑です。

 

参考サイト

非常に勉強になりました。

オレオレ証明書をopensslで作る(詳細版)

 

SSL証明書・秘密鍵・CSRファイルのペア確認方法

 

 

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

AlphaOmega Captcha Medica  –  What Do You See?
     
 

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください