---恢復內容開始---html
企業自用, 到證書機構簽發證書的費用和時間等均可以省下.....node
SSl證書的背景功用.......(省略萬字,不廢話)git
能夠參考:github
SSL證書_百度百科 算法
X509 證書詳解 數據庫
★【OpenSSL】建立證書 ★ dom
★利用CA私鑰和證書建立中間CA★ 工具
開源的可視化管理工具 :)
https://github.com/chris2511/xca
建立 root 文件夾, 在root文件夾上級創建配置文件 openssl.cnf
命令:
openssl genrsa -des3 -out root/private.pem 4096
而後要輸入 密碼, 用以保護 私鑰.
命令:
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 文件夾, 重複上面的操做.
這裏仍然須要將建立root CA用的配置文件拷貝到中間CA證書目錄下,該配置文件在生成CSR文件和之後簽發client文件時都要用到
openssl genrsa -des3 -out ca/private.pem 2048
輸入保護密鑰的密碼
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 組織單位名稱
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證書可信任, 這個證書鏈就是可信任的了
頒發證書以前, 被頒發的證書須要 生成本身的私鑰和證書請求文件
openssl genrsa -out mydomain.key 2048
openssl req -new -key mydomain.pem -out mydomain.csr -days 365 -config openssl.cnf
填寫請求籤名的信息
Common Name 能夠填寫域名('xxx.com' 或'*.xxx.com'等), 就是頒發域名證書了
openssl req -new -keyout mydomain.pem -out mydomain.csr -config openssl.cnf
一樣須要填寫信息
openssl req -in client.req -noout -text -subject
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證書的背景功用.......(省略萬字,不廢話)
能夠參考:
建立 root 文件夾, 在root文件夾上級創建配置文件 openssl.cnf
命令:
openssl genrsa -des3 -out root/private.pem 4096
而後要輸入 密碼, 用以保護 私鑰.
命令:
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 文件夾, 重複上面的操做.
這裏仍然須要將建立root CA用的配置文件拷貝到中間CA證書目錄下,該配置文件在生成CSR文件和之後簽發client文件時都要用到
openssl genrsa -des3 -out ca/private.pem 2048
輸入保護密鑰的密碼
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 組織單位名稱
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證書可信任, 這個證書鏈就是可信任的了
頒發證書以前, 被頒發的證書須要 生成本身的私鑰和證書請求文件
openssl genrsa -out mydomain.key 2048
openssl req -new -key mydomain.pem -out mydomain.csr -days 365 -config openssl.cnf
填寫請求籤名的信息
Common Name 能夠填寫域名('xxx.com' 或'*.xxx.com'等), 就是頒發域名證書了
openssl req -new -keyout mydomain.pem -out mydomain.csr -config openssl.cnf
一樣須要填寫信息
openssl req -in client.req -noout -text -subject
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, 麼該設置能夠如此配置
好了, 作個記錄