(13)Openssl ca(CAの署名と自己構築)

16396 ワード

証明書リクエストに署名したり、取り消しリストCRLを生成したり、発行済み証明書リストとこれらの証明書ステータスを維持したりするためのデータベースです.一般の人はcrlを管理する必要がないので、openssl caの証明書管理に関する機能だけを紹介します.
証明書リクエストファイルはCAの秘密鍵を使用して署名すると証明書になり、署名した後に証明書を申請者に送ると証明書が発行されます.
署名時には、証明書の整合性と一貫性を保証するために、署名した証明書に対してデジタルサマリーを生成する必要があります.すなわち、一方向暗号化アルゴリズムを使用します.
Openssl caコマンドは、プロファイル(デフォルトは/etc/pki/tls/openssl.cnf)への依存性が非常に強いため、結合を推奨します.
プロファイルに証明書の署名に必要なファイルの構造が指定されています.デフォルトopenssl.cnfの構造要件は次のとおりです.
[ CA_default ]
dir             = /etc/pki/CA             #       
certs           = $dir/certs              #           
database        = $dir/index.txt          #        
new_certs_dir   = $dir/newcerts           #           
certificate     = $dir/cacert.pem         # CA     
serial          = $dir/serial             #        
private_key     = $dir/private/cakey.pem  # CA      

ディレクトリ/etc/pki/CA/{certs,newcerts,private}はopensslのインストール後にデフォルトで存在するため、独立して作成する必要はありませんが、証明書のdatabaseファイルindex.txtとシーケンスファイルserialは手動で作成する必要があり、シーケンス番号ファイルには「01」のようなシーケンス番号が先に指定されています.
[root@localhost tmp]# touch /etc/pki/CA/index.txt 

[root@localhost tmp]# echo "01" > /etc/pki/CA/serial

また、証明書リクエストに署名するには、CA独自の秘密鍵ファイルおよびCA独自の証明書が必要であり、まずCAの秘密鍵を作成し、プロファイル内のprivate_keyが指定した値は、デフォルトは/etc/pki/CA/private/cakey.pemです.
[root@localhost tmp]# openssl genrsa -out /etc/pki/CA/private/cakey.pem            #  CA  

(1).openssl caを用いてCAを自作する
CA独自の証明書を提供するには、テスト環境でCAは自己署名のみ可能であり、「openssl req-x 509」、「openssl x 509」および「openssl ca」を使用して証明書要求ファイルに自己署名できます.ここではopensslcaコマンド自体の自己署名方法についてのみ説明します.
まずCAの証明書リクエストファイルを作成し、CAの秘密鍵ファイル/etc/pki/CA/private/cakey.pemを使用して自己署名する証明書リクエストファイルを作成することをお勧めします.必要ではありませんが、管理が便利です.
要求ファイルを作成する場合は、Country Name、State or Province Name、Organization Name、Common Nameのデフォルトが必要です.
[root@localhost tmp]# openssl req -new -key /etc/pki/CA/private/cakey.pem -out rootCA.csr      #   CA    
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]:CN
State or Province Name (full name) []:FJ
Locality Name (eg, city) [Default City]:XM
Organization Name (eg, company) [Default Company Ltd]:JM
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:www.iwant.com
Email Address []:.
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:.
An optional company name []:.

次にopensslcaコマンドを使用して証明書リクエストファイルに署名します.2回のインタラクティブな質問がある場合は、自己署名が成功し、失敗した場合は、データベースファイルindex.txtが作成されたかどうか、シリアル番号ファイルserialが存在し、シーケンス番号値があるかどうか、秘密鍵ファイルcakey.pemがパスが正しいかどうか、証明書リクエストファイルが作成されたときに提供されなかったかどうかなどを考慮します.
[root@localhost tmp]# openssl ca -selfsign -in rootCA.csr
Using configuration from /etc/pki/tls/openssl.cnf    #     /etc/pki/tls/openssl.cnf      
Check that the request matches the signature         #              ,                 
Signature ok
Certificate Details:                                 #         
        Serial Number: 1 (0x1)                        #     1
        Validity
            Not Before: Jun 27 10:06:29 2017 GMT      #          2017-6-17 10:06:29
            Not After : Jun 27 10:06:29 2018 GMT      #          2018-6-17 10:06:29
        Subject:                                      # Subject  ,subject        
            countryName               = CN
            stateOrProvinceName       = FJ
            organizationName          = JM
            organizationalUnitName    = IT
            commonName                = www.iwant.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                A5:0D:DD:D6:47:C6:24:74:20:F4:62:77:F6:A9:63:3E:52:D2:8A:66
            X509v3 Authority Key Identifier:
                keyid:A5:0D:DD:D6:47:C6:24:74:20:F4:62:77:F6:A9:63:3E:52:D2:8A:66
 
