關于openssl ca的詳細介紹

????????關于證書授權中心CA以及數字證書等概念,請移步?OpenSSL 與 SSL 數字證書概念貼?。

openssl是一個開源程序的套件、這個套件有三個部分組成:一是libcryto,這是一個具有通用功能的加密庫,里面實現了眾多的加密庫;二是libssl,這個是實現ssl機制的,它是用于實現TLS/SSL的功能;三是openssl,是個多功能命令行工具,它可以實現加密解密,甚至還可以當CA來用,可以讓你創建證書、吊銷證書。

默認情況ubuntu和CentOS上都已安裝好openssl。CentOS 6.x 上有關ssl證書的目錄結構:

/etc/pki/CA/
? ? ? ? ? ?newcerts ? ?存放CA簽署(頒發)過的數字證書(證書備份目錄)
? ? ? ? ? ?private ? ? 用于存放CA的私鑰
? ? ? ? ? ?crl ? ? ? ? 吊銷的證書

/etc/pki/tls/
? ? ? ? ? ? cert.pem ? ?軟鏈接到certs/ca-bundle.crt
? ? ? ? ? ? certs/ ? ? ?該服務器上的證書存放目錄,可以房子自己的證書和內置證書
? ? ? ? ? ? ? ? ? ca-bundle.crt ? ?內置信任的證書
? ? ? ? ? ? private ? ?證書密鑰存放目錄
? ? ? ? ? ? openssl.cnf ? ?openssl的CA主配置文件

由于openssl ca命令對配置文件(默認為/etc/pki/tls/openssl.cnf)的依賴性非常強,所以建議結合我的另一篇文章配置文件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@xuexi tmp]# touch /etc/pki/CA/index.txt     [root@xuexi tmp]# echo "01" > /etc/pki/CA/serial

另外,要簽署證書請求,需要CA自己的私鑰文件以及CA自己的證書,先創建好CA的私鑰,存放位置為配置文件中private_key所指定的值,默認為/etc/pki/CA/private/cakey.pem。

[root@xuexi tmp]# openssl genrsa -out /etc/pki/CA/private/cakey.pem

(1).使用openssl ca自建CA

要提供CA自己的證書,測試環境下CA只能自簽署,使用”openssl req -x509″、”openssl x509″和”openssl ca”都可以自簽署證書請求文件,此處僅介紹openssl ca命令自身自簽署的方法。

先創建CA的證書請求文件,建議使用CA的私鑰文件/etc/pki/CA/private/cakey.pem來創建待自簽署的證書請求文件,雖非必須,但方便管理。創建請求文件時,其中Country Name、State or Province Name、Organization Name和Common Name默認是必須提供的。

[root@xuexi tmp]# openssl req -new -key /etc/pki/CA/private/cakey.pem -out rootCA.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]:CN  State or Province Name (full name) []:FJLocality Name (eg, city) [Default City]:XMOrganization Name (eg, company) [Default Company Ltd]:JMOrganizational Unit Name (eg, section) []:ITCommon Name (eg, your name or your server's hostname) []:www.iwant.comEmail Address []:.     Please enter the following 'extra' attributes  to be sent with your certificate request  A challenge password []:.  An optional company name []:.

然后使用openssl ca命令自簽署該證書請求文件。如果有兩次交互式詢問則表示自簽署將成功,如果失敗,則考慮數據庫文件index.txt是否創建、序列號文件serial是否存在且有序號值、私鑰文件cakey.pem是否路徑正確、創建證書請求文件時是否該提供的沒有提供等情況。

[root@xuexi 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:29Not After : Jun 27 10:06:29 2018 GMT      # 證書有效期終止日為2018-6-17 10:06:29Subject:                                      # 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:66X509v3 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:99Exponent: 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:66X509v3 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@xuexi tmp]# tree -C /etc/pki/CA/etc/pki/CA  ├── certs  ├── crl  ├── index.txt  ├── index.txt.attr  ├── index.txt.old  ├── newcerts  │   └── 01.pem  ├── private  │   └── cakey.pem  ├── serial  └── serial.old

其中newcerts目錄下的01.pem即為剛才自簽署的證書文件,因為它是CA自身的證書,所以根據配置文件中的”certificate=$dir/cacert.pem”項,應該將其放入/etc/pki/CA目錄下,且命名為cacert.pem,只有這樣以后才能簽署其它證書請求。

[root@xuexi tmp]# cp /etc/pki/CA/newcerts/01.pem /etc/pki/CA/cacert.pem

至此,自建CA就完成了,查看下數據庫索引文件和序列號文件。

[root@xuexi tmp]# cat /etc/pki/CA/index.txt  V       180627100629Z           01      unknown /C=CN/ST=FJ/O=JM/OU=IT/CN=www.iwant.com    [root@xuexi tmp]# cat /etc/pki/CA/serial02

那么,下次簽署證書請求時,序列號將是”02″。

將上述自建CA的過程總結如下:

[root@xuexi tmp]# touch /etc/pki/CA/index.txt   [root@xuexi tmp]# echo "01" > /etc/pki/CA/serial  [root@xuexi tmp]# openssl genrsa -out /etc/pki/CA/private/cakey.pem  [root@xuexi tmp]# openssl req -new -key /etc/pki/CA/private/cakey.pem -out rootCA.csr  [root@xuexi tmp]# openssl ca -selfsign -in rootCA.csr  [root@xuexi tmp]# cp /etc/pki/CA/newcerts/01.pem /etc/pki/CA/cacert.pem

以上過程是完全讀取默認配置文件創建的,其實很多過程是沒有那么嚴格的,openssl ca命令自身可以指定很多選項覆蓋配置文件中的項,但既然提供了默認的配置文件及目錄結構,為了方便管理,仍然建議完全采用配置文件中的項。

(2).為他人頒發證書。

首先申請者創建一個證書請求文件。

[root@xuexi tmp]# openssl req -new -key privatekey.pem -out youwant1.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]:CN  State or Province Name (full name) []:FJLocality Name (eg, city) [Default City]:XMOrganization Name (eg, company) [Default Company Ltd]:JMOrganizational Unit Name (eg, section) []:.Common Name (eg, your name or your server's hostname) []:www.youwant.comEmail 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必須提供,且前三者必須和CA的subject中的對應項完全相同。這些是由配置文件中的匹配策略決定的。

[ ca ]  default_ca      = CA_default            # The default ca section  [ CA_default ]  policy          = policy_match  [ policy_match ]  countryName             = matchstateOrProvinceName     = matchorganizationName        = matchorganizationalUnitName  = optional  commonName              = suppliedemailAddress            = optional

“match”表示openssl ca要簽署的證書請求文件中的項要和CA證書中的項匹配,即要相同,”supplied”表示必須要提供的項,”optional”表示可選項,所以可以留空。

現在就可以將證書請求文件發送給CA,讓CA幫忙簽署。

[root@xuexi tmp]# openssl ca -in youwant1.csr

簽署成功后,查看下/etc/pki/CA下的文件結構。

[root@xuexi 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@xuexi 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@xuexi tmp]# cat /etc/pki/CA/serial03

(3).openssl ca命令用法

經過上面的示例,應該對openssl ca命令的用法大致了解了,下面是其完整的用法說明,不包括crl相關功能。

openssl ca [-verbose] [-config filename] [-name section] [-startdate ] [-enddate ] [-days arg] [-md arg] [-policy arg] [-keyfile arg] [-key arg] [-passin arg] [-cert ]  [-selfsign] [- ] [-out ] [-notext] [-outdir ] [-infiles] [-ss_cert ] [-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或不設置。

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享