linux:openssl_private_ca

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

次のリビジョン
前のリビジョン
次のリビジョン両方とも次のリビジョン
linux:openssl_private_ca [2019/02/16 21:10] – 作成 ともやんlinux:openssl_private_ca [2020/03/03 10:45] – [参考文献] ともやん
行 1: 行 1:
 ====== OpenSSL によるプライベート CA の構築 ====== ====== OpenSSL によるプライベート CA の構築 ======
 +
 +===== ディレクトリとファイルの作成 =====
 +<code>
 +$ sudo mkdir -p /etc/pki/mgcCA/{certs,client,crl,newcerts,private}
 +$ sudo touch /etc/pki/mgcCA/{index.txt,index.txt.attr,serial}
 +$ sudo bash -c "echo '01' > /etc/pki/mgcCA/serial"
 +</code>
 +
 +==== CA のディレクトリとファイル ====
 +<code>
 +$ ll /etc/pki/mgcCA/
 +drwxr-xr-x 1 root root 0  2月 11 11:26 certs
 +drwxr-xr-x 1 root root 0  2月 11 11:26 client
 +drwxr-xr-x 1 root root 0  2月 11 11:26 crl
 +-rw-r--r-- 1 root root 0  2月 11 11:27 index.txt
 +-rw-r--r-- 1 root root 0  2月 11 11:27 index.txt.attr
 +drwxr-xr-x 1 root root 0  2月 11 11:26 newcerts
 +drwxr-xr-x 1 root root 0  2月 11 11:26 private
 +-rw-r--r-- 1 root root 3  2月 11 11:27 serial
 +</code>
 +<html>
 +  <style>
 +    .col1 { width: 196px; }
 +  </style>
 +</html>
 +^  ディレクトリ  ^  説明  ^  ファイル  ^  説明  ^
 +| certs  | 証明書保管用  | index.txt  | newcerts ディレクトリ内に保管される証明書の\\ 通番(nn)と識別名DN(Distinguished Name)との対応表  |
 +| client  | クライアント CSR、証明書、秘密鍵、PKCS#12 フォーマットのファイルのバックアップ用  | index.txt.attr  | index.txtにて管理する通番に重複を許すかどうかの設定\\ unique_subject = yes : 重複を許さない(デフォルト)\\ unique_subject = no : 重複を許す  |
 +| crl  | 失効リスト(Certificate Revocation List)保管用  | serial  | 次に発行する証明書の通番(nn)  |
 +| newcerts  | 新規に発行した証明書保管用  |     |
 +| private  | CAの秘密鍵保管用  |  |  |
 +
 +
 +===== デフォルトのユーザー情報を設定 =====
 +証明書作成の際に入力の手間を省くために、デフォルト値を設定しておく。\\
 +\\
 +設定ファイルをコピーする。
 +<code>
 +$ sudo cp /etc/pki/tls/openssl.cnf /etc/pki/mgcCA/
 +</code>
 +\\
 +設定ファイルを編集する。
 +<code>
 +$ sudo vi /etc/pki/mgcCA/openssl.cnf
 +</code>
 +
 +<code diff>
 +[ CA_default ]
 +dir = /etc/pki/mgcCA # 認証局ディレクトリパス
 +default_days    = 36500 # 証明書の有効期限は100年
 +
 +[ req ]
 +default_bits = 2048
 +default_md = sha256
 +
 +[ req_distinguished_name ]
 +countryName_default = JP # 国コード
 +stateOrProvinceName_default = Hokkaido Pref. # 都道府県
 +localityName_default = Sapporo City # 市町村区
 +# 会社名 or ドメイン名(行末の#がコメントとして扱われない、' が無視されるので注意)
 +0.organizationName_default = Monster's Garage Co.,Ltd.
 +organizationalUnitName_default = - # 組織部門名
 +emailAddress_default = domain-admin@monsters-g.com # 管理者メールアドレス
 +</code>
 +
 +openssl.cnf をコピーして、認証局(ca)、サーバー(server)、クライアント(client)用の設定ファイルを準備する。
 +<WRAP prewrap 100%>
 +<code>
 +$ sudo bash -c 'd=/etc/pki/mgcCA; for f in $d/openssl-mgc-{ca,server,client}.cnf; do cp $d/openssl.cnf $f; done'
 +</code>
 +</WRAP>
 +
 +===== プライベート認証局 CA の秘密鍵と証明書の作成 =====
 +==== 作成ファイル ====
 +^  ファイル  ^  説明  ^
 +| private/cakey.pem  | CA 秘密鍵  |
 +| cacert.pem  | CA 証明書  |
 +| mgc_ca_cert.der  | CA 証明書(DER形式) |
 +
 +==== CA の秘密鍵と証明書の作成 ====
 +openssl-mgc-ca.cnf(認証局用設定ファイル)を編集する。
 +<code>
 +$ sudo vi /etc/pki/mgcCA/openssl-mgc-ca.cnf
 +</code>
 +<code ini>
 +[ usr_cert ]
 +basicConstraints=CA:TRUE # CA証明書
 +
 +[ v3_ca ]
 +# nsCertType = sslCA, emailCA
 +nsCertType = sslCA, emailCA # SSL認証局、電子メール認証局
 +</code>
 +
 +CA の秘密鍵と証明書を作成する。
 +<WRAP prewrap 100%>
 +<code>
 +$ sudo openssl req -new -config /etc/pki/mgcCA/openssl-mgc-ca.cnf -x509 -days 36500 -keyout /etc/pki/mgcCA/private/cakey.pem -out /etc/pki/mgcCA/cacert.pem
 +</code>
 +</WRAP>
 +
 +<WRAP prewrap 100%>
 +<code>
 +Generating a RSA private key
 +.................................................+++++
 +..................................................................................+++++
 +writing new private key to '/etc/pki/mgcCA/private/cakey.pem'
 +Enter PEM pass phrase: # プライベート認証局のパスフレーズを入力
 +Verifying - Enter PEM pass phrase: # プライベート認証局の確認用パスフレーズを入力
 +-----
 +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) [JP]: # Enter を入力
 +State or Province Name (full name) [Hokkaido Pref.]: # Enter を入力
 +Locality Name (eg, city) [Sapporo City]: # Enter を入力
 +Organization Name (eg, company) [Monsters Garage Co.,Ltd.]:Monster's Garage Co.,Ltd. # 会社名 or ドメイン名を入力
 +Organizational Unit Name (eg, section) [-]: # Enter を入力
 +Common Name (eg, your name or your server's hostname) []:Monster's Garage CA # CA名称 or ホスト名を入力
 +Email Address [domain-admin@monsters-g.com]: # Enter を入力
 +</code>
 +</WRAP>
 +
 +CA証明書の確認。
 +<code>
 +$ openssl x509 -in /etc/pki/mgcCA/cacert.pem -text -noout
 +</code>
 +<WRAP prewrap 100%>
 +<code>
 +Certificate:
 +    Data:
 +        Version: 3 (0x2)
 +        Serial Number:
 +            46:fa:04:8a:29:79:6e:68:cd:9f:45:54:be:42:5b:ef:4f:8f:54:4c
 +        Signature Algorithm: sha256WithRSAEncryption
 +        Issuer: C = JP, ST = Hokkaido Pref., L = Sapporo City, O = "Monster's Garage Co.,Ltd.", OU = -, CN = Monster's Garage CA, emailAddress = domain-admin@monsters-g.com
 +        Validity
 +            Not Before: Feb 10 14:33:39 2019 GMT
 +            Not After : Jan 17 14:33:39 2119 GMT
 +        Subject: C = JP, ST = Hokkaido Pref., L = Sapporo City, O = "Monster's Garage Co.,Ltd.", OU = -, CN = Monster's Garage CA, emailAddress = domain-admin@monsters-g.com
 +        Subject Public Key Info:
 +            Public Key Algorithm: rsaEncryption
 +                RSA Public-Key: (2048 bit)
 +                Modulus:
 +                    00:dd:7e:eb:e7:ee:3c:f9:d8:58:0c:03:70:a2:96:
 +                    d6:97:7c:5a:31:6c:23:a8:93:b6:5b:21:99:31:21:
 +                    ca:3c:0e:21:d6:5b:85:09:66:54:c1:ef:db:89:a8:
 +                    f5:dc:8c:a2:5c:b2:b5:37:a1:69:80:1a:86:0d:92:
 +                    96:cb:22:47:a6:a6:ff:be:48:fc:f5:ac:02:bf:8c:
 +                    8a:0b:e0:84:32:f5:78:c1:67:bd:f6:5a:05:70:eb:
 +                    50:97:1b:19:8d:2a:62:59:30:9e:fe:cc:65:8f:94:
 +                    a1:aa:8f:39:df:b4:be:46:73:0c:5e:94:df:6a:62:
 +                    82:ba:6b:74:66:db:80:7c:9c:9c:58:aa:6a:0f:f9:
 +                    04:47:c1:3f:e0:05:eb:31:da:f6:f0:a8:b7:48:e0:
 +                    d8:16:42:17:86:49:36:d6:b1:72:ff:ba:18:08:ae:
 +                    01:71:41:b4:ba:e5:d7:ca:68:c4:64:0b:22:43:55:
 +                    fc:b6:bb:43:39:d4:51:83:39:a4:40:37:00:0f:9f:
 +                    2b:dd:f0:48:1b:3c:67:c3:df:e6:89:11:fb:cd:37:
 +                    c9:62:07:44:bb:e6:5f:7c:de:6f:5a:1e:61:b9:fa:
 +                    92:14:44:44:47:5b:8a:41:a8:d2:4a:02:18:a9:d2:
 +                    cc:ed:a2:1b:f1:15:10:86:23:7d:bf:78:ee:fa:c0:
 +                    bd:a3
 +                Exponent: 65537 (0x10001)
 +        X509v3 extensions:
 +            X509v3 Subject Key Identifier: 
 +                75:0E:6F:10:D2:10:CF:F2:CF:6E:20:12:C7:AE:25:70:00:F0:CD:65
 +            X509v3 Authority Key Identifier: 
 +                keyid:75:0E:6F:10:D2:10:CF:F2:CF:6E:20:12:C7:AE:25:70:00:F0:CD:65
 +
 +            X509v3 Basic Constraints: critical
 +                CA:TRUE
 +            Netscape Cert Type: 
 +                SSL CA, S/MIME CA
 +    Signature Algorithm: sha256WithRSAEncryption
 +         15:19:19:52:db:b6:bb:54:fd:94:1c:58:2f:28:8c:53:81:8d:
 +         ed:b1:5d:0e:f1:fe:c6:ec:ae:88:ab:b6:e2:13:40:07:78:2f:
 +         75:4b:ee:5f:77:a5:1f:55:b4:c3:25:fb:a6:02:3e:4d:3c:71:
 +         b6:2a:f9:d0:bf:75:dd:13:97:22:2b:b4:8a:aa:5c:c6:27:b7:
 +         af:4f:17:49:04:98:81:4b:55:14:3c:20:2c:86:74:75:47:d5:
 +         59:34:09:ab:02:a5:22:97:bf:5f:d9:e1:84:e3:68:18:93:c9:
 +         fd:df:1b:02:c7:96:93:52:2e:f1:8b:a5:1d:e8:d6:32:52:62:
 +         5f:1b:63:aa:a3:39:75:8e:82:1e:06:46:f4:a6:1b:b9:3f:db:
 +         88:78:9f:db:4c:f0:5d:ef:62:1b:37:37:63:31:1d:54:44:ff:
 +         04:a7:13:3b:82:af:e4:f2:46:de:ff:56:dc:d8:cc:86:7e:51:
 +         5a:69:5a:17:2c:4c:ee:38:3b:3b:3f:f0:30:1f:d5:7b:4c:d0:
 +         2e:27:3f:0d:cb:a7:0f:83:f9:18:68:b2:af:c9:9b:a0:ec:13:
 +         80:13:26:0b:af:25:75:5a:71:fa:6b:20:36:d7:da:09:b3:4c:
 +         de:60:68:02:24:43:59:cf:8a:0f:26:1f:71:de:a4:f4:78:44:
 +         90:bb:e5:7d
 +</code>
 +</WRAP>
 +CA のカレントディレクトリの private/ に CA 秘密鍵とカレントディレクトリにCA 証明書が作成される。
 +<code>
 +$ ll /etc/pki/mgcCA/private/
 +-rw------- 1 root root 1854  2月 11 11:40 cakey.pem # CA 秘密鍵
 +$ ll /etc/pki/mgcCA/
 +-rw-r--r-- 1 root root  1586  2月 11 11:40 cacert.pem # CA 証明書
 +</code>
 +==== CA 証明書を DER 形式へ変換 ====
 +DER(Distinguished Encoding Rules) 形式は Windows OS で証明書や秘密鍵をインポートするのに使えるフォーマットである。\\
 +ここでは PEM 形式の CA 証明書を DER 形式に変換する。\\
 +<WRAP prewrap 100%>
 +<code>
 +$ sudo openssl x509 -inform pem -outform der -in /etc/pki/mgcCA/cacert.pem -out /etc/pki/mgcCA/mgc_ca_cert.der
 +</code>
 +</WRAP>
 +CAのカレントディレクトリにCA 証明書(DER形式)が作成される。
 +<code>
 +$ ll /etc/pki/mgcCA/
 +-rw-r--r-- 1 root root  1126  2月 11 09:40 mgc_ca_cert.der # CA 証明書(DER形式)
 +</code>
 +
 +===== サーバー証明書の作成 =====
 +==== 作成ファイル ====
 +^  ファイル  ^  説明  ^
 +| serverkey.pem  | サーバー秘密鍵  |
 +| serverreq.csr  | サーバー CSR  |
 +| servercert.crt  | サーバー証明書  |
 +| serverkey-nopwd.pem  | サーバー秘密鍵(パスフレーズなし)  |
 +| san.ext  | SAN 追加設定ファイルを作成  |
 +==== サーバー CSR(Certificate Signing Request) の作成 ====
 + サーバー CSR は、パブリック認証局(Verisignなど)やプライベート認証局に対するサーバー証明書の署名要求である。\\  認証局に署名して貰うことによって、証明書として利用できるようになる。\\
 +\\
 +openssl-mgc-server.cnf(サーバー用設定ファイル)を編集する。\\ <code>
 +$ sudo vi /etc/pki/mgcCA/openssl-mgc-server.cnf
 +</code>
 +<code ini>
 +[ usr_cert ]
 +basicConstraints=CA:FALSE # CA証明書以外
 +nsCertType = server # サーバー証明書
 +</code>
 +\\
 +サーバー CSR(Certificate Signing Request) を作成する。\\
 +<WRAP prewrap 100%>
 +<code>
 +$ sudo openssl req -new -config /etc/pki/mgcCA/openssl-mgc-server.cnf \
 +-addext 'subjectAltName=DNS:localhost,DNS:*.tomoyan.net' \
 +-keyout /etc/pki/mgcCA/serverkey.pem -out /etc/pki/mgcCA/serverreq.csr
 +</code>
 +</WRAP>
 +<WRAP prewrap 100%>
 +<code>
 +Generating a RSA private key
 +...................................+++++
 +......................................+++++
 +writing new private key to '/etc/pki/mgcCA/serverkey.pem'
 +Enter PEM pass phrase: # パスフレーズを入力
 +Verifying - Enter PEM pass phrase: # 確認用パスフレーズを入力
 +-----
 +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) [JP]: # Enter を入力
 +State or Province Name (full name) [Hokkaido Pref.]: # Enter を入力
 +Locality Name (eg, city) [Sapporo City]: # Enter を入力
 +Organization Name (eg, company) [Monsters Garage Co.,Ltd.]:Monster's Garage Co.,Ltd. # 会社名 or ドメイン名を入力
 +Organizational Unit Name (eg, section) [-]: # Enter を入力
 +Common Name (eg, your name or your server's hostname) []:tomoyan.net # Web サーバーで利用する場合はドメイン名を入力
 +Email Address [domain-admin@monsters-g.com]:domain-admin@tomoyan.net # 管理者メールアドレスを入力
 +
 +Please enter the following 'extra' attributes
 +to be sent with your certificate request
 +A challenge password []: # Enter を入力
 +An optional company name []: # Enter を入力
 +</code>
 +</WRAP>
 +\\
 +CAのカレントディレクトリにサーバー秘密鍵とサーバー CSR(証明書署名要求)が作成される。
 +<code bash>
 +$ ll /etc/pki/mgcCA/
 +-rw------- 1 root root  1854  2月 10 23:57 serverkey.pem # サーバー秘密鍵
 +-rw-r--r-- 1 root root  1106  2月 11 00:03 serverreq.csr # サーバー CSR(証明書署名要求)
 +</code>**※サーバー CSR は認証局に渡して署名して貰うことで証明書として利用できるようになる。\\  秘密キーは証明書をサーバーで利用する際に必要になるので大事に保管しておくこと。**\\
 +\\
 +サーバー CSR の内容を確認する。<code>
 +$ openssl req -in /etc/pki/mgcCA/serverreq.csr -text -noout
 +</code>
 +<WRAP prewrap 100%>
 +<code bash>
 +Certificate Request:
 +    Data:
 +        Version: 1 (0x0)
 +        Subject: C = JP, ST = Hokkaido Pref., L = Sapporo City, O = "Monster's Garage Co.,Ltd.", OU = -, CN = tomoyan.net, emailAddress = domain-admin@tomoyan.net
 +        Subject Public Key Info:
 +            Public Key Algorithm: rsaEncryption
 +                RSA Public-Key: (2048 bit)
 +                Modulus:
 +                    00:ad:8b:53:f7:40:38:70:8b:cb:b1:12:e0:55:77:
 +~省略~
 +                Exponent: 65537 (0x10001)
 +        Attributes:
 +        Requested Extensions:
 +            X509v3 Subject Alternative Name: 
 +                DNS:localhost, DNS:*.tomoyan.net
 +    Signature Algorithm: sha256WithRSAEncryption
 +         89:2e:52:e2:cd:cb:d5:77:6a:05:73:32:6d:67:bf:73:09:17:
 +~省略~
 +</code>
 +</WRAP>
 +
 +==== プライベート認証局でサーバー CSR に署名する(サーバー証明書作成) ====
 +証明書作成の手前で追加設定ファイルを作成する。\\
 +<code>
 +$ sudo vi /etc/pki/mgcCA/san.ext
 +</code>
 +<file autoconf /etc/pki/mgcCA/san.ext>
 +basicConstraints=CA:FALSE # CA証明書以外
 +nsCertType=server # サーバー証明書
 +nsComment="OpenSSL Generated Certificate"
 +subjectKeyIdentifier=hash
 +authorityKeyIdentifier=keyid,issuer
 +subjectAltName=DNS:localhost,DNS:*.tomoyan.net
 +</file>
 +サーバー CSR(Certificate Signing Request) に認証局で署名する。\\
 +<WRAP prewrap 100%>
 +<code>
 +$ sudo openssl ca -config /etc/pki/mgcCA/openssl-mgc-server.cnf -keyfile /etc/pki/mgcCA/private/cakey.pem -in /etc/pki/mgcCA/serverreq.csr -out /etc/pki/mgcCA/servercert.crt -extfile /etc/pki/mgcCA/san.ext
 +</code>
 +</WRAP>
 +
 +<WRAP prewrap 100%>
 +<code>
 +Using configuration from /etc/pki/mgcCA/openssl-mgc-server.cnf
 +Enter pass phrase for /etc/pki/mgcCA/private/cakey.pem: # プライベート認証局のパスフレーズを入力
 +Check that the request matches the signature
 +Signature ok
 +Certificate Details:
 +        Serial Number: 10 (0xa)
 +        Validity
 +            Not Before: Feb 16 11:33:35 2019 GMT
 +            Not After : Jan 23 11:33:35 2119 GMT
 +        Subject:
 +            countryName               = JP
 +            stateOrProvinceName       = Hokkaido Pref.
 +            organizationName          = Monster's Garage Co.,Ltd.
 +            organizationalUnitName    = -
 +            commonName                = localhost, *.tomoyan.net
 +            emailAddress              = domain-admin@tomoyan.net
 +        X509v3 extensions:
 +            X509v3 Basic Constraints: 
 +                CA:FALSE
 +            Netscape Cert Type: 
 +                SSL Server
 +            Netscape Comment: 
 +                OpenSSL Generated Certificate
 +            X509v3 Subject Key Identifier: 
 +                4B:2D:69:69:2E:6C:6B:9B:33:CE:68:52:87:CE:A9:B5:42:6E:C5:AA
 +            X509v3 Authority Key Identifier: 
 +                keyid:F1:11:89:F3:AC:9E:C5:F4:01:B9:1A:96:17:A8:67:2D:13:6D:80:03
 +
 +            X509v3 Subject Alternative Name: 
 +                DNS:localhost, DNS:*.tomoyan.net
 +Certificate is to be certified until Jan 23 11:33:35 2119 GMT (36500 days)
 +Sign the certificate? [y/n]:y # y と Enter を入力
 +
 +
 +1 out of 1 certificate requests certified, commit? [y/n]y # y と Enter を入力
 +Write out database with 1 new entries
 +Data Base Updated
 +</code>
 +</WRAP>
 +カレントディレクトリにサーバー証明書が作成される。
 +<code bash>
 +$ ll /etc/pki/mgcCA/
 +-rw-r--r-- 1 root root  4890  2月 11 00:46 servercert.crt # サーバー証明書
 +</code>
 +
 +==== サーバー証明書の内容確認 ====
 +<WRAP prewrap 100%>
 +<code>
 +$ sudo openssl x509 -in /etc/pki/mgcCA/servercert.crt -text -noout
 +Certificate:
 +    Data:
 +        Version: 3 (0x2)
 +        Serial Number: 10 (0xa)
 +        Signature Algorithm: sha256WithRSAEncryption
 +        Issuer: C = JP, ST = Hokkaido Pref., L = Sapporo City, O = "Monster's Garage Co.,Ltd.", OU = -, CN = Monster's Garage CA, emailAddress = domain-admin@monsters-g.com
 +        Validity
 +            Not Before: Feb 16 11:33:35 2019 GMT
 +            Not After : Jan 23 11:33:35 2119 GMT
 +        Subject: C = JP, ST = Hokkaido Pref., O = "Monster's Garage Co.,Ltd.", OU = -, CN = "localhost, *.tomoyan.net", emailAddress = domain-admin@tomoyan.net
 +        Subject Public Key Info:
 +            Public Key Algorithm: rsaEncryption
 +                RSA Public-Key: (2048 bit)
 +                Modulus:
 +                    00:dc:a3:7e:df:9e:aa:17:f7:0e:a0:40:4c:24:f1:
 +                    91:4e:ce:7f:2b:da:91:78:f9:b4:67:10:fe:63:6f:
 +〜省略〜
 +                Exponent: 65537 (0x10001)
 +        X509v3 extensions:
 +            X509v3 Basic Constraints: 
 +                CA:FALSE
 +            Netscape Cert Type: 
 +                SSL Server
 +            Netscape Comment: 
 +                OpenSSL Generated Certificate
 +            X509v3 Subject Key Identifier: 
 +                4B:2D:69:69:2E:6C:6B:9B:33:CE:68:52:87:CE:A9:B5:42:6E:C5:AA
 +            X509v3 Authority Key Identifier: 
 +                keyid:F1:11:89:F3:AC:9E:C5:F4:01:B9:1A:96:17:A8:67:2D:13:6D:80:03
 +
 +            X509v3 Subject Alternative Name: 
 +                DNS:localhost, DNS:*.tomoyan.net
 +    Signature Algorithm: sha256WithRSAEncryption
 +         ba:ca:e4:01:53:cc:16:08:d7:81:cd:0e:86:ec:79:ce:0f:0d:
 +         16:e4:b4:f0:df:6b:a8:b1:1d:bf:a2:f7:41:89:d3:18:4a:eb:
 +〜省略〜
 +</code>
 +</WRAP>
 +
 +==== サーバーで利用する秘密鍵のパスフレーズ除去 ====
 + 秘密キーを Web サーバーなどで利用する際にパスフレーズを聞かれないようにするには、サーバー証明書の秘密キーのパスフレーズを除去しておく。\\
 +
 +秘密キーのパスフレーズを除去する。
 +<WRAP prewrap 100%>
 +<code>
 +$ sudo openssl rsa -in /etc/pki/mgcCA/serverkey.pem -out /etc/pki/mgcCA/serverkey-nopwd.pem
 +Enter pass phrase for /etc/pki/mgcCA/serverkey.pem: # 秘密キーのパスフレーズを入力
 +writing RSA key
 +</code>
 +</WRAP>
 +カレントディレクトリにパスフレーズを除去した秘密キーが作成される。
 +<code bash>
 +$ ll /etc/pki/mgcCA/
 +-rw------- 1 root root  1675  2月 11 01:08 serverkey-nopwd.pem # 秘密鍵(パスフレーズなし)
 +</code>
 +
 +==== サーバー CSR、証明書、秘密鍵のファイルのバックアップ ====
 +必要に応じて作成したサーバー CSR、証明書、秘密鍵のファイルをわかりやすいように認証局(CA)の管理下のディレクトリにバックアップしておく。\\
 +<WRAP prewrap 100%>
 +<code>
 +$ sudo mv /etc/pki/mgcCA/serverreq.csr /etc/pki/mgcCA/certs/www.tomoyan.net.csr
 +$ sudo mv /etc/pki/mgcCA/servercert.crt /etc/pki/mgcCA/certs/www.tomoyan.net.crt
 +$ sudo mv /etc/pki/mgcCA/serverkey.pem /etc/pki/mgcCA/certs/www.tomoyan.net.pem
 +$ sudo mv /etc/pki/mgcCA/serverkey-nopwd.pem /etc/pki/mgcCA/certs/www.tomoyan.net-nopwd.pem
 +$ sudo mv /etc/pki/mgcCA/san.ext /etc/pki/mgcCA/certs/www.tomoyan.net_san.ext
 +</code>
 +</WRAP>
 +===== クライアント証明書の作成 =====
 +
 +==== 作成ファイル ====
 +^  ファイル  ^  説明  ^
 +| clientkey.pem  | クライアント秘密鍵  |
 +| clientreq.csr  | クライアント CSR  |
 +| clientcert.crt  | クライアント証明書  |
 +| tomoyan-client.p12  | 個人情報交換ファイル  |
 +
 +==== クライアント CSR(Certificate Signing Request) の作成 ====
 + クライアント CSR は、パブリック認証局(Verisignなど)やプライベート認証局に対するクライアント証明書の署名要求である。\\  認証局に署名して貰うことによって、クライアント証明書として利用できるようになる。\\
 +\\
 +openssl-mgc-client.cnf(クライアント用設定ファイル)を編集する。\\
 +<code>
 +$ sudo vi /etc/pki/mgcCA/openssl-mgc-client.cnf
 +</code>
 +<WRAP prewrap 100%>
 +<code ini>
 +[ usr_cert ]
 +basicConstraints=CA:FALSE # CA証明書以外
 +nsCertType = client, email, objsign # クライアント、電子メール、オブジェクトサイン証明書
 +</code>
 +</WRAP>
 +\\
 +クライアント CSR(Certificate Signing Request) を作成する。\\
 +<WRAP prewrap 100%>
 +<code>
 +$ sudo openssl req -new -config /etc/pki/mgcCA/openssl-mgc-client.cnf -keyout /etc/pki/mgcCA/clientkey.pem -out /etc/pki/mgcCA/clientreq.csr
 +</code>
 +</WRAP>
 +**注意: 標準では Country Name, State of Province Name, Organization name は署名する CA のものと同一でなければならない。**
 +<WRAP prewrap 100%>
 +<code>
 +Generating a RSA private key
 +...+++++
 +........+++++
 +writing new private key to '/etc/pki/mgcCA/clientkey.pem'
 +Enter PEM pass phrase: # パスフレーズを入力
 +Verifying - Enter PEM pass phrase: # 確認用パスフレーズを入力
 +-----
 +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) [JP]: # Enter を入力
 +State or Province Name (full name) [Hokkaido Pref.]: # Enter を入力
 +Locality Name (eg, city) [Sapporo City]: # Enter を入力
 +Organization Name (eg, company) [Monsters Garage Co.,Ltd.]:Monster's Garage Co.,Ltd. # 会社名 or ドメイン名を入力
 +Organizational Unit Name (eg, section) [-]: # Enter を入力
 +Common Name (eg, your name or your server's hostname) []:TomoYan # 利用者名を入力
 +Email Address [domain-admin@monsters-g.com]:tomoyan@tomoyan.net # 利用者メールアドレスを入力
 +
 +Please enter the following 'extra' attributes
 +to be sent with your certificate request
 +A challenge password []: # Enter を入力
 +An optional company name []: # Enter を入力
 +</code>
 +</WRAP>
 +\\
 +CAのカレントディレクトリにクライアント秘密鍵とクライアント CSR(証明書署名要求)が作成される。
 +<code bash>
 +$ ll /etc/pki/mgcCA/
 +-rw------- 1 root root  1854  2月 11 01:35 clientkey.pem # クライアント秘密鍵
 +-rw-r--r-- 1 root root  1086  2月 11 01:42 clientreq.csr # クライアント CSR(証明書署名要求)
 +</code>**※クライアント CSR は認証局に渡して署名して貰うことで証明書として利用できるようになる。\\  秘密鍵は証明書をクライアントで利用する際に必要になるので大事に保管しておくこと。**\\
 +\\
 +クライアント CSR の内容を確認する。<code>
 +$ openssl req -in /etc/pki/mgcCA/clientreq.csr -text -noout
 +</code>
 +<WRAP prewrap 100%>
 +<code bash>
 +Certificate Request:
 +    Data:
 +        Version: 1 (0x0)
 +        Subject: C = JP, ST = Hokkaido Pref., L = Sapporo City, O = "Monster's Garage Co.,Ltd.", OU = -, CN = TomoYan, emailAddress = tomoyan@tomoyan.net
 +        Subject Public Key Info:
 +            Public Key Algorithm: rsaEncryption
 +                RSA Public-Key: (2048 bit)
 +                Modulus:
 +                    00:cf:38:92:c9:c1:7e:68:1d:27:64:d5:9c:94:a6:
 +                    98:eb:b5:90:4e:eb:ee:d4:5e:6f:5d:01:79:3b:57:
 +                    f9:96:33:94:30:46:f4:bc:b1:5b:50:95:a0:28:eb:
 +                    ee:0a:4a:aa:be:7d:b9:58:8f:e5:e5:c2:0e:58:6c:
 +                    ec:0e:21:a9:5d:1f:34:1f:d7:e1:0a:42:8c:a0:63:
 +                    4a:ee:fd:94:f3:36:d6:1f:bd:4b:43:82:45:a5:ea:
 +                    32:09:11:0c:48:cf:1c:1d:b6:e8:5b:99:d6:30:ce:
 +                    77:d6:b3:2f:0c:04:ec:1d:cc:1a:27:c1:ef:07:6e:
 +                    3f:f4:7d:0e:c3:33:a6:db:73:6c:34:32:df:6d:57:
 +                    f3:27:c8:43:c3:01:d3:62:60:66:c7:4e:99:86:a5:
 +                    9b:96:b3:53:75:b8:58:a7:d8:9c:b5:83:80:39:0a:
 +                    2e:4b:b8:91:ea:b3:d7:20:45:4d:77:61:9f:e4:6d:
 +                    46:c6:36:12:c7:e0:54:a2:fb:60:24:57:d5:a1:e3:
 +                    e4:83:92:6e:46:f6:1f:68:43:e5:29:93:be:5c:c9:
 +                    4a:16:c3:59:b3:96:3d:e8:aa:c6:fd:33:1f:54:7a:
 +                    14:8c:74:0f:32:c2:31:57:56:e7:76:c4:bc:e9:f1:
 +                    1c:93:99:88:6a:0b:46:53:e0:34:21:ad:37:58:80:
 +                    e3:39
 +                Exponent: 65537 (0x10001)
 +        Attributes:
 +            a0:00
 +    Signature Algorithm: sha256WithRSAEncryption
 +         7b:ba:9b:c7:e4:2a:ff:89:fa:36:49:68:aa:22:9e:f6:e1:9e:
 +~省略~
 +</code>
 +</WRAP>
 +
 +==== プライベート認証局でクライアント CSR に署名する(クライアント証明書作成) ====
 +クライアント CSR(Certificate Signing Request) に認証局で署名する。\\
 +<WRAP prewrap 100%>
 +<code>
 +$ sudo openssl ca -config /etc/pki/mgcCA/openssl-mgc-client.cnf -keyfile /etc/pki/mgcCA/private/cakey.pem -in /etc/pki/mgcCA/clientreq.csr -out /etc/pki/mgcCA/clientcert.crt
 +</code>
 +</WRAP>
 +
 +<WRAP prewrap 100%>
 +<code>
 +Using configuration from /etc/pki/mgcCA/openssl-mgc-client.cnf
 +Enter pass phrase for /etc/pki/mgcCA/private/cakey.pem: # プライベート認証局のパスフレーズを入力
 +Check that the request matches the signature
 +Signature ok
 +Certificate Details:
 +        Serial Number: 3 (0x3)
 +        Validity
 +            Not Before: Feb 10 17:03:11 2019 GMT
 +            Not After : Jan 17 17:03:11 2119 GMT
 +        Subject:
 +            countryName               = JP
 +            stateOrProvinceName       = Hokkaido Pref.
 +            organizationName          = Monster's Garage Co.,Ltd.
 +            organizationalUnitName    = -
 +            commonName                = TomoYan
 +            emailAddress              = tomoyan@tomoyan.net
 +        X509v3 extensions:
 +            X509v3 Basic Constraints: 
 +                CA:FALSE
 +            Netscape Cert Type: 
 +                SSL Client, S/MIME, Object Signing
 +            Netscape Comment: 
 +                OpenSSL Generated Certificate
 +            X509v3 Subject Key Identifier: 
 +                D8:60:5D:77:BF:C1:DA:DE:CC:94:00:0F:F8:29:5E:B0:58:3B:B3:1D
 +            X509v3 Authority Key Identifier: 
 +                keyid:75:0E:6F:10:D2:10:CF:F2:CF:6E:20:12:C7:AE:25:70:00:F0:CD:65
 +
 +Certificate is to be certified until Jan 17 17:03:11 2119 GMT (36500 days)
 +Sign the certificate? [y/n]:y # y と Enter を入力
 +
 +
 +1 out of 1 certificate requests certified, commit? [y/n]y # y と Enter を入力
 +Write out database with 1 new entries
 +Data Base Updated
 +</code>
 +</WRAP>
 +カレントディレクトリにクライアント証明書が作成される。
 +<code bash>
 +$ ll /etc/pki/mgcCA/
 +-rw-r--r-- 1 root root  4886  2月 11 02:03 clientcert.crt # クライアント証明書
 +</code>
 +
 +==== クライアント証明書の内容確認 ====
 +<WRAP prewrap 100%>
 +<code>
 +$ sudo openssl x509 -in /etc/pki/mgcCA/clientcert.crt -text -noout
 +Certificate:
 +    Data:
 +        Version: 3 (0x2)
 +        Serial Number: 2 (0x2)
 +        Signature Algorithm: sha256WithRSAEncryption
 +        Issuer: C = JP, ST = Hokkaido Pref., L = Sapporo City, O = "Monster's Garage Co.,Ltd.", OU = -, CN = Monster's Garage CA, emailAddress = domain-admin@monsters-g.com
 +        Validity
 +            Not Before: Feb 11 11:49:24 2019 GMT
 +            Not After : Jan 18 11:49:24 2119 GMT
 +        Subject: C = JP, ST = Hokkaido Pref., O = "Monster's Garage Co.,Ltd.", OU = -, CN = TomoYan, emailAddress = tomoyan@tomoyan.net
 +        Subject Public Key Info:
 +            Public Key Algorithm: rsaEncryption
 +                RSA Public-Key: (2048 bit)
 +                Modulus:
 +                    00:a9:41:68:6e:14:15:71:5f:87:ee:8b:1d:07:f1:
 +                    3b:64:64:e7:35:2f:93:4d:fe:05:1c:03:2a:1a:e5:
 +〜省略〜
 +                Exponent: 65537 (0x10001)
 +        X509v3 extensions:
 +            X509v3 Basic Constraints: 
 +                CA:FALSE
 +            Netscape Cert Type: 
 +                SSL Client, S/MIME, Object Signing
 +            Netscape Comment: 
 +                OpenSSL Generated Certificate
 +            X509v3 Subject Key Identifier: 
 +                8A:DC:B8:F5:6D:E7:16:69:3B:0A:C7:4B:9D:BE:2D:4D:7C:F5:14:79
 +            X509v3 Authority Key Identifier: 
 +                keyid:F1:11:89:F3:AC:9E:C5:F4:01:B9:1A:96:17:A8:67:2D:13:6D:80:03
 +
 +    Signature Algorithm: sha256WithRSAEncryption
 +         1c:d2:61:ab:26:74:cf:9f:8d:96:28:ff:6d:22:4b:33:00:46:
 +         e8:09:c1:75:07:a2:ec:aa:a9:31:6d:1d:63:80:da:26:87:01:
 +〜省略〜
 +</code>
 +</WRAP>
 +
 +==== クライアント証明書、秘密鍵から PKCS#12 個人情報交換ファイルの作成 ====
 +PKCS #12 は Personal Information Exchange Syntax Standard という規格で定義された個人情報交換ファイルです。\\
 +クライアントでは、証明書と秘密鍵を1つのファイルにまとめた PKCS#12 フォーマットが主に用いられます。\\
 +ここでは、クライアント証明書、秘密鍵から PKCS#12 フォーマットの p12 ファイルを作成する。\\
 +<WRAP prewrap 100%>
 +<code>
 +$ sudo openssl pkcs12 -export -in /etc/pki/mgcCA/clientcert.crt -inkey /etc/pki/mgcCA/clientkey.pem -out /etc/pki/mgcCA/tomoyan-client.p12 -name "TomoYan PKCS#12"
 +</code>
 +</WRAP>
 +<code>
 +Enter pass phrase for /etc/pki/mgcCA/clientkey.pem: # クライアント秘密鍵のパスフレーズ
 +Enter Export Password: # p12 ファイルを読み込むためのパスフレーズを入力
 +Verifying - Enter Export Password: # 確認用パスフレーズを入力
 +</code>
 +CAのカレントディレクトリに PKCS#12 フォーマットのファイルが作成される。
 +<code>
 +$ ll /etc/pki/mgcCA/
 +-rw------- 1 root root  2804  2月 11 07:48 tomoyan-client.p12 # 個人情報交換ファイル
 +</code>
 +
 +==== クライアント CSR、証明書、秘密鍵、PKCS#12 個人情報交換ファイルのバックアップ ====
 +必要に応じて作成したクライアント CSR、証明書、秘密鍵、PKCS#12 個人情報交換ファイルをわかりやすいように認証局(CA)の管理下のディレクトリにバックアップしておく。\\
 +<code>
 +$ sudo mkdir /etc/pki/mgcCA/client/{certs,private}
 +$ sudo mv /etc/pki/mgcCA/clientreq.csr /etc/pki/mgcCA/client/certs/tomoyan.csr
 +$ sudo mv /etc/pki/mgcCA/clientcert.crt /etc/pki/mgcCA/client/certs/tomoyan.crt
 +$ sudo mv /etc/pki/mgcCA/clientkey.pem /etc/pki/mgcCA/client/private/tomoyan.pem
 +$ sudo mv /etc/pki/mgcCA/tomoyan-client.p12 /etc/pki/mgcCA/client/private/tomoyan.p12
 +</code>
 +
 +===== トラブルシューティング =====
 +
 +==== openssl ca で CSR に署名する時に以下のエラーが発生する ====
 +openssl ca のバグである可能性が高いが、**-config** で **-keyfile** は分かっているはずなのに **-keyfile** オプションを省略すると、ファイル名: **'-out'** を **fopen** しようとする。\\
 +**-out** オプションをファイル名と勘違いしているので仕様では無いはずである。\\
 +<WRAP prewrap 100%>
 +<code>
 +140354393380672:error:02001002:system library:fopen:No such file or directory:crypto/bio/bss_file.c:72:fopen('-out','r')
 +140354393380672:error:2006D080:BIO routines:BIO_new_file:no such file:crypto/bio/bss_file.c:79:
 +</code>
 +</WRAP>
 +以下の様にきちんと **-keyfile** オプションで CA の秘密鍵を指定するとエラーを回避できる。\\
 +<WRAP prewrap 100%>
 +<code>
 +$ sudo openssl ca -config /etc/pki/mgcCA/openssl-mgc-server.cnf -keyfile /etc/pki/mgcCA/private/cakey.pem -in /etc/pki/mgcCA/serverreq.csr -out /etc/pki/mgcCA/servercert.crt
 +</code>
 +</WRAP>
 +
 +==== ブラウザーで SSL のサーバー証明書が NET::ERR_CERT_COMMON_NAME_INVALID になる ====
 +Chrome 58 以降では、Common Name を評価しなくなったようである。\\
 +X509v3 Subject Alternative Name(SAN): DNS: で判定するようである。\\
 +CSR を作成する際に openssl.cnf の [ req ] -> req_extensions = v3_req -> [ v3_req ] -> subjectAltName = @alt_names -> [ alt_names ] -> DNS.1, DNS.2 ... を指定する必要があるが、CSR を作成するたびに openssl.cnf を修正するのは面倒である。\\
 +OpenSSL Version 1.1.1 より CSR 作成時のコマンド **openssl req** に **-addext** が指定出来るようになった。\\
 +<code>
 +$ sudo openssl req -new -config /etc/pki/mgcCA/openssl-mgc-server.cnf \
 +-addext 'subjectAltName=DNS:localhost,DNS:*.tomoyan.net' \
 +-keyout /etc/pki/mgcCA/serverkey.pem -out /etc/pki/mgcCA/serverreq.csr
 +</code>
 +<WRAP prewrap 100%>
 +<code>
 +$ openssl req -in /etc/pki/mgcCA/serverreq.csr -text -noout
 +Certificate Request:
 +    Data:
 +        Version: 1 (0x0)
 +        Subject: C = JP, ST = Hokkaido Pref., L = Sapporo City, O = "Monster's Garage Co.,Ltd.", OU = -, CN = tomoyan.net, emailAddress = domain-admin@monsters-g.com
 +        Subject Public Key Info:
 +            Public Key Algorithm: rsaEncryption
 +                RSA Public-Key: (2048 bit)
 +                Modulus:
 +                    00:ad:8b:53:f7:40:38:70:8b:cb:b1:12:e0:55:77:
 +〜省略〜
 +                Exponent: 65537 (0x10001)
 +        Attributes:
 +        Requested Extensions:
 +            X509v3 Subject Alternative Name: 
 +                DNS:localhost, DNS:*.tomoyan.net
 +    Signature Algorithm: sha256WithRSAEncryption
 +         89:2e:52:e2:cd:cb:d5:77:6a:05:73:32:6d:67:bf:73:09:17:
 +〜省略〜
 +</code>
 +</WRAP>
 +<code>
 +        Requested Extensions:
 +            X509v3 Subject Alternative Name: 
 +                DNS:localhost, DNS:*.tomoyan.net
 +</code>
 +X509v3 Subject Alternative Name: DNS: が指定出来ている。\\
 +
 +==== openssl ca で ERROR:There is already a certificate for が発生する ====
 +<WRAP prewrap 100%>
 +<code>
 +ERROR:There is already a certificate for /C=JP/ST=Hokkaido Pref./O=Monster's Garage Co.,Ltd./OU=-/CN=localhost, *.tomoyan.net/emailAddress=domain-admin@monsters-g.com
 +The matching entry has the following details
 +Type          :Valid
 +Expires on    :21190123110413Z
 +Serial Number :09
 +File name     :unknown
 +Subject Name  :/C=JP/ST=Hokkaido Pref./O=Monster's Garage Co.,Ltd./OU=-/CN=localhost, *.tomoyan.net/emailAddress=domain-admin@monsters-g.com
 +</code>
 +</WRAP>
 +初期設定では重複して登録できないので revoke 証明書の失効をする。
 +<code>
 +$ sudo openssl ca -config /etc/pki/mgcCA/openssl-mgc-ca.cnf -revoke /etc/pki/mgcCA/newcerts/09.pem 
 +Using configuration from /etc/pki/mgcCA/openssl-mgc-ca.cnf
 +Enter pass phrase for /etc/pki/mgcCA/private/cakey.pem: # パスフレーズを入力
 +Revoking Certificate 09.
 +Data Base Updated
 +</code>
 +
 +===== 参考文献 =====
 +[[http://server-setting.info/centos/private-ca-cert.html|プライベート認証局の証明書、サーバー証明書、クライアント証明書の作成方法について | レンタルサーバー・自宅サーバー設定・構築のヒント]]\\
 +[[http://www.atmarkit.co.jp/ait/articles/1602/05/news039.html|Windows上で、証明書や秘密鍵をPEM形式に変換してエクスポートする (1/2):Tech TIPS - @IT]]\\
 +[[https://kaede.jp/2018/06/10191854.html|【OpenSSL】SANでDNS情報を付与した証明書を作成する - かえでBlog]]\\
 +\\
 +[[https://qiita.com/kunichiko/items/12cbccaadcbf41c72735|RSA鍵、証明書のファイルフォーマットについて - Qiita]]\\
 +[[https://glorificatio.org/archives/2914|証明書や秘密鍵のフォーマットを変換することだけを書いた | Divide et impera]]\\
  
  • linux/openssl_private_ca.txt
  • 最終更新: 2023/05/15 11:05
  • by ともやん