Certificate is to be certified until Jun 27 10:06:29 2018 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           #                 
Certificate:                                    #       
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=CN, ST=FJ, O=JM, OU=IT, CN=www.iwant.com
        Validity
            Not Before: Jun 27 10:06:29 2017 GMT
            Not After : Jun 27 10:06:29 2018 GMT
        Subject: C=CN, ST=FJ, O=JM, OU=IT, CN=www.iwant.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (1024 bit)
                Modulus:
                    00:94:49:33:f4:90:a4:fc:a4:6b:65:75:4c:be:4f:
                    d1:3f:95:bd:24:60:c8:45:f9:eb:00:31:ac:45:6b:
                    ae:bb:63:bf:f2:a3:0c:e3:d3:50:20:33:1e:d9:e1:
                    8a:49:42:c6:e0:67:6d:3a:cb:2f:9c:90:ab:4c:10:
                    7a:4a:82:e1:6e:a0:6a:63:84:56:1c:a2:5f:11:60:
                    99:e0:cd:20:68:e9:98:40:68:c2:43:7c:97:12:ee:
                    31:8e:b1:73:7d:36:99:97:49:31:50:c1:8c:47:10:
                    16:f9:5d:37:11:00:73:3b:01:62:9b:36:36:97:08:
                    48:31:93:56:3f:6a:d9:a6:99
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                A5:0D:DD:D6:47:C6:24:74:20:F4:62:77:F6:A9:63:3E:52:D2:8A:66
            X509v3 Authority Key Identifier:
                keyid:A5:0D:DD:D6:47:C6:24:74:20:F4:62:77:F6:A9:63:3E:52:D2:8A:66
 
    Signature Algorithm: sha1WithRSAEncryption
         1e:4e:f4:e4:c9:33:52:85:69:ae:b4:2a:37:37:44:90:9b:52:
         b3:e9:89:1c:b2:f2:17:41:d8:05:02:63:9a:4f:64:4d:c9:ce:
         0c:81:48:22:4f:73:8a:4c:f7:b8:bf:64:b2:77:8a:2e:43:80:
         39:03:de:27:19:09:d2:88:39:11:8f:8b:4b:37:c0:12:68:ef:
         79:5b:28:d4:cf:c9:b8:e1:77:24:6e:b4:5b:83:4a:46:49:a1:
         ad:5c:b7:d8:da:49:9a:45:73:b9:8e:eb:1a:9c:2e:6c:70:d3:
         c5:db:9c:46:02:59:42:bf:ad:bc:21:4c:d1:6b:6b:a7:87:33:
         1a:6b
-----BEGIN CERTIFICATE-----
MIICiTCCAfKgAwIBAgIBATANBgkqhkiG9w0BAQUFADBMMQswCQYDVQQGEwJDTjEL
MAkGA1UECAwCRkoxCzAJBgNVBAoMAkpNMQswCQYDVQQLDAJJVDEWMBQGA1UEAwwN
d3d3Lml3YW50LmNvbTAeFw0xNzA2MjcxMDA2MjlaFw0xODA2MjcxMDA2MjlaMEwx
CzAJBgNVBAYTAkNOMQswCQYDVQQIDAJGSjELMAkGA1UECgwCSk0xCzAJBgNVBAsM
AklUMRYwFAYDVQQDDA13d3cuaXdhbnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GN
ADCBiQKBgQCUSTP0kKT8pGtldUy+T9E/lb0kYMhF+esAMaxFa667Y7/yowzj01Ag
Mx7Z4YpJQsbgZ206yy+ckKtMEHpKguFuoGpjhFYcol8RYJngzSBo6ZhAaMJDfJcS
7jGOsXN9NpmXSTFQwYxHEBb5XTcRAHM7AWKbNjaXCEgxk1Y/atmmmQIDAQABo3sw
eTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBD
ZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUpQ3d1kfGJHQg9GJ39qljPlLSimYwHwYDVR0j
BBgwFoAUpQ3d1kfGJHQg9GJ39qljPlLSimYwDQYJKoZIhvcNAQEFBQADgYEAHk70
5MkzUoVprrQqNzdEkJtSs+mJHLLyF0HYBQJjmk9kTcnODIFIIk9zikz3uL9ksneK
LkOAOQPeJxkJ0og5EY+LSzfAEmjveVso1M/JuOF3JG60W4NKRkmhrVy32NpJmkVz
uY7rGpwubHDTxducRgJZQr+tvCFM0Wtrp4czGms=
-----END CERTIFICATE-----
Data Base Updated

