1. 記事一覧 >
  2. ブログ記事
category logo

CentOS8 & Apacheの自己署名証明書作成と証明書エラー回避

(更新) (公開)

自己署名証明書(いわゆるオレオレ証明書)の作り方を正直、毎回毎回ググっています。
作り方、生成したkey等どこに置くのが正解かなと毎回迷うのですが、CentOS公式的な手順を見つけました。今回、備忘録的に証明書エラーを無くす方法まで通しで書こうと思います。
※参考手順から少し改良しています。


【 注意 】

こうしなければダメという事は無いです。環境が同一なら、誰でもhttpsサイトを立ち上げて、証明書エラー無しまで再現できるというのが今回の趣旨です。

本記事のApache2は、過去記事でインストールしたApache2を前提とします。


【検証環境】

Windows10 Pro 64bit

 IE11 20H2(OSビルド 19042.1165)

 Edge(Chromium) 93.0.961.38

 Chrome 93.0.4577.63

 Firefox 78.13.0esr

CentOS Linux release 8.3.2011

 Apache/2.4.37


自己署名証明書作成

今回作成するサイトは、192.168.12.10 test.itccorporation.jpとします。


Step1:mod_sslインストール

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

# dnf install mod_ssl
Is this ok [y/N]: y

Step2:自己署名証明書作成
出力内容も参考までに載せています。#で始まるところが入力するコマンドです。

【 注意 】

Country Name等聞かれるところは、基本適当で良いのですが、Common Name のところは、後の証明書エラー回避のところで重要ですので、ホスト名 or IPアドレスをちゃんと入力しないといけません。

san.txtのところは、オリジナルの手順に書いていませんが、Chromeの証明書エラー「このサーバーのセキュリティ証明書で SAN(サブジェクトの別名)が指定されていません」を回避するために必要です。

このサーバーのセキュリティ証明書で SAN(サブジェクトの別名)が指定されていません
# openssl genrsa -out ca.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
................................................................................................................................................+++++
.............................+++++
e is 65537 (0x010001)

# openssl req -new -key ca.key -out 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
State or Province Name (full name) []:Aichi
Locality Name (eg, city) [Default City]:Toyota
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:test.itccorporation.jp
Email Address []:

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

# echo "subjectAltName=DNS:*.itccorporation.jp,IP:192.168.12.10" > san.txt
# openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt -extfile san.txt
Signature ok
subject=C = JP, ST = Aichi, L = Toyota, O = Default Company Ltd, CN = test.itccorporation.jp
Getting Private key

Step3:自己署名証明書配置

# cp ca.crt /etc/pki/tls/certs
# cp ca.key /etc/pki/tls/private/ca.key
# cp ca.csr /etc/pki/tls/private/ca.csr


ここで、cpで配置するのが重要です。なぜかは、後述の「自己署名証明書配置について」を参照してください。


Apacheのconf設定

# vi +/SSLCertificateFile /etc/httpd/conf.d/ssl.conf

/etc/httpd/conf.d/ssl.confは、mod_sslインストール時に作成されます。

vi +/文字列 ファイル名は、文字列が最初に見つかった場所から表示という意味です。SSLCertificateFile付近から表示されます。

SSLCertificateFileSSLCertificateKeyFileを以下のように設定します。

SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key

再起動します。

# systemctl restart httpd

動作確認

https://test.itccorporation.jp/ にアクセスします。

証明書警告画面


SSL証明書が正式証明書では無いため、毎回警告画面が出ます。


以下は、それを無くす手順です。


証明書警告画面無しにする方法

自己署名証明書の場合、
IE11: このサイトは安全ではありません
Chrome: この接続ではプライバシーが保護されません
Firefox: 警告: 潜在的なセキュリティリスクあり
となります。
この画面を経由せずに、いきなりサイトにアクセスできるようにします。


証明書のインストール

IE11を「管理者として実行」で起動します。
※いろいろ方法は有りますが、今回、IE11経由でやっていきます。

IE11を「管理者として実行」で起動


https://test.itccorporation.jp/にアクセスし、「詳細情報」をクリックします。

「詳細情報」をクリック


「Web ページに移動(非推奨)」をクリックします。

「Web ページに移動(非推奨)」をクリック


URL欄のところの「証明書のエラー」を右クリックします。

「証明書のエラー」を右クリック


「証明書の表示」をクリックします。

「証明書の表示」をクリック


「証明書のインストール」をクリックします。

