そういうのがいいブログ

SIerで働く30代サラリーマンSEがインフラエンジニアに憧れてLinux・クラウド・AWSの勉強をするブログ

CentOS8プライベート認証局(WEBサーバHTTPS化)【⑤WEBサーバ証明書作成】

※[PR]当ブログの記事の中にはプロモーションが含まれています。

・CentOS8でプライベート認証局を作って、LAN内のWEBサーバにHTTPSアクセスができるようにしたい。
・ネットで検索すると、新旧のいろいろな情報が出てきて、同じように真似してやってみたが上手くいかないので、最新の手順を詳しく知りたい。

こういった疑問に答えます。

本記事の内容

  1. CentOS8とOpenSSLでプライベート認証局(ルートCA)を作る方法
  2. CentOS8とOpenSSLで中間認証局を作る方法
  3. CentOS8のWEBサーバの証明書を作る方法
  4. CentOS8・ApacheのWEBサーバに証明書を設定してHTTPSアクセスを許可する方法

この記事を書いている私は、某SIerに勤務しながら、
WEB系エンジニア・インフラエンジニアに憧れて、プログラミングおよびインフラ技術の勉強をしています。

私が実機で試したコマンドや画像を載せて書いています。
記事の信頼性担保に繋がると思います。

前回の記事

前回の記事で、WEBサーバ上で署名要求CSRファイルを作成するところまで済ませました。

souiunogaii.hatenablog.com

①~⑦までをまとめて読みたい方は下記のまとめ記事から。

souiunogaii.hatenablog.com

WEBサーバの証明書の作成

confファイルの作成

cp /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl-sv-neptune.cnf

vi openssl-sv-neptune.cnf
[ CA_default ]

dir     = /etc/pki/interCA  # Where everything is kept

[ CA_default ] の部分を以下に変更します。

  • dir = /etc/pki/interCA # Where everything is kept ディレクトリを変更
