使用OpenSSL生成多域名自簽名證書進行HTTPS開發調試

OpenSSL 信息安全 Chrome 網景 堆棧HeapStack 2017-04-30

證書生成過程介紹

證書的目的是建立特定密鑰對與特定實體之間的聯繫。
自簽名根證書是指一堆密鑰對的私鑰對自己相應的公鑰生成的證書請求進行簽名而頒發的證書,證書的申請人和簽發人都是同一個。

  • 需要一對密鑰對;
    • 常用的是RSA,DSA密鑰,ECDSA密鑰,用於密鑰交換的證書不能用DSA,只能用RSA,因為DSA不能加解密也不能做密鑰交換,只能做簽名;ECDSA還沒有被大部分的CA支持;
    • 生成密鑰可以使用OpenSSL的genrsagendsa指令,也可以使用req指令;
  • 證書認證請求文件(csr文件)
    • 這是按照一定格式生成的文件,裡面包含實體信息
    • 將實體信息和公鑰一起用相應的私鑰簽名,是CA(證書認證)能確認這些信息是用戶發送的(證書請求中的公鑰拿出來驗證這個證書請求的簽名)
    • 通過OpenSSL的req指令填寫和生成這個csr文件
    • 不同的CA要求,可能需要更改默認的配置文件openssl.cnf
  • 將證書請求文件(csr文件)給CA簽發
    • 驗證證書請求上的簽名是否正確,確保公鑰對應的私鑰就在申請者手中並且申請信息是正確沒被更改的
    • CA對某些字段信息可能有特殊的要求,比如要求國家,身份等信息要求跟CA本身設定的一樣
    • 如果CA是在OpenSSL指令的基礎上,那麼它使用的簽發指令可能是ca,也可能是x509

      常用指令

      req 指令

      req指令既可以直接生成一個新的自簽名證書,也可以根據現有的證書請求和其相應私鑰生成自簽名根證書。如果是根據現有證書請求生成自簽名根證書,那麼一定要-key選項指定相應的私鑰指令才能執行成功。
      req 指令也可以生成密鑰對,但在使用req 同時生成密鑰對是對密鑰對保存和格式有限制(只能是PEM編碼,DES3-CBC模式加密)。如果需要更靈活的處理,可以使用genrsa或者gendsa先生成密鑰然後使用-key選項指定。

      參數選項

  • -new 指定執行生成新的證書請求,此時會忽略-in 指定的內容
  • -x509 根據現有的證書請求生成自簽名根證書(要求使用-key指定證書請求裡面的公鑰相應的私鑰,以便對自簽名根證書進行簽名)
  • -key 指定輸入的密鑰,如果不指定此選項會根據-newkey選項的參數生成密鑰對
  • -newkey 指定生成一個新的密鑰對,只有在沒有-key 選項的時候才生效,參數形式為rsa:numbits 或者 dsa:file
  • -subj直接從指令行指定證書請求的主體名稱,格式為/分割的鍵值對字符串,如果沒有此選項,那麼會彈出交互提示;
  • -days 設定了生成的自簽名根證書的有效期,單位為天;該選項只有在使用了-x509選項生成自簽名證書的時候才生效,默認為30天。
  • -config 指定req指令在生成證書請求的時候使用的OpenSSL配置文件,一般默認為openssl.cnf
  • -extensions 選項指定了生成自簽名根證書的時候使用的擴展字段,其參數為OpenSSL配置文件中的某個字段名
  • -reqexts 選項指定了生成證書請求是使用的擴展字段,該字段參數也是配置文件中的某個字段名
  • -text 讓指令輸出證書請求或者自簽名根證書內容的明文解析,默認情況下,它將輸出所有可能輸出的內容,如果使用了reqopt選項,則輸出內容取決於reqopt選項
  • -reqopt 指定text 選項輸出的內容,可以為多個,每個之間使用,分隔
  • set_serial指定生成的自簽名根證書的序列號,默認情況下生成的自簽名根證書序列號是0;該選項也只有在生成自簽名根證書的時候有效。
  • -keyout 置頂新生成的私鑰的輸出(僅在使用了-newKey-new 選項導致生成新密鑰對的時候才有效,如果使用了-key則此選項被忽略)
  • -keyform 指定輸入密鑰的編碼格式(比如PEM,DER,PKCS#12,Netscape,IIS SGC,Engine等)
  • -in 指定輸入證書請求文件,如果使用了-new 或者 -newkey選項,此選項被忽略
  • -inform 指定輸入證書請求文件的編碼格式(比如PEM,DER)
  • -out 指定輸出證書請求文件或自簽名證書文件
  • -noout 使用此選項後,指令將不會輸出編碼的證書請求或者自簽名根證書到-out選項指定的文件中,一般用來測試指令或者查看證書請求的信息
  • -outform 指定輸出證書請求文件或自簽名證書的編碼格式(比如PEM,DER)
  • -pubkey 使用此選項活 指令將輸出PEM編碼的公鑰到-out選擇指定的文件中,默認情況下只輸出私鑰到-keyout指定的文件,並不輸出公鑰。
  • -passin 指定讀取-key 選項指定的私鑰所需要的解密口令,如果沒有指定,私鑰又有密鑰的話,會彈出交互提示
  • -passout 指定-keyout 選項輸出私鑰時使用的加密口令
  • -nodes 表示不對私鑰進行加密,如果指定此選項,則忽略-passout指定的口令;如果沒有此選項,卻指定了-passout則會有交互提示。
  • -digest 指定生成證書請求或者自簽名根證書是使用的信息摘要算法,一般在生成數字簽名的時候使用。
  • -verify 使用此選項對證書請求中的數字簽名進行驗證操作,並給出失敗或者成功的提示信息,其驗證的過程是從證書請求裡面提取公鑰,然後使用該公鑰對證書請求的數字簽名進行驗證。
  • 如果沒有-key選項也沒有-newkey選項,則會根據openssl.cnfreq字段的default_bits選項的參數,生成一個RSA密鑰
  • 如果沒有使用-nodes選項,並且生成了新的私鑰,私鑰會被輸出到-keyout指定的文件中時將被以DES3的CBC模式加密。

    使用實例

  • 生成一個新的證書請求,使用新的rsa2048位密鑰,輸出證書請求到request.pem,密鑰到private.pem,私鑰口令為12345678
    openssl req -new -newkey rsa:2048 -keyout private.pem -passout pass:12345678 -out request.pem
  • 對證書請求籤名進行驗證
    openssl req -in request.pe -verify -noout
  • 生成一個自簽名的根證書
    openssl req -x509 -newkey rsa:2048 -keyout private.pem -passout pass:12345678 -out selfsign.crt
  • 顯示證書請求內容
    openssl req -text -in fd.csr -noout

    ca 指令

    ca指令模擬一個完整的CA服務器,它包括簽發用戶證書,吊銷證書,產生CRL及更新證書庫等管理操作

    參數選項

  • -config 指定要使用的配置文件,如果沒有此選項,則會先查找OPENSSL_CONF或者SSLEAY_CONF定義的文件名,如果這兩個環境變量都沒有定義,就使用OpenSSL安裝的默認路徑,一般是/usr/local/openssl/openssl.cnf,具體看安裝配置
  • -startdate 設置證書的生效時間 格式為YYMMDDHHMMSSZ指定年月日時分秒,如果沒有則使用主配置文件中的default_startdate
  • -enddate 格式跟-startdate一樣
  • -days 設置證書的有效天數,生效時間到到期時間之間的天數,如果使用了-enddate,此選項被忽略
  • -name 指定配置文件中CA選項的名稱
  • -notext 不輸出明文信息到證書文件
  • -subj直接從指令行指定證書請求的主體名稱,格式為/分割的鍵值對字符串,如果沒有此選項,那麼會彈出交互提示;
  • -cert 參數是一個可以包含路徑的文件名,該文件是一個PEM編碼的X.509證書文件
  • -keyfile 參數是一個包含路徑的文件名,文件格式可以為PEM,DER,PKCS#12,Netscape,IIS SGC,Engine,但需要通過-keyform指定到底是哪種格式
  • -policy 指定CA的匹配策略
  • -extensions 指定x509 v3擴展字段的字段名,如果沒有這個選項就由-extfile中內容
  • -extfile 指定x509 v3擴展的配置文件,如果沒有-extensions字段,則由CA主配置文件中的x509_extensions選項指定
  • -in 指定一個可以包含路徑的證書請求文件名,應該是PEM變得PKCS#10格式的證書請求
  • -infiles指定一系列包含PEM編碼證書請求的文件,包含多個,只能作為指令的最後一個選項,其後的參數都被認為是證書請求文件
  • -out 選項指定了輸出簽發好的證書或者新生成的CRL的文件,如果沒有使用-notext選項,那麼證書的明文信息也會輸出到-out選項指定的文件中
  • -outdir選項指定了新生成的證書的輸出目錄,默認輸出到newecerts目錄,並使用.pem作為後綴,都是PEM編碼。

    x509

    x509指令能已各種方式顯示一個證書的內容,也可以對一個證書的格式進行轉換,還可以簽發證書

    參數選項

  • -in
  • -inform
  • -out
  • -outform
  • -keyform
  • -CA 指定簽發證書或者轉換證書格式的時候需要的CA證書文件
  • -CAkey 指定簽發證書或者轉換證書格式時需要的CA證書對應的私鑰文件路徑
  • -CAform 指定CA證書文件的格式
  • -CAkeyform 私鑰文件格式
  • -startdate
  • -enddate
  • -pubkey
  • -noout

    使用實例

  • 使用現有證書生成證書請求文件
    openssl x509 -x509toreq -in fd.crt -out fd.csr -signkey fd.key
  • 使用證書請求文件生成自簽名證書
    openssl x509 -req -days 365 -in fd.csr -signkey fd.key -out fd.crt
  • 顯示證書內容
    openssl x509 -text -in fd.crt -noout

    crl指令

    crl指令用於顯示、處理和驗證CRL文件信息

    參數選項

  • -in
  • -inform
  • -out
  • -outform
  • -noout

    開發測試使用自簽名證書實例

    生成認證私鑰 私鑰 私鑰

    要輸入密碼
    openssl genrsa -des3 -out qunarzz-dev-enc.key 2048
    可以通過如下方式解密(輸入上面的密碼)
    openssl rsa -in qunarzz-dev-enc.key -out qunarzz-dev.key

    生成帶有SAN(Subject Alt Name)的自簽名證書

    生成對多個主機有效的自簽名證書

    missing_subjectAltName 問題解決

    原有的簡單自簽名證書在chrome裡面不好使了,提示 missing_subjectAltName
    需要全局找一份openssl.cnf ,或者下載一份openssl 那裡有
    openssl req -new -sha256 \
     -x509 \
     -days 10000 \
     -key qunarzz-dev.key \
     -subj "/C=CN/ST=BeiJing/L=Beijing/O=QUNAR/OU=FE/CN=qunarzz.com" \
     -extensions SAN \
     -config <(cat ./openssl.cnf \
     <(printf "[SAN]\nsubjectAltName=DNS.1:qunarzz.com,DNS.2:q.qunarzz.com,DNS.3:*.qunarzz.com")) \
     -out qunarzz-dev.crt
    相關字段的信息
    C => 國家 Country 
    ST => 省 State
    L => 市 City
    O => 機構 Organization
    OU => 部門 Organization Unit
    CN => 域名 Common Name (證書所請求的域名)
    emailAddress => main administrative point of contact for the certificate

    參考資料

  1. 《OpenSSL與網絡信息安全-基礎、結構和指令》
  2. 《OpenSSL攻略》
  3. 《OpenSSL編程》
  4. OpenSSL官方命令文檔

相關推薦

推薦中...