「証明書のインストール」をクリック


「次へ」をクリックします。

「次へ」をクリック


「証明書をすべて次のストアに配置する」にチェックを入れて、「参照」をクリックします。

「証明書をすべて次のストアに配置する」にチェックを入れて、「参照」をクリック


「信頼されたルート証明機関」をクリックして、「OK」をクリックします。

「信頼されたルート証明機関」をクリックして、「OK」をクリック


「次へ」をクリックします。

「次へ」をクリック


「完了」をクリックします。

「完了」をクリック


「はい」をクリックします。

「はい」をクリック


「OK」をクリックします。

「OK」をクリック


「OK」をクリックします。

「OK」をクリック


一旦閉じて、https://test.itccorporation.jp/にアクセスします。

IEでhttpsアクセス

⇒いきなりアクセスできます!


Chromeでも見てみます。

Chromeでhttpsアクセス

⇒いきなりアクセスできます!(Edge Chromiumでも同じです。)


Firefoxでも見てみます。

Firefoxでhttpsアクセス

⇒エラーになりました...。


Firefoxの対応

Firefoxの場合、自己署名していることがバレて、以下のエラーになります。
test.itccorporation.jp は不正なセキュリティ証明書を使用しています。
自己署名をしているためこの証明書は信頼されません。
エラーコード: MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT

Firefoxで自己署名をしているためこの証明書は信頼されません。


このエラーは、設定で回避できます。


「設定」をクリックします。

Firefox 「設定」をクリック


「プライバシーとセキュリティ」をクリックします。

Firefox 「プライバシーとセキュリティ」をクリック


「証明書を表示」をクリックします。※スクロールして、下の方にあります。

Firefox 「証明書を表示」をクリック


「サーバー証明書」をクリックして、「例外を追加」をクリックします。

Firefox 「サーバー証明書」をクリックして、「例外を追加」をクリック


「URL:」のところに、https://test.itccorporation.jp/を入力して「証明書を取得」をクリックします。

Firefox 「証明書を取得」をクリック


「セキュリティ例外を承認」をクリックします。※このとき、「次回以降もこの例外を有効にする」にチェックが入っていることを確認し、チェックが入っていなかったら、チェックします。

Firefox 「セキュリティ例外を承認」をクリック


「OK」をクリックします。

Firefox 「OK」をクリック


もう一度、https://test.itccorporation.jp/にアクセスします。

Firefox もう一度httpsアクセス


⇒いきなりアクセスできます!


できました!


自己署名証明書配置について

自己署名証明書配置のとき、cpで配置します。

# cp ca.crt /etc/pki/tls/certs
# cp ca.key /etc/pki/tls/private/ca.key
# cp ca.csr /etc/pki/tls/private/ca.csr

SELinuxが有効な場合、mvで配置すると、追加でrestorecon -RvF /etc/pkiが必要になりす。


mvで配置した場合:

# mv ca.crt /etc/pki/tls/certs
# mv ca.key /etc/pki/tls/private/ca.key
# mv ca.csr /etc/pki/tls/private/ca.csr
# ls -Z /etc/pki/tls/certs/ca.crt
unconfined_u:object_r:admin_home_t:s0 /etc/pki/tls/certs/ca.crt
# ls -Z /etc/pki/tls/private/ca.key
unconfined_u:object_r:admin_home_t:s0 /etc/pki/tls/private/ca.key
# ls -Z /etc/pki/tls/private/ca.csr
unconfined_u:object_r:admin_home_t:s0 /etc/pki/tls/private/ca.csr

そのままapacheの設定をして起動すると、以下のようになり、起動に失敗します。

# systemctl restart httpd
Job for httpd.service failed because the control process exited with error code.
See "systemctl status httpd.service" and "journalctl -xe" for details.
# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/httpd.service.d
           mqphp-fpm.conf
   Active: failed (Result: exit-code) since Sun 2021-09-05 16:48:38 JST; 25s ago
     Docs: man:httpd.service(8)
  Process: 28820 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
 Main PID: 28820 (code=exited, status=1/FAILURE)
   Status: "Reading configuration..."

