自己署名証明書を作成してWEBサーバにhttps通信をする

AWS

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証明書が入っていることを確認します。

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

以上で完了。

コメント

タイトルとURLをコピーしました