[ 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=critical, 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
keyUsage = critical, digitalSignature

extendedKeyUsage = serverAuth, clientAuth

# 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
subjectAltName=@alt_names

[ alt_names ]
DNS.1 = *.sv-neptune.com
DNS.2 = sv-neptune.com
DNS.3 = *.sv-neptune.wp
DNS.4 = sv-neptune.wp
DNS.5 = *.sv-neptune.net
DNS.6 = sv-neptune.net
DNS.7 = *.sv-neptune.info
DNS.8 = sv-neptune.info
DNS.9 = *.sv-neptune.db
DNS.10 = sv-neptune.db
DNS.11 = *.sv-neptune.biz
DNS.12 = sv-neptune.biz
DNS.13 = *.sv-neptune.ac
DNS.14 = sv-neptune.ac

[ usr_cert ] の部分を以下に変更します。

  • basicConstraints=critical, CA:FALSE  変更
  • nsCertType = server 変更
  • keyUsage = critical, digitalSignature 変更
  • extendedKeyUsage = serverAuth, clientAuth 追記
  • subjectAltName=@alt_names 追記
  • [ alt_names ] 追記
  • DNS.1 = *.sv-neptune.com 追記
  • DNS.2 = sv-neptune.com 追記
  • 以下、登録したいDNS名を複数個、追記


1台のWEBサーバで、バーチャルホストで複数のドメインを運用している場合は、
「subjectAltName(サブジェクト代替名)」としてDNS名を複数登録することができます。

WEBサーバの署名要求ファイルを、認証局サーバにアップロード

中間CAの中にWEBサーバの証明書を入れるディレクトリを作成

mkdir /etc/pki/interCA/sv-neptune
[root@SV-EARTH interCA]# mkdir /etc/pki/interCA/sv-neptune

WEBサーバの署名要求CSRファイルをFTP認証局サーバにアップロード

/etc/pki/interCA/sv-neptune/newkey.pem
/etc/pki/interCA/sv-neptune/newreq.pem

serialファイルの作成

echo "0001" > /etc/pki/interCA/serial
[root@SV-EARTH interCA]# echo "0001" > /etc/pki/interCA/serial

index.txtファイルの作成

touch /etc/pki/interCA/index.txt
[root@SV-EARTH interCA]# touch /etc/pki/interCA/index.txt

中間CAがWEBサーバからの署名要求CSRファイルに署名し、サーバ証明書を作成

openssl ca -in /etc/pki/interCA/sv-neptune/newreq.pem \
-out /etc/pki/interCA/sv-neptune/newcert.pem \
-keyfile /etc/pki/interCA/private/interCA_key.pem \
-cert /etc/pki/interCA/interCA_cert.pem \
-config /etc/pki/tls/openssl-sv-neptune.cnf \
-policy policy_anything

オプションで「-policy policy_anything」をつけています。
これがないと、
「The organizationName field is different between
CA certificate (EARTH PLANET Inc.) and the request (NEPTUNE Inc.)」
というエラーが出てしまいます。

[root@SV-EARTH sv-neptune]# openssl ca -in /etc/pki/interCA/sv-neptune/newreq.pem \
> -out /etc/pki/interCA/sv-neptune/newcert.pem \
> -keyfile /etc/pki/interCA/private/interCA_key.pem \
> -cert /etc/pki/interCA/interCA_cert.pem \
> -config /etc/pki/tls/openssl-sv-neptune.cnf \
> -policy policy_anything
Using configuration from /etc/pki/tls/openssl-sv-neptune.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Sep 14 12:02:42 2020 GMT
            Not After : Sep 14 12:02:42 2021 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            localityName              = Shinagawa-ku
            organizationName          = MEPTUNE Inc.
            commonName                = *.sv-neptune.com
            emailAddress              = admin@sv-neptune.com
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:FALSE
            Netscape Cert Type:
                SSL Server
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage:
                TLS Web Server Authentication, TLS Web Client Authentication
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                DB:07:08:E8:F8:20:C9:9F:15:66:B0:D0:25:E6:4F:2F:AF:D7:D4:2E
            X509v3 Authority Key Identifier:
                keyid:51:01:1C:CF:0D:28:0F:6E:6B:5F:B7:00:A7:3B:A7:30:42:4E:D0:7E

            X509v3 Subject Alternative Name:
                DNS:*.sv-neptune.com, DNS:sv-neptune.com, DNS:*.sv-neptune.wp, DNS:sv-neptune.wp, DNS:*.sv-neptune.net, DNS:sv-neptune.net, DNS:*.sv-neptune.info, DNS:sv-neptune.info, DNS:*.sv-neptune.db, DNS:sv-neptune.db, DNS:*.sv-neptune.biz, DNS:sv-neptune.biz, DNS:*.sv-neptune.ac, DNS:sv-neptune.ac
Certificate is to be certified until Sep 14 12:02:42 2021 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

サーバ証明書newcert.pem が作成されました。

作成したサーバ証明書の内容の表示

openssl x509 -text < newcert.pem
[root@SV-EARTH sv-neptune]# openssl x509 -text < newcert.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = JP, ST = Tokyo, L = Shinagawa-ku, O = EARTH PLANET Inc., CN = EARTH PLANET Inter CA, emailAddress = interca@sv-earth.planet.jp
        Validity
            Not Before: Sep 14 12:02:42 2020 GMT
            Not After : Sep 14 12:02:42 2021 GMT
        Subject: C = JP, ST = Tokyo, L = Shinagawa-ku, O = MEPTUNE Inc., CN = *.sv-neptune.com, emailAddress = admin@sv-neptune.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:c3:30:26:81:68:b3:e9:cd:c0:82:2b:4e:78:52:
                    d3:a9:27:c4:fe:69:9d:00:38:bb:c0:a4:72:d0:92:
---------------------(中略)---------------------
                    15:43:1c:ab:ae:ae:b8:80:09:fc:80:4d:d8:ae:60:
                    1f:70:ca:59:2e:5e:73:b7:60:95:e2:ed:f3:a8:e7:
                    78:a7
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:FALSE
            Netscape Cert Type:
                SSL Server
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage:
                TLS Web Server Authentication, TLS Web Client Authentication
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                DB:07:08:E8:F8:20:C9:9F:15:66:B0:D0:25:E6:4F:2F:AF:D7:D4:2E
            X509v3 Authority Key Identifier:
                keyid:51:01:1C:CF:0D:28:0F:6E:6B:5F:B7:00:A7:3B:A7:30:42:4E:D0:7E

            X509v3 Subject Alternative Name:
                DNS:*.sv-neptune.com, DNS:sv-neptune.com, DNS:*.sv-neptune.wp, DNS:sv-neptune.wp, DNS:*.sv-neptune.net, DNS:sv-neptune.net, DNS:*.sv-neptune.info, DNS:sv-neptune.info, DNS:*.sv-neptune.db, DNS:sv-neptune.db, DNS:*.sv-neptune.biz, DNS:sv-neptune.biz, DNS:*.sv-neptune.ac, DNS:sv-neptune.ac
    Signature Algorithm: sha256WithRSAEncryption
         00:6d:59:7b:e9:47:a3:6e:99:0c:bb:2c:f4:a6:48:b8:d4:53:
         c1:df:97:58:8a:a1:d5:ac:44:41:e2:27:40:00:61:57:79:c2:
---------------------(中略)---------------------
         f9:96:b5:75:9a:ae:b6:7e:8d:7c:4b:1d:0b:8b:eb:1a:6f:2a:
         1f:f4:cd:57:52:5d:18:3c:e3:5c:48:95:08:0c:ac:87:28:ea:
         4d:6e:19:66
-----BEGIN CERTIFICATE-----
MIIFXzCCBEegAwIBAgIBATANBgkqhkiG9w0BAQsFADCBmzELMAkGA1UEBhMCSlAx
DjAMBgNVBAgMBVRva3lvMRUwEwYDVQQHDAxTaGluYWdhd2Eta3UxGjAYBgNVBAoM
---------------------(中略)---------------------
Ff6IwcAoEgoMIdNivLI/T8FS5r0SazocnEdzVGxkcEcS41SNIv1nvn29evmWtXWa
rrZ+jXxLHQuL6xpvKh/0zVdSXRg841xIlQgMrIco6k1uGWY=
-----END CERTIFICATE-----

X509v3 extensions: の部分に以下が入っていることを確認します。

  • X509v3 Subject Alternative Name:
  • DNS:*.sv-neptune.com, DNS:sv-neptune.com, ・・・・・・(以下省略)


この方法で、「Subject Alternative Name サブジェクト代替名」として複数の異なるドメインDNS名を1つのサーバ証明書に登録することができました。
1台のWEBサーバでバーチャルホストで複数ドメインを運用している場合に使えると思います。

WEBサーバの証明書に「Subject Alternative Name」のDNS名が入っていないと、
せっかく証明書を作っても、ブラウザ「Google Chrome」「Microsoft Edge」で表示するときに以下のエラーが出てしまいます。

  • このサーバーがxxxxxxxxであることを確認できませんでした。このサーバーのセキュリティ証明書でSAN(サブジェクトの別名)が指定されていません。設定が不適切であるか、悪意のあるユーザーによって接続が妨害されている可能性があります。

少し長くなったので、続きはまた次の記事に書きます。

souiunogaii.hatenablog.com