署名に成功すると、/etc/pki/CAディレクトリの下に一連のファイルが生成されます.
[root@localhost tmp]# tree -C /etc/pki/CA
/etc/pki/CA
├── certs
├── crl
├── index.txt
├── index.txt.attr
├── index.txt.old
├── newcerts
│   └── 01.pem          #     serial      
├── private
│   └── cakey.pem
├── serial
└── serial.old

ここでnewcertsディレクトリの下の01.pemは、CA自身の証明書であるため、コンフィギュレーションファイルの「certificate=$dir/cacert.pem」項目に従って、/etc/pki/CAディレクトリの下に入れ、cacert.pemと命名する必要があります.これにより、他の証明書リクエストに署名できます.
[root@localhost tmp]# cp /etc/pki/CA/newcerts/01.pem /etc/pki/CA/cacert.pem

これで、自己構築CAが完了し、データベースインデックスファイルとシリアル番号ファイルを確認します.
[root@localhost tmp]# cat /etc/pki/CA/index.txt
V       180627100629Z           01      unknown /C=CN/ST=FJ/O=JM/OU=IT/CN=www.iwant.com

[root@localhost tmp]# cat /etc/pki/CA/serial
02

では、次回証明書リクエストに署名すると、シリアル番号は「02」になります.
上記の自作CAのプロセスを以下にまとめる.
[root@localhost tmp]# touch /etc/pki/CA/index.txt 
[root@localhost tmp]# echo "01" > /etc/pki/CA/serial
[root@localhost tmp]# openssl genrsa -out /etc/pki/CA/private/cakey.pem
[root@localhost tmp]# openssl req -new -key /etc/pki/CA/private/cakey.pem -out rootCA.csr
[root@localhost tmp]# openssl ca -selfsign -in rootCA.csr
[root@localhost tmp]# cp /etc/pki/CA/newcerts/01.pem /etc/pki/CA/cacert.pem

