- 記事一覧 >
- ブログ記事
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(サブジェクトの別名)が指定されていません」を回避するために必要です。
# 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付近から表示されます。
SSLCertificateFile
とSSLCertificateKeyFile
を以下のように設定します。
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経由でやっていきます。
https://test.itccorporation.jp/
にアクセスし、「詳細情報」をクリックします。
「Web ページに移動(非推奨)」をクリックします。
URL欄のところの「証明書のエラー」を右クリックします。
「証明書の表示」をクリックします。
「証明書のインストール」をクリックします。
「次へ」をクリックします。
「証明書をすべて次のストアに配置する」にチェックを入れて、「参照」をクリックします。
「信頼されたルート証明機関」をクリックして、「OK」をクリックします。
「次へ」をクリックします。
「完了」をクリックします。
「はい」をクリックします。
「OK」をクリックします。
「OK」をクリックします。
一旦閉じて、https://test.itccorporation.jp/
にアクセスします。
⇒いきなりアクセスできます!
Chromeでも見てみます。
⇒いきなりアクセスできます!(Edge Chromiumでも同じです。)
Firefoxでも見てみます。
⇒エラーになりました...。
Firefoxの対応
Firefoxの場合、自己署名していることがバレて、以下のエラーになります。test.itccorporation.jp は不正なセキュリティ証明書を使用しています。
自己署名をしているためこの証明書は信頼されません。
エラーコード: MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT
このエラーは、設定で回避できます。
「設定」をクリックします。
「プライバシーとセキュリティ」をクリックします。
「証明書を表示」をクリックします。※スクロールして、下の方にあります。
「サーバー証明書」をクリックして、「例外を追加」をクリックします。
「URL:」のところに、https://test.itccorporation.jp/
を入力して「証明書を取得」をクリックします。
「セキュリティ例外を承認」をクリックします。※このとき、「次回以降もこの例外を有効にする」にチェックが入っていることを確認し、チェックが入っていなかったら、チェックします。
「OK」をクリックします。
もう一度、https://test.itccorporation.jp/
にアクセスします。
⇒いきなりアクセスできます!
できました!
自己署名証明書配置について
自己署名証明書配置のとき、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
その他、宣伝、誹謗中傷等、当方が不適切と判断した書き込みは、理由の如何を問わず、投稿者に断りなく削除します。
書き込み内容について、一切の責任を負いません。
このコメント機能は、予告無く廃止する可能性があります。ご了承ください。
コメントの削除をご依頼の場合はTwitterのDM等でご連絡ください。