Sep 05 16:48:38 centos8.itccorporation.jp systemd[1]: Starting The Apache HTTP Server...
Sep 05 16:48:38 centos8.itccorporation.jp httpd[28820]: AH00526: Syntax error on line 85 of /etc/httpd/conf.d/ssl.conf:
Sep 05 16:48:38 centos8.itccorporation.jp httpd[28820]: SSLCertificateFile: file '/etc/pki/tls/certs/ca.crt' does not exist or is empty
Sep 05 16:48:38 centos8.itccorporation.jp systemd[1]: httpd.service: Main process exited, code=exited, status=1/FAILURE
Sep 05 16:48:38 centos8.itccorporation.jp systemd[1]: httpd.service: Failed with result 'exit-code'.
Sep 05 16:48:38 centos8.itccorporation.jp systemd[1]: Failed to start The Apache HTTP Server.
# tail /var/log/messages
Sep  5 16:50:21 centos8 systemd[1]: Failed to start The Apache HTTP Server.
Sep  5 16:50:21 centos8 dbus-daemon[944]: [system] Activating service name='org.fedoraproject.Setroubleshootd' requested by ':1.251' (uid=0 pid=892 comm="/usr/sbin/sedispatch " label="system_u:system_r:auditd_t:s0") (using servicehelper)
Sep  5 16:50:21 centos8 dbus-daemon[28886]: [system] Failed to reset fd limit before activating service: org.freedesktop.DBus.Error.AccessDenied: Failed to restore old fd limit: Operation not permitted
Sep  5 16:50:22 centos8 dbus-daemon[944]: [system] Successfully activated service 'org.fedoraproject.Setroubleshootd'
Sep  5 16:50:22 centos8 setroubleshoot[28886]: failed to retrieve rpm info for /etc/pki/tls/certs/ca.crt
Sep  5 16:50:22 centos8 dbus-daemon[944]: [system] Activating service name='org.fedoraproject.SetroubleshootPrivileged' requested by ':1.264' (uid=991 pid=28886 comm="/usr/libexec/platform-python -Es /usr/sbin/setroub" label="system_u:system_r:setroubleshootd_t:s0-s0:c0.c1023") (using servicehelper)
Sep  5 16:50:22 centos8 dbus-daemon[28899]: [system] Failed to reset fd limit before activating service: org.freedesktop.DBus.Error.AccessDenied: Failed to restore old fd limit: Operation not permitted
Sep  5 16:50:22 centos8 dbus-daemon[944]: [system] Successfully activated service 'org.fedoraproject.SetroubleshootPrivileged'
Sep  5 16:50:23 centos8 setroubleshoot[28886]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /etc/pki/tls/certs/ca.crt. For complete SELinux messages run: sealert -l 2e7222a1-c899-4f0e-b942-a578bee1ecef
Sep  5 16:50:23 centos8 setroubleshoot[28886]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /etc/pki/tls/certs/ca.crt.#012#012*****  Plugin restorecon (99.5 confidence) suggests   ************************#012#012If you want to fix the label. #012/etc/pki/tls/certs/ca.crt default label should be cert_t.#012Then you can run restorecon. The access attempt may have been stopped due to insufficient permissions to access a parent directory in which case try to change the following command accordingly.#012Do#012# /sbin/restorecon -v /etc/pki/tls/certs/ca.crt#012#012*****  Plugin catchall (1.49 confidence) suggests   **************************#012#012If you believe that httpd should be allowed getattr access on the ca.crt file by default.#012Then you should report this as a bug.#012You can generate a local policy module to allow this access.#012Do#012allow this access for now by executing:#012# ausearch -c 'httpd' --raw | audit2allow -M my-httpd#012# semodule -X 300 -i my-httpd.pp#012

restorecon -RvF /etc/pkiを実行すると起動できます。

# restorecon -RvF /etc/pki
Relabeled /etc/pki/tls/certs/ca.crt from unconfined_u:object_r:admin_home_t:s0 to system_u:object_r:cert_t:s0
Relabeled /etc/pki/tls/private/ca.key from unconfined_u:object_r:admin_home_t:s0 to system_u:object_r:cert_t:s0
Relabeled /etc/pki/tls/private/ca.csr from unconfined_u:object_r:admin_home_t:s0 to system_u:object_r:cert_t:s0
# ls -Z /etc/pki/tls/certs/ca.crt
system_u:object_r:cert_t:s0 /etc/pki/tls/certs/ca.crt
# ls -Z /etc/pki/tls/private/ca.key
system_u:object_r:cert_t:s0 /etc/pki/tls/private/ca.key
# ls -Z /etc/pki/tls/private/ca.csr
system_u:object_r:cert_t:s0 /etc/pki/tls/private/ca.csr
# systemctl restart httpd
loading...