EC2上に自己CA局を作成し、そこからSSL証明書を作成していきます。
有料でAWSのACMを使ってプライベートCAを作成することもできますが、今回は無料でできるEC2インスタンス上にCAを作成する方法で実施します。
構成イメージ
WEBサーバでCSRを作成し、CAサーバでCSRをもとにサーバ証明書(SSL証明書)を作成します。
※今回は中間証明書を作成せずに、ルート証明書(CA側のSSL証明書)とサーバ証明書(WEBサーバ側のSSL証明書)のみを作成しています。

手順の流れ
【前提】
・WEBサーバ
- apacheのインストール (テストページが表示される状態)
- mod_sslのインストール
- opensslのインストール
・CAサーバ
- opensslのインストール
以下の流れで実装します。
1.【CAサーバ】自己CA局の作成
2.【WEBサーバ】CSR作成
3.【CAサーバ】CSRからSSL証明書作成
4.【WEBサーバ】ssl.conf設定変更
5.【クライアント】接続確認
1.【CAサーバ】自己CA局の作成
CAサーバにCA局を作成していきます。
まずは作業ディレクトリを作成。
# mkdir /root/ca
CA用の秘密鍵を作成。
# openssl genrsa 2048 > /root/ca/privatekey_ca Generating RSA private key, 2048 bit long modulus (2 primes) ...................................+++++ ......+++++ e is 65537 (0x010001)
作成した秘密鍵を使ってCA用のCSRを作成します。
※以下、赤字箇所を入力しています。(「PRIVATE-SERVER1」は自ホスト名です。)
# openssl req -new -key /root/ca/privatekey_ca -out /root/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 State or Province Name (full name) []:TOKYO Locality Name (eg, city) [Default City]:MINATO-ku Organization Name (eg, company) [Default Company Ltd]:shimmy company Organizational Unit Name (eg, section) []:it Common Name (eg, your name or your server's hostname) []:PRIVATE-SERVER1 Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
CSRからCA用のSSL証明書を作成します。
# openssl x509 -in /root/ca/ca.csr -days 3650 -req -signkey /root/ca/privatekey_ca -out /root/ca/ca.cert Signature ok subject=C = JP, ST = TOKYO, L = MINATO-ku, O = shimmy company, OU = it, CN = PRIVATE-SERVER1 Getting Private key
作成したSSL証明書の中身を確認するとCSR作成時に指定した情報が記載してあります。
# openssl x509 -text -noout -in /root/ca/ca.cert Certificate: Data: Version: 1 (0x0) Serial Number: 06:6b:51:33:be:39:de:f5:ef:66:b3:2d:7f:2e:cd:0c:55:14:68:cb Signature Algorithm: sha256WithRSAEncryption Issuer: C = JP, ST = TOKYO, L = MINATO-ku, O = shimmy company, OU = it, CN = PRIVATE-SERVER1 Validity Not Before: May 4 13:41:59 2023 GMT Not After : May 1 13:41:59 2033 GMT Subject: C = JP, ST = TOKYO, L = MINATO-ku, O = shimmy company, OU = it, CN = PRIVATE-SERVER1 Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (2048 bit) Modulus: 00:b6:c1:9b:56:de:d4:23:b8:83:da:34:eb:85:67: 7f:84:f8:92:6a:70:6a:f2:a4:8d:48:a4:78:31:f9: 34:29:ed:6d:f7:d5:95:12:7d:60:a1:f7:f9:e4:34: 9f:62:61:7a:2d:56:25:68:e4:11:e1:0d:52:4a:97: b1:ef:b5:c4:90:de:0b:cc:09:9d:64:2c:99:e9:c2: 2c:68:bd:49:9d:40:99:d6:10:c1:c7:82:49:e2:d0: 50:12:6f:c9:b1:9b:75:31:e8:4a:e6:da:c5:87:a5: 60:10:9f:8b:13:6c:cc:76:27:fa:27:3d:69:ab:e6: 90:13:57:25:bd:00:a7:1e:38:56:e7:19:78:cb:ab: ca:2c:d5:cf:8e:19:31:d3:81:50:e2:c9:cc:22:57: 67:9b:5b:04:fe:9f:82:2e:bc:40:84:e2:74:28:0a: d2:60:af:d1:48:72:60:55:31:dc:a1:29:51:6b:f9: 80:10:6e:dd:dd:45:48:59:8c:9a:fc:43:9b:10:05: 6e:f4:07:38:13:12:69:d2:35:2c:6b:b8:13:65:fd: d2:3c:6a:d9:d3:3b:15:9c:4d:5d:4a:08:9f:83:48: 99:38:31:6a:6c:15:cd:9c:e8:69:bb:32:cb:4c:fa: 31:a1:d9:f0:d6:23:25:df:a2:eb:e8:06:94:2a:f3: 60:a9 Exponent: 65537 (0x10001) Signature Algorithm: sha256WithRSAEncryption b4:ca:00:50:f7:f6:36:ea:96:18:a7:5f:79:6f:ae:33:a7:16: 70:dd:61:e3:1e:0d:dd:ce:13:06:c6:fd:dd:7b:0b:b8:7b:97: 86:c9:67:df:c7:89:f6:b8:30:19:d7:ef:22:42:8c:68:a9:d7: f8:37:25:47:c7:b5:8b:d9:26:6d:c2:34:ba:ae:8f:6c:71:6f: 9f:72:93:b7:02:4b:e4:7b:a1:15:3b:1b:fd:b9:0d:b3:e3:83: 8f:ec:ec:4a:23:63:31:3c:5b:87:04:ff:94:77:ab:d3:a0:7d: 68:54:16:03:26:ae:45:12:10:30:36:9e:d1:76:86:ee:2c:1f: 9f:e6:a9:a2:a2:82:d0:92:5a:3c:b9:31:a5:c3:b6:7d:b0:88: 47:ae:58:2c:6b:fe:98:a9:db:00:cf:6a:43:cd:c9:4d:50:19: e4:c3:86:f9:b6:c4:ef:8e:ef:ef:08:99:1b:8a:d4:f1:29:54: 21:3a:4d:a5:fa:e6:47:c5:1b:ed:d0:f0:0b:59:fb:ad:c3:a0: 24:e1:dd:4d:be:ca:50:18:ba:67:98:ed:10:dc:64:62:46:ef: 54:a7:12:29:0a:bf:34:1a:55:b3:49:55:de:20:d5:ad:44:5e: d6:dc:cf:28:76:84:84:78:4a:4d:f8:a8:c0:6d:72:bc:ba:77: e9:3f:41:76
CA 用のconfigファイルの定義変更のためデフォルト定義ファイルをコピーしてきます。
# cp -p /etc/pki/tls/openssl.cnf /root/ca/openssl.cnf
以下の通りディレクトリ先を(今回作成したものに)変更する。
[ CA_default ]
dir = /etc/pki/CA # Where everything is kept
↓変更
dir = /root/ca # Where everything is kept
作成したSSL証明書の出力先ディレクトリを作成しておきます。
# mkdir /root/ca/newcerts
インデックスファイル(空ファイル)を作成します。
※CA側でWEBサーバのSSL証明書作成後にインデックスがファイルに書き込まれます。
# touch /root/ca/index.txt
シリアルファイルを作成します。
# echo 00 > /root/ca/serial
subjectAltNameを指定するためのファイルを作成します。
# vi /root/ca/subjectAltName
subjectAltName=DNS:accountA-server
2.【WEBサーバ】CSR作成
WEBサーバ側でCSRを作成してきます。
まずは作業ディレクトリを作成。
# mkdir /root/web
WEBサーバ用の秘密鍵を作成。
# openssl genrsa -out /root/web/privatekey_webserver 2048 Generating RSA private key, 2048 bit long modulus (2 primes) .......................................................................................................................................................................................................................................................................+++++ .....................................................+++++ e is 65537 (0x010001)
作成した秘密鍵を使ってWEBサーバ用のCSRを作成します。
※以下、赤字箇所を入力しています。(「accountA-server」は自ホスト名です。)
# openssl req -new -key /root/web/privatekey_webserver -out /root/web/webserver.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) []:TOKYO Locality Name (eg, city) [Default City]:MINATO-ku Organization Name (eg, company) [Default Company Ltd]:shimmy company Organizational Unit Name (eg, section) []:it Common Name (eg, your name or your server's hostname) []:accountA-server Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
作成したCSRの中身を確認すると作成時に指定した情報が記載してあります
# openssl req -text < /root/web/webserver.csr Certificate Request: Data: Version: 1 (0x0) Subject: C = JP, ST = TOKYO, L = MINATO-ku, O = shimmy company, OU = it, CN = accountA-server Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (2048 bit) Modulus: 00:de:ed:e4:a4:9f:00:f0:35:1a:5a:cd:94:b8:6f: 71:c1:7e:03:f2:c7:31:2d:30:56:6f:64:99:e8:9e: 60:f8:f1:db:24:e0:8b:53:9e:12:58:26:2b:b4:a5: 5f:fa:e7:ea:c1:01:60:8f:16:4d:24:eb:37:eb:a8: 03:c5:0f:0f:ee:90:c1:ad:7c:f4:13:02:40:ce:cb: a1:ad:c3:6d:45:64:87:cd:77:fe:81:23:a7:5c:2f: 4a:ba:ca:73:09:4b:84:3f:96:67:ad:d0:5c:3d:7a: 86:8d:4c:cb:10:d5:72:40:eb:3a:f9:09:37:87:13: 28:72:e1:17:ac:9c:73:02:59:c5:e2:60:b7:48:b8: 42:1b:14:7e:98:cd:c1:1c:e9:16:bb:b5:58:e0:ef: 22:b7:93:48:53:2f:87:60:21:4a:f2:6a:95:53:6d: 2a:4f:2d:cc:cd:85:88:e6:8c:32:ed:f8:fa:d4:92: 16:81:3d:32:2b:8f:55:a3:b4:d0:43:9f:5f:be:44: 91:6a:4d:e0:f8:ba:16:b7:77:bd:d5:d9:d9:e4:ea: c8:c2:29:04:41:9f:74:ec:3b:d4:3c:79:85:28:42: 4a:10:98:97:7b:1c:b4:83:4c:30:53:da:c9:77:e7: 17:ab:87:99:83:69:6f:33:c6:b3:6a:93:13:16:8a: 4d:47 Exponent: 65537 (0x10001) Attributes: a0:00 Signature Algorithm: sha256WithRSAEncryption 60:a0:41:27:5c:af:ee:13:8f:3b:3f:59:1e:99:78:7c:d2:6e: 5c:4a:2e:d5:29:dd:e6:40:10:22:01:81:40:e3:d6:7a:2e:a1: 80:df:02:17:cb:72:83:89:82:60:10:9f:34:e1:43:d4:8b:e6: f8:3d:3a:1c:7a:00:dd:43:74:ea:9c:3d:4a:8c:60:89:be:f2: 1b:cb:6e:73:f3:96:25:61:79:8d:87:67:48:b0:bf:e4:b3:3e: 0e:a6:f2:de:26:e5:ce:a6:24:a7:a1:3b:fd:18:76:6c:a1:3d: 0f:c1:48:f7:bb:06:62:1e:2b:85:f8:d3:cd:7f:a2:63:44:c6: b9:7c:2c:d2:54:7c:49:6a:39:2c:87:b4:9d:1f:20:89:6f:45: d3:6c:01:40:08:cb:4f:dc:1b:cd:82:21:6f:24:f6:ce:c3:2d: e6:4b:94:38:2c:a5:3e:c2:98:cb:28:92:01:73:60:b9:20:9c: f9:6a:91:8b:5d:86:33:e1:2b:da:04:e6:3d:9a:2a:ee:1e:be: d3:88:21:83:69:54:8e:3d:0a:8f:79:e0:94:b1:9a:0f:81:d4: 6f:85:1d:22:c9:dc:a0:21:b3:12:01:f9:ac:4f:61:ad:17:94: 86:6c:54:43:f3:4c:ef:7b:d7:2f:ae:b5:62:01:06:5b:ca:d0: e1:45:23:60 -----BEGIN CERTIFICATE REQUEST----- MIICtjCCAZ4CAQAwcTELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRPS1lPMRIwEAYD VQQHDAlNSU5BVE8ta3UxFzAVBgNVBAoMDnNoaW1teSBjb21wYW55MQswCQYDVQQL DAJpdDEYMBYGA1UEAwwPYWNjb3VudEEtc2VydmVyMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA3u3kpJ8A8DUaWs2UuG9xwX4D8scxLTBWb2SZ6J5g+PHb JOCLU54SWCYrtKVf+ufqwQFgjxZNJOs366gDxQ8P7pDBrXz0EwJAzsuhrcNtRWSH zXf+gSOnXC9KuspzCUuEP5ZnrdBcPXqGjUzLENVyQOs6+Qk3hxMocuEXrJxzAlnF 4mC3SLhCGxR+mM3BHOkWu7VY4O8it5NIUy+HYCFK8mqVU20qTy3MzYWI5owy7fj6 1JIWgT0yK49Vo7TQQ59fvkSRak3g+LoWt3e91dnZ5OrIwikEQZ907DvUPHmFKEJK EJiXexy0g0wwU9rJd+cXq4eZg2lvM8azapMTFopNRwIDAQABoAAwDQYJKoZIhvcN AQELBQADggEBAGCgQSdcr+4Tjzs/WR6ZeHzSblxKLtUp3eZAECIBgUDj1nouoYDf AhfLcoOJgmAQnzThQ9SL5vg9Ohx6AN1DdOqcPUqMYIm+8hvLbnPzliVheY2HZ0iw v+SzPg6m8t4m5c6mJKehO/0YdmyhPQ/BSPe7BmIeK4X4081/omNExrl8LNJUfElq OSyHtJ0fIIlvRdNsAUAIy0/cG82CIW8k9s7DLeZLlDgspT7CmMsokgFzYLkgnPlq kYtdhjPhK9oE5j2aKu4evtOIIYNpVI49Co954JSxmg+B1G+FHSLJ3KAhsxIB+axP Ya0XlIZsVEPzTO971y+utWIBBlvK0OFFI2A= -----END CERTIFICATE REQUEST-----
3.【CAサーバ】CSRからSSL証明書作成
WEBサーバで作成したCSRをもとにCAサーバ側でSSL証明書を作成します。
まずは先ほど作成したWEBサーバ側のCSR「webserver.csr」はCA側の/root/ca/配下に格納しておきます。
CAサーバでWEBサーバのcsrを指定してSSL証明書を作成します。
# openssl ca -config /root/ca/openssl.cnf -in /root/ca/webserver.csr -keyfile /root/ca/privatekey_ca -cert /root/ca/ca.cert -out /root/ca/webserver.cert -extfile /root/ca/subjectAltName Using configuration from /root/ca/openssl.cnf Check that the request matches the signature Signature ok Certificate Details: Serial Number: 0 (0x0) Validity Not Before: May 5 07:18:34 2023 GMT Not After : May 4 07:18:34 2024 GMT Subject: countryName = JP stateOrProvinceName = TOKYO organizationName = shimmy company organizationalUnitName = it commonName = accountA-server X509v3 extensions: X509v3 Subject Alternative Name: DNS:accountA-server Certificate is to be certified until May 4 07:18:34 2024 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
【参考】
CAのcsrとWEbサーバのcsrを作成するときの組織名が異なる値に指定した場合以下のようなエラーが表示されます。(organizationNameが方や”shimmy company”で方や”webcreate company”に指定していた場合の例)
# openssl ca -config /root/ca/openssl.cnf -in /root/ca/webserver.csr -keyfile /root/ca/privatekey_ca -cert /root/ca/ca.cert -out /root/ca/webserver.cert Using configuration from /root/ca/openssl.cnf Check that the request matches the signature Signature ok The organizationName field is different between CA certificate (shimmy company) and the request (webcreate company)
作成したSSL証明書の中身を確認してみます。
# openssl x509 -text -noout -in /root/ca/webserver.cert Certificate: Data: Version: 3 (0x2) Serial Number: 0 (0x0) Signature Algorithm: sha256WithRSAEncryption Issuer: C = JP, ST = TOKYO, L = MINATO-ku, O = shimmy company, OU = it, CN = PRIVATE-SERVER1 Validity Not Before: May 5 07:18:34 2023 GMT Not After : May 4 07:18:34 2024 GMT Subject: C = JP, ST = TOKYO, O = shimmy company, OU = it, CN = accountA-server Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (2048 bit) Modulus: 00:de:ed:e4:a4:9f:00:f0:35:1a:5a:cd:94:b8:6f: 71:c1:7e:03:f2:c7:31:2d:30:56:6f:64:99:e8:9e: 60:f8:f1:db:24:e0:8b:53:9e:12:58:26:2b:b4:a5: 5f:fa:e7:ea:c1:01:60:8f:16:4d:24:eb:37:eb:a8: 03:c5:0f:0f:ee:90:c1:ad:7c:f4:13:02:40:ce:cb: a1:ad:c3:6d:45:64:87:cd:77:fe:81:23:a7:5c:2f: 4a:ba:ca:73:09:4b:84:3f:96:67:ad:d0:5c:3d:7a: 86:8d:4c:cb:10:d5:72:40:eb:3a:f9:09:37:87:13: 28:72:e1:17:ac:9c:73:02:59:c5:e2:60:b7:48:b8: 42:1b:14:7e:98:cd:c1:1c:e9:16:bb:b5:58:e0:ef: 22:b7:93:48:53:2f:87:60:21:4a:f2:6a:95:53:6d: 2a:4f:2d:cc:cd:85:88:e6:8c:32:ed:f8:fa:d4:92: 16:81:3d:32:2b:8f:55:a3:b4:d0:43:9f:5f:be:44: 91:6a:4d:e0:f8:ba:16:b7:77:bd:d5:d9:d9:e4:ea: c8:c2:29:04:41:9f:74:ec:3b:d4:3c:79:85:28:42: 4a:10:98:97:7b:1c:b4:83:4c:30:53:da:c9:77:e7: 17:ab:87:99:83:69:6f:33:c6:b3:6a:93:13:16:8a: 4d:47 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Alternative Name: DNS:accountA-server Signature Algorithm: sha256WithRSAEncryption 49:b6:a7:a0:dc:b5:88:84:96:be:95:ab:a6:1d:39:15:53:48: fa:bb:2e:1c:8e:49:29:c1:28:7f:77:45:d5:a6:8d:1f:0b:ad: d6:68:5b:e1:07:6d:0e:c8:fa:ef:e1:df:c7:6d:34:55:51:f0: 82:95:fe:3c:f8:bf:ac:45:6f:10:5d:86:de:26:0d:73:28:89: ce:e8:27:08:fd:a7:ec:7e:b7:d5:fd:eb:ad:9d:48:0a:3b:57: b3:12:1c:30:f6:70:2c:78:99:b8:fc:22:9b:e4:09:ec:56:23: 1e:f1:8c:66:4c:f0:0a:0c:bf:f6:bb:d3:82:6d:cb:60:a2:b4: 38:54:97:6c:88:46:b5:58:3a:94:31:a9:2d:83:76:36:05:a8: 8c:ac:41:6e:a7:3b:69:fe:32:07:4f:a0:9d:43:47:2e:b7:4c: 36:b0:c7:3f:d9:81:21:94:f6:bf:50:41:1b:74:33:13:83:48: 6a:c2:d3:0f:d5:f7:4e:64:19:cd:f9:2d:7f:1b:2c:53:a9:23: 27:87:c1:9c:93:8b:f7:59:76:2c:a9:bd:f6:e2:2e:80:af:14: 7a:a5:a9:eb:2c:b1:02:40:76:a6:bc:6d:bf:90:ac:a4:a3:ce: 20:6f:05:18:0d:43:3a:63:51:84:5b:04:7a:fa:d1:ff:05:ad: 92:a3:0e:ce
4.【WEBサーバ】ssl.conf設定変更
CAサーバ側で作成したSSL証明書「webserver.cert」をWEBサーバの/root/web/配下に移動させておきます。
/etc/httpd/conf.d/ssl.confの以下2箇所を変更します。
※ssl.confが存在しない場合は、mod_sslをインストールがしてください。
SSLCertificateFile /etc/pki/tls/certs/localhost.crt ↓変更 SSLCertificateFile /root/web/webserver.cert SSLCertificateKeyFile /etc/pki/tls/private/localhost.key ↓変更 SSLCertificateKeyFile /root/web/privatekey_webserver
変更後、httpdを再起動します。
# systemctl restart httpd
5.【クライアント】接続確認
クライアント側のブラウザからWEBサーバにアクセス確認をしてみます。
※事前にWEBサーバ側のセキュリティグループにはクライアントからの443/tcpポートを開けておく必要があります。

一旦、httpsで接続することができました。
現状ですと保護されていない通信となるのでCA側のSSL証明書(ca.cert)をクライアントにダウンロードして証明書をインストールします。
ファイル名を「ca.cert」から「ca.crt」に変更してダブルクリックします。

証明書のインストールを押して画面の通り進めます。





インストール完了後、chromからCAのSSL証明書が入っていることを確認します。

この状態でアクセスすると証明書が有効状態となり接続が保護された通信となります。


以上で完了。
コメント