---恢復內容開始---
一、介紹
企業自用, 到證書機構簽發證書的費用和時間等都可以省下.....
SSl證書的背景功用.......(省略萬字,不廢話)
可以參考:
開源的可視化管理工具 :)
https://github.com/chris2511/xca
二、創建CA根
1.創建 Root CA
創建 root 文件夾, 在root文件夾上級建立配置文件 openssl.cnf
a.創建 root 密鑰
命令:
openssl genrsa -des3 -out root/private.pem 4096
然后要輸入 密碼, 用以保護 私鑰.
b.創建自簽名證書
命令:
openssl req -x509 -new -key root/private.pem -out root/root.crt -days 36500 -config ../openssl.cnf
輸入上一步密鑰的密碼 , 然后填寫要簽名的各個項目 (直接回車使用默認信息, 輸入`.`(英文句號)此項留空不填信息)
至此,自簽名證書就生成好了.
c.創建要頒發證書時要用到的文件和文件夾 (這些 都在 openssl.cnf 里配置的)
index.txt OpenSSL在創建自簽證書時會向該文件里寫下索引
database.txt OpenSSL會模擬數據庫將一些敏感信息寫在該文件里
serial.txt 創建該文件后,請編輯在第一行寫下 01
new_certs 文件夾,openssl 自動備份簽發的證書的文件夾
三、創建中間CA證書
創建 ca 文件夾, 重復上面的操作.
這里仍然需要將創建root CA用的配置文件拷貝到中間CA證書目錄下,該配置文件在生成CSR文件和以后簽發client文件時都要用到
1.創建私鑰
openssl genrsa -des3 -out ca/private.pem 2048
輸入保護密鑰的密碼
2.創建自簽名證書
openssl req -new -x509 -key ca/private.pem -out ca/cert.crt -config openssl.cnf
密鑰的密碼 , 填寫要簽名的各個項目 (直接回車使用默認信息, 輸入`.`(英文句號)此項留空不填信息
"A challenge password" 不用填,
"An optional company name" 可以填一下.
要注意的是, 這些字段要與root證書一樣,不然不能通過:
stateOrProvinceName 州或省名
organizationName 組織單位名稱
3.用 root 證書對證書請求文件簽名
openssl ca -ss_cert ca/cert.crt -cert root/root.crt -keyfile root/private.pem -out ca/cacert.crt -config openssl.cnf
openssl x509 -req -in ca/cert.csr -CA root/root.crt -CAkey root/private.pem -out ca/cacert.crt -days 3650 -set_serial 03 -extfile v3.ext
openssl ca -in ca/cert.csr -cert root/root.crt -keyfile root/private.pem -out ca/cacert.crt -extensions v3_ca -notext -md sha256 -config openssl.cnf
最后把 root CA 的證書 和 中間CA證書 合並, (就是 簡單的放到一個文件中就行了)
copy ca\cacert.crt + root\root.crt ca_chain.crt
https 握手, 服務器會先驗證證書中的第一個, 無法驗證信任就會驗證其上一級(就是證書里面的第二個)第二個無法驗證就繼續驗證第三個...直到root證書,如果root證書可信任, 這個證書鏈就是可信任的了
四、頒發證書
頒發證書之前, 被頒發的證書需要 生成自己的私鑰和證書請求文件
1.生成域名的私鑰
openssl genrsa -out mydomain.key 2048
2.用此私鑰生成證書請求文件
openssl req -new -key mydomain.pem -out mydomain.csr -days 365 -config openssl.cnf
填寫請求簽名的信息
Common Name 可以填寫域名('xxx.com' 或'*.xxx.com'等), 就是頒發域名證書了
3.也可以用一條命令同時生成私鑰和證書請求文件
openssl req -new -keyout mydomain.pem -out mydomain.csr -config openssl.cnf
同樣需要填寫信息
3.查看證書請求內容
openssl req -in client.req -noout -text -subject
4.使用CA證書對證書請求文件簽名,生成頒發的證書
openssl ca -in mydomain.csr -cert ca/cacert.pem -keyfile ca/cakey.pem -out mydomain.crt -config openssl.cnf
將私鑰和證書轉換成 .pfx 格式(iis等使用)
openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx
五、附配置

################################################################ # openssl example configuration file. # This is mostly used for generation of certificate requests. ################################################################# [default] # The default ca section name = root # 自定義變量(可以放在開頭也可以放在中間), 使用方式: $name , ${name} default_ca = CA_default name_opt = CA_default cert_opt = CA_default ################################################################# [ CA_default ] dir=. # 自定義變量(可以放在開頭也可以放在中間), 使用方式: $dir , ${dir} # 這是第一個openssl目錄結構中的目錄 certs=$dir # Where the issued certs are kept(已頒發的證書路徑,即CA或自簽的) # 這是第二個openssl目錄結構中的目錄,但非必須 crl_dir= $dir/crl # Where the issued crl are kept(已頒發的crl存放目錄) # 這是第三個openssl目錄結構中的目錄 database= $dir/index.txt # database index file #unique_subject = no # 設置為yes則database文件中的subject列不能出現重復值 # 即不能為subject相同的證書或證書請求簽名 # 建議設置為no,但為了保持老版本的兼容性默認是yes new_certs_dir= $dir/new_certs # default place for new certs(將來頒發的證書存放路徑) # 這是第四個openssl目錄結構中的目錄 serial= $dir/serial.txt # The current serial number(提供序列號的文件,如:創建收輸入`01`) crl= $dir/crl.pem # The current CRL當前crl序列號) private_key= $dir/CA/private.key # The private key(簽名時需要的私鑰,即CA自己的私鑰) certificate=$dir/CA/$name # The CA certificate(CA自己的證書文件) RANDFILE= $dir/.rand # private random number file(提供隨機數種子的文件) x509_extensions = usr_cert # The extentions to add to the cert(添加到證書中的擴展項) ## 以下兩行是關於證書展示格式的,雖非必須項,但推薦設置。一般就如下格式不用修改 name_opt = ca_default # Subject Name options cert_opt = ca_default # Certificate field options ## 以下是copy_extensions擴展項,需謹慎使用 # copy_extensions = copy # 生成證書時擴展項的copy行為,可設置為none/copy/copyall # 不設置該name時默認為none # 建議簡單使用時設置為none或不設置,且強烈建議不要設置為copyall # crl_extensions = crl_ext default_days= 3650 # how long to certify for(默認的證書有效期) default_crl_days= 30 # how long before next CRL(CRL的有效期) default_md= sha256 # which message digest to use(默認摘要算法) preserve= no # keep passed DN ordering(Distinguished Name順序,一般設置為no # 設置為yes僅為了和老版本的IE兼容 # A few different ways of specifying how closely the request should # conform to the details of the CA policy= policy_match # For the CA policy(證書匹配策略,此處表示引用[ policy_match ]的策略) [ policy_match ] countryName= match # match 表示請求中填寫的該字段信息要和CA證書中的匹配 stateOrProvinceName= optional organizationName= optional organizationalUnitName= optional # optional表示該字段信息可提供可不提供 commonName= supplied # supplied表示該字段信息必須提供 emailAddress= optional # For the `anything' policy # At this point in time, you must list all acceptable `object' # types # 以下是沒被引用的策略擴展,只要是沒被引用的都是被忽略的 [ policy_anything ] countryName = optional stateOrProvinceName= optional localityName= optional organizationName = optional organizationalUnitName = optional commonName= supplied emailAddress= optional # 以下是添加的擴展項usr_cert的內容*/ [ usr_cert ] basicConstraints=critical,CA:TRUE,pathlen:2 # 基本約束,CA:FALSE表示頒發的證書不能作為CA證書,即不能給其他人頒發證書 keyUsage = critical,keyCertSign,cRLSign,digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment # 指定證書的目的,也就是限制證書的用法用途 #subjectAltName=email:copy,email:my@other.address #這個參數很重要,現在被很多地方用來簽署多域名證書,但它除了DNS,還可指定email, IP,DN等 ## 除了上面兩個擴展項可能會修改下,其余的擴展項別管了,如下面的 nsComment = "OpenSSL Generated Certificate" subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer ## req相關的段 [ req ] default_bits = 2048 # 生成證書請求時用到的私鑰的密鑰長度 default_md = sha256 # 證書請求簽名時的單向加密算法 default_keyfile= privkey.pem # 默認新創建的私鑰存放位置, # 如-new選項沒指定-key時會自動創建私鑰 # -newkey選項也會自動創建私鑰 distinguished_name = req_distinguished_name # 可識別的字段名(常被簡稱為DN) # 引用req_distinguished_name段的設置 x509_extensions = v3_ca # 加入到自簽證書中的擴展項 #req_extensions = v3_req # 加入到證書請求中的擴展項 attributes = req_attributes # 證書請求的屬性,引用req_attributes段的設置,可以不設置它 encrypt_key = no # 自動生成的私鑰文件要加密否?一般設置no,和-nodes選項等價 ## 輸入和輸出私鑰文件的密碼,如果該私鑰文件有密碼,不寫該設置則會提示輸入 #input_password = secret #output_password = secret #prompt = yes | no # 設置為no將不提示輸入DN field,而是直接從配置文件中讀取,需要同時設置DN默認值,否則創建證書請求時將出錯 utf8 = yes string_mask = utf8only [ req_distinguished_name ] ## 以下項均可指定可不指定,但ca段的policy中指定為match和supplied一定要指定 ## 以下選項都可以自定義,如countryName = C,commonName = CN countryName= 國名(C)(2個字母代碼) # 國家名(C) countryName_default = "CN" # 默認的國家名 countryName_min= 2 # 填寫的國家名的最小字符長度 countryName_max = 2 # 填寫的國家名的最大字符長度 stateOrProvinceName= 省/州名(S)(全名) # 省份(S) stateOrProvinceName_default = "SH" localityName = 城市/地點名稱(LT) # 城市(LT) localityName_default = "SH" organizationName = 公司/組織名稱(ON) # 公司(ON) organizationName_default = "Foxcall" organizationalUnitName = 部門/單位名稱(OU) # 部門(OU) organizationalUnitName_default = "Foxcall" ## 以下的commonName(CN)一般必須給,如果作為CA,那么需要在ca的policy中定義CN = supplied ## CN定義的是將要申請SSL證書的域名或子域名或主機名。 ## 例如要為zhonghua.com申請ssl證書則填寫zhonghua.com,而不能填寫www.zhonghua.com ## 要為www.zhonghua.com申請SSL則填寫www.zhonghua.com ## CN必須和將要訪問的網站地址一樣,否則訪問時就會給出警告 ## 該項要填寫正確,否則該請求被簽名后證書中的CN與實際環境中的CN不對應,將無法提供證書服務 commonName = 域名/主機名稱(CN) # 主機名(CN) commonName_max = 64 commonName_default = "Foxcall" emailAddress = 電子郵件地址(E) # Email地址,很多時候不需要該項 emailAddress_max = 40 emailAddress_default = "foxcall@foxcallcrm.com" [ req_attributes ] # 該段是為了某些特定軟件的運行需要而設定的 # 現在一般都不需要提供challengepassword # 所以該段幾乎用不上 # 所以不用管這段 challengePassword = A challenge password challengePassword_min = 4 challengePassword_max = 20 unstructuredName = An optional company name [ v3_req ] ## Extensions to add to a certificate request basicConstraints = critical,CA:true keyUsage = critical,keyCertSign,cRLSign # nonRepudiation, digitalSignature, keyEncipherment subjectKeyIdentifier=hash [ v3_ca ] ## Extensions for a typical CA subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer basicConstraints = CA:true keyUsage = cRLSign, keyCertSign # 典型的CA證書的使用方法設置,由於測試使用所以注釋了 # 如果真的需要申請為CA, 么該設置可以如此配置
好了, 做個記錄
---恢復內容開始---
一、介紹
企業自用, 到證書機構簽發證書的費用和時間等都可以省下.....
SSl證書的背景功用.......(省略萬字,不廢話)
可以參考:
二、創建CA根
1.創建 Root CA
創建 root 文件夾, 在root文件夾上級建立配置文件 openssl.cnf
a.創建 root 密鑰
命令:
openssl genrsa -des3 -out root/private.pem 4096
然后要輸入 密碼, 用以保護 私鑰.
b.創建自簽名證書
命令:
openssl req -x509 -new -key root/private.pem -out root/root.crt -days 36500 -config ../openssl.cnf
輸入上一步密鑰的密碼 , 然后填寫要簽名的各個項目 (直接回車使用默認信息, 輸入`.`(英文句號)此項留空不填信息)
至此,自簽名證書就生成好了.
c.創建要頒發證書時要用到的文件和文件夾 (這些 都在 openssl.cnf 里配置的)
index.txt OpenSSL在創建自簽證書時會向該文件里寫下索引
database.txt OpenSSL會模擬數據庫將一些敏感信息寫在該文件里
serial.txt 創建該文件后,請編輯在第一行寫下 01
new_certs 文件夾,openssl 自動備份簽發的證書的文件夾
三、創建中間CA證書
創建 ca 文件夾, 重復上面的操作.
這里仍然需要將創建root CA用的配置文件拷貝到中間CA證書目錄下,該配置文件在生成CSR文件和以后簽發client文件時都要用到
1.創建私鑰
openssl genrsa -des3 -out ca/private.pem 2048
輸入保護密鑰的密碼
2.創建自簽名證書
openssl req -new -x509 -key ca/private.pem -out ca/cert.crt -config openssl.cnf
密鑰的密碼 , 填寫要簽名的各個項目 (直接回車使用默認信息, 輸入`.`(英文句號)此項留空不填信息
"A challenge password" 不用填,
"An optional company name" 可以填一下.
要注意的是, 這些字段要與root證書一樣,不然不能通過:
stateOrProvinceName 州或省名
organizationName 組織單位名稱
3.用 root 證書對證書請求文件簽名
openssl ca -ss_cert ca/cert.crt -cert root/root.crt -keyfile root/private.pem -out ca/cacert.crt -config openssl.cnf
openssl x509 -req -in ca/cert.csr -CA root/root.crt -CAkey root/private.pem -out ca/cacert.crt -days 3650 -set_serial 03 -extfile v3.ext
openssl ca -in ca/cert.csr -cert root/root.crt -keyfile root/private.pem -out ca/cacert.crt -extensions v3_ca -notext -md sha256 -config openssl.cnf
最后把 root CA 的證書 和 中間CA證書 合並, (就是 簡單的放到一個文件中就行了)
copy ca\cacert.crt + root\root.crt ca_chain.crt
https 握手, 服務器會先驗證證書中的第一個, 無法驗證信任就會驗證其上一級(就是證書里面的第二個)第二個無法驗證就繼續驗證第三個...直到root證書,如果root證書可信任, 這個證書鏈就是可信任的了
四、頒發證書
頒發證書之前, 被頒發的證書需要 生成自己的私鑰和證書請求文件
1.生成域名的私鑰
openssl genrsa -out mydomain.key 2048
2.用此私鑰生成證書請求文件
openssl req -new -key mydomain.pem -out mydomain.csr -days 365 -config openssl.cnf
填寫請求簽名的信息
Common Name 可以填寫域名('xxx.com' 或'*.xxx.com'等), 就是頒發域名證書了
3.也可以用一條命令同時生成私鑰和證書請求文件
openssl req -new -keyout mydomain.pem -out mydomain.csr -config openssl.cnf
同樣需要填寫信息
3.查看證書請求內容
openssl req -in client.req -noout -text -subject
4.使用CA證書對證書請求文件簽名,生成頒發的證書
openssl ca -in mydomain.csr -cert ca/cacert.pem -keyfile ca/cakey.pem -out mydomain.crt -config openssl.cnf
將私鑰和證書轉換成 .pfx 格式(iis等使用)
openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx
五、附配置

################################################################ # openssl example configuration file. # This is mostly used for generation of certificate requests. ################################################################# [default] # The default ca section name = root # 自定義變量(可以放在開頭也可以放在中間), 使用方式: $name , ${name} default_ca = CA_default name_opt = CA_default cert_opt = CA_default ################################################################# [ CA_default ] dir=. # 自定義變量(可以放在開頭也可以放在中間), 使用方式: $dir , ${dir} # 這是第一個openssl目錄結構中的目錄 certs=$dir # Where the issued certs are kept(已頒發的證書路徑,即CA或自簽的) # 這是第二個openssl目錄結構中的目錄,但非必須 crl_dir= $dir/crl # Where the issued crl are kept(已頒發的crl存放目錄) # 這是第三個openssl目錄結構中的目錄 database= $dir/index.txt # database index file #unique_subject = no # 設置為yes則database文件中的subject列不能出現重復值 # 即不能為subject相同的證書或證書請求簽名 # 建議設置為no,但為了保持老版本的兼容性默認是yes new_certs_dir= $dir/new_certs # default place for new certs(將來頒發的證書存放路徑) # 這是第四個openssl目錄結構中的目錄 serial= $dir/serial.txt # The current serial number(提供序列號的文件,如:創建收輸入`01`) crl= $dir/crl.pem # The current CRL當前crl序列號) private_key= $dir/CA/private.key # The private key(簽名時需要的私鑰,即CA自己的私鑰) certificate=$dir/CA/$name # The CA certificate(CA自己的證書文件) RANDFILE= $dir/.rand # private random number file(提供隨機數種子的文件) x509_extensions = usr_cert # The extentions to add to the cert(添加到證書中的擴展項) ## 以下兩行是關於證書展示格式的,雖非必須項,但推薦設置。一般就如下格式不用修改 name_opt = ca_default # Subject Name options cert_opt = ca_default # Certificate field options ## 以下是copy_extensions擴展項,需謹慎使用 # copy_extensions = copy # 生成證書時擴展項的copy行為,可設置為none/copy/copyall # 不設置該name時默認為none # 建議簡單使用時設置為none或不設置,且強烈建議不要設置為copyall # crl_extensions = crl_ext default_days= 3650 # how long to certify for(默認的證書有效期) default_crl_days= 30 # how long before next CRL(CRL的有效期) default_md= sha256 # which message digest to use(默認摘要算法) preserve= no # keep passed DN ordering(Distinguished Name順序,一般設置為no # 設置為yes僅為了和老版本的IE兼容 # A few different ways of specifying how closely the request should # conform to the details of the CA policy= policy_match # For the CA policy(證書匹配策略,此處表示引用[ policy_match ]的策略) [ policy_match ] countryName= match # match 表示請求中填寫的該字段信息要和CA證書中的匹配 stateOrProvinceName= optional organizationName= optional organizationalUnitName= optional # optional表示該字段信息可提供可不提供 commonName= supplied # supplied表示該字段信息必須提供 emailAddress= optional # For the `anything' policy # At this point in time, you must list all acceptable `object' # types # 以下是沒被引用的策略擴展,只要是沒被引用的都是被忽略的 [ policy_anything ] countryName = optional stateOrProvinceName= optional localityName= optional organizationName = optional organizationalUnitName = optional commonName= supplied emailAddress= optional # 以下是添加的擴展項usr_cert的內容*/ [ usr_cert ] basicConstraints=critical,CA:TRUE,pathlen:2 # 基本約束,CA:FALSE表示頒發的證書不能作為CA證書,即不能給其他人頒發證書 keyUsage = critical,keyCertSign,cRLSign,digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment # 指定證書的目的,也就是限制證書的用法用途 #subjectAltName=email:copy,email:my@other.address #這個參數很重要,現在被很多地方用來簽署多域名證書,但它除了DNS,還可指定email, IP,DN等 ## 除了上面兩個擴展項可能會修改下,其余的擴展項別管了,如下面的 nsComment = "OpenSSL Generated Certificate" subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer ## req相關的段 [ req ] default_bits = 2048 # 生成證書請求時用到的私鑰的密鑰長度 default_md = sha256 # 證書請求簽名時的單向加密算法 default_keyfile= privkey.pem # 默認新創建的私鑰存放位置, # 如-new選項沒指定-key時會自動創建私鑰 # -newkey選項也會自動創建私鑰 distinguished_name = req_distinguished_name # 可識別的字段名(常被簡稱為DN) # 引用req_distinguished_name段的設置 x509_extensions = v3_ca # 加入到自簽證書中的擴展項 #req_extensions = v3_req # 加入到證書請求中的擴展項 attributes = req_attributes # 證書請求的屬性,引用req_attributes段的設置,可以不設置它 encrypt_key = no # 自動生成的私鑰文件要加密否?一般設置no,和-nodes選項等價 ## 輸入和輸出私鑰文件的密碼,如果該私鑰文件有密碼,不寫該設置則會提示輸入 #input_password = secret #output_password = secret #prompt = yes | no # 設置為no將不提示輸入DN field,而是直接從配置文件中讀取,需要同時設置DN默認值,否則創建證書請求時將出錯 utf8 = yes string_mask = utf8only [ req_distinguished_name ] ## 以下項均可指定可不指定,但ca段的policy中指定為match和supplied一定要指定 ## 以下選項都可以自定義,如countryName = C,commonName = CN countryName= 國名(C)(2個字母代碼) # 國家名(C) countryName_default = "CN" # 默認的國家名 countryName_min= 2 # 填寫的國家名的最小字符長度 countryName_max = 2 # 填寫的國家名的最大字符長度 stateOrProvinceName= 省/州名(S)(全名) # 省份(S) stateOrProvinceName_default = "SH" localityName = 城市/地點名稱(LT) # 城市(LT) localityName_default = "SH" organizationName = 公司/組織名稱(ON) # 公司(ON) organizationName_default = "Foxcall" organizationalUnitName = 部門/單位名稱(OU) # 部門(OU) organizationalUnitName_default = "Foxcall" ## 以下的commonName(CN)一般必須給,如果作為CA,那么需要在ca的policy中定義CN = supplied ## CN定義的是將要申請SSL證書的域名或子域名或主機名。 ## 例如要為zhonghua.com申請ssl證書則填寫zhonghua.com,而不能填寫www.zhonghua.com ## 要為www.zhonghua.com申請SSL則填寫www.zhonghua.com ## CN必須和將要訪問的網站地址一樣,否則訪問時就會給出警告 ## 該項要填寫正確,否則該請求被簽名后證書中的CN與實際環境中的CN不對應,將無法提供證書服務 commonName = 域名/主機名稱(CN) # 主機名(CN) commonName_max = 64 commonName_default = "Foxcall" emailAddress = 電子郵件地址(E) # Email地址,很多時候不需要該項 emailAddress_max = 40 emailAddress_default = "foxcall@foxcallcrm.com" [ req_attributes ] # 該段是為了某些特定軟件的運行需要而設定的 # 現在一般都不需要提供challengepassword # 所以該段幾乎用不上 # 所以不用管這段 challengePassword = A challenge password challengePassword_min = 4 challengePassword_max = 20 unstructuredName = An optional company name [ v3_req ] ## Extensions to add to a certificate request basicConstraints = critical,CA:true keyUsage = critical,keyCertSign,cRLSign # nonRepudiation, digitalSignature, keyEncipherment subjectKeyIdentifier=hash [ v3_ca ] ## Extensions for a typical CA subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer basicConstraints = CA:true keyUsage = cRLSign, keyCertSign # 典型的CA證書的使用方法設置,由於測試使用所以注釋了 # 如果真的需要申請為CA, 么該設置可以如此配置
好了, 做個記錄