以上の手順は、デフォルトのプロファイルを完全に読み込んで作成されますが、実際にはそれほど厳密ではありません.opensslcaコマンド自体は、プロファイル内のアイテムを上書きするオプションを多く指定できますが、デフォルトのプロファイルおよびディレクトリ構造が提供されている以上、管理を容易にするために、プロファイル内のアイテムを完全に採用することをお勧めします.
(2).他人に証明書を発行する.
まず、申請者は証明書リクエストファイルを作成します.
[root@localhost tmp]# openssl req -new -key privatekey.pem -out youwant1.csr      #       privatekey.pem      
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]:CN
State or Province Name (full name) []:FJ
Locality Name (eg, city) [Default City]:XM
Organization Name (eg, company) [Default Company Ltd]:JM
Organizational Unit Name (eg, section) []:.
Common Name (eg, your name or your server's hostname) []:www.youwant.com
Email Address []:.
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:.
An optional company name []:.

Country Name、State or Province Name、Organization Name、Common Nameが必要であり、最初の3つはCAのsubjectの対応項目と完全に同じである必要があります.これらは、プロファイル内のマッチングポリシーによって決定されます.
[ ca ]
default_ca      = CA_default            # The default ca section
[ CA_default ]
policy          = policy_match
[ policy_match ]
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

「match」はopenssl caが署名する証明書要求ファイルの項目がCA証明書の項目と一致することを示し、すなわち同じであることを示し、「supplied」は提供する必要がある項目を示し、「optional」はオプションを示すため、空にすることができる.
証明書リクエストファイルをCAに送信し、CAに署名してもらうことができます.
[root@localhost tmp]# openssl ca -in youwant1.csr

署名に成功したら、下/etc/pki/CAのファイル構造を確認します.
[root@localhost tmp]# tree -C /etc/pki/CA/
/etc/pki/CA/
├── cacert.pem
├── certs
├── crl
├── index.txt
├── index.txt.attr
├── index.txt.attr.old
├── index.txt.old
├── newcerts
│   ├── 01.pem
│   └── 02.pem
├── private
│   └── cakey.pem
├── serial
└── serial.old
 
4 directories, 10 files

このうち「02.pem」は、さっき署名した証明書で、申請者に送信すると発行が完了します.
データベースインデックスファイルとシリアル番号ファイルを見てみましょう.
[root@localhost tmp]# cat /etc/pki/CA/index.txt
V       180627100629Z           01      unknown /C=CN/ST=FJ/O=JM/OU=IT/CN=www.iwant.com
V       180627110022Z           02      unknown /C=CN/ST=FJ/O=JM/CN=www.youwant.com

[root@localhost tmp]# cat /etc/pki/CA/serial
03

(3).opensslcaコマンドの使い方
上記の例ではopensslcaコマンドの使い方を大体理解したはずですが、crl関連機能を含まない完全な使い方の説明を次に示します.
openssl ca [-verbose] [-config filename] [-name section] [-startdate date] [-enddate date] [-days arg] [-md arg] [-policy arg] [-keyfile arg] [-key arg] [-passin arg] [-cert file]
[-selfsign] [-in file] [-out file] [-notext] [-outdir dir] [-infiles] [-ss_cert file] [-preserveDN] [-noemailDN] [-batch] [-extensions section] [-extfile section] [-subj arg] [-utf8]

caコマンドは証明書に署名するために使用されるため、必要なファイルはプロファイルのほかに秘密鍵ファイルと証明書要求ファイルであり、署名後に生成されるファイルは証明書ファイルであるため、「-in」を使用して指定するオブジェクトは署名対象ファイル(すなわち要求証明書)であり、「-infiles」は複数の署名対象ファイルを指定し、「-keyfile」は秘密鍵ファイルを指定し、「-out」はは、出力を指定する証明書ファイルです.
【    :】
-config filename :          ,      openssl.cnf      ca     。
-name section    :            section。      openssl.cnf  default_ca 。
-in filename     :    CA           。 CA          。
-infiles         :            ,                          ,                  。
-selfsign        :   。  -ss_cert         。
-ss_cert filename:  CA          。           。
-out filename    :       ,         。         stdout。
-outdir dir_name :       。      ,                 16  serial  ".pem"    
-cert :CA 。 -keyfile filename: CA 。 -key passwd_value: 。
-passin arg : -verbose : -notext : "-out" -days arg : , startdate, enddate。 -startdate : , "-enddate" 。 -enddate : 。 -md alg : -policy arg : section , field , , 。 。 -extensions section: section 。 -batch : , 。 ( 、 )。 -subj arg : subject, /type0=value0/type1=value1/type2=...

プロファイルはcaの部分について、必須項目としてマークされているプロファイルまたはコマンドラインにこのオプションとその値を指定する必要があることを示します.
new_certs_dir    :   "-outdir"  。   
certificat       :   "-cert"  ,CA       。   
private_key      :   "-keyfile"  ,              , CA       。   
default_days     :   "-days"  
default_startdate:   "-startdate"  。
default_enddate  :   "-enddate"  。
default_md       :   "-md"  。   
database         :openssl        。             。   
serial           :         (16  )  。                 
unique_subject   :     yes,database  subject       。     no,  subject  。   yes,
                 :          Openssl,     no。
x509_extensions  :   "-extensions"  。
policy           :   "-policy"  。   
name_opt/cert_opt:       ,          ca_default,                 (     )。   ca           ,    x509 "-nameopt" "-certopt"        。
copy_extensions  :                。
          : none , 。 : copy, 。 : copyall, , , 。 : subjectAltName 。 : man ca WARNINGS 。 none 。

転載先:https://www.cnblogs.com/wyzhou/p/9740013.html