・CentOS8でプライベート認証局を作って、LAN内のWEBサーバにHTTPSアクセスができるようにしたい。
・ネットで検索すると、新旧のいろいろな情報が出てきて、同じように真似してやってみたが上手くいかないので、最新の手順を詳しく知りたい。
こういった疑問に答えます。
本記事の内容
- CentOS8とOpenSSLでプライベート認証局(ルートCA)を作る方法
- CentOS8とOpenSSLで中間認証局を作る方法
- CentOS8のWEBサーバの証明書を作る方法
- CentOS8・ApacheのWEBサーバに証明書を設定してHTTPSアクセスを許可する方法
この記事を書いている私は、某SIerに勤務しながら、
WEB系エンジニア・インフラエンジニアに憧れて、プログラミングおよびインフラ技術の勉強をしています。
私が実機で試したコマンドや画像を載せて書いています。
記事の信頼性担保に繋がると思います。
前回の記事
前回の記事で、WEBサーバ上で署名要求CSRファイルを作成するところまで済ませました。
①~⑦までをまとめて読みたい方は下記のまとめ記事から。
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(サブジェクトの別名)が指定されていません。設定が不適切であるか、悪意のあるユーザーによって接続が妨害されている可能性があります。
少し長くなったので、続きはまた次の記